웹사이트 검색

Rocky Linux 8/AlmaLinux 8에 Docker 레지스트리 설정하기


Docker 레지스트리는 다양한 태그가 지정된 버전으로 제공되는 이름 있는 Docker 이미지를 저장하고 콘텐츠를 전달하는 시스템입니다. Docker를 사용하는 사용자는 docker push 및 docker pull 명령어를 사용하여 레지스트리와 상호작용합니다. 때때로 Docker 이미지를 Docker Hub에 푸시하는 대신 로컬 레지스트리에 저장하는 것이 더 합리적일 수 있습니다. 이 가이드에서는 Let’s Encrypt SSL 인증서로 보호된 Rocky/AlmaLinux 8에 개인 Docker 레지스트리를 설정하는 방법을 안내합니다.

대규모 팀의 경우 많은 대역폭을 절약할 수 있으며, 공개되지 않기를 원하는 이미지를 안전하게 보호할 수 있습니다. 로컬 도커 레지스트리를 만드는 것은 몇 가지 단계를 따르면 됩니다. 다양한 배포판에 Docker를 설치하는 방법은 '리눅스 시스템에 Docker CE 설치하기'를 참조하세요.

도커 엔진 설치

레지스트리 서비스를 실행하려면 Docker Engine이 필요합니다. 설치하기 전에 시스템을 업데이트하세요.

sudo yum -y update

아래 명령어를 실행하여 Docker CE를 설치하세요.

sudo curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 

그런 다음 Docker CE 패키지와 Compose 플러그인을 설치하세요.

sudo yum -y install docker-ce docker-ce-cli containerd.io

Docker를 비루트 사용자로 사용하고 싶다면, 이제 사용자를 "docker" 그룹에 추가하는 것을 고려해야 합니다.

sudo usermod -aG docker $USER
newgrp docker

아래 명령어를 실행하여 설치된 Docker 버전을 확인하세요.

$ docker --version
Docker version 26.1.3, build b72abbb

Docker 서비스를 시작하고 활성화합니다:

sudo systemctl enable --now docker

상태는 실행 중이어야 합니다:

 $ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-07-13 19:53:19 UTC; 4s ago
     Docs: https://docs.docker.com
 Main PID: 17832 (dockerd)
    Tasks: 7
   Memory: 30.4M
   CGroup: /system.slice/docker.service
           └─17832 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Starting Docker Application Container Engine...
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.316260221Z" level=info msg="Starting up"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.340012039Z" level=info msg="Loading containers: start."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.621507107Z" level=info msg="Loading containers: done."
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644692641Z" level=info msg="Docker daemon" commit=8e96db1 containerd-snapshotter=false storage-driver=overlay2 versio>
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.644783862Z" level=info msg="Daemon has completed initialization"
Jul 13 19:53:19 rocky8.cloudspinx.com dockerd[17832]: time="2024-07-13T19:53:19.671038318Z" level=info msg="API listen on /run/docker.sock"
Jul 13 19:53:19 rocky8.cloudspinx.com systemd[1]: Started Docker Application Container Engine.
[root@rocky8 ~]#

Let’s Encrypt SSL 인증서 생성

앞서 약속드린 대로 우리는 Rocky/AlmaLinux에서 실행 중인 Docker 레지스트리 설정을 보호하기 위해 Let’s Encrypt SSL 인증서를 사용할 것입니다.

Let’s Encrypt 인증서를 요청할 때 사용할 certbot 도구를 설치하세요.

sudo yum -y install epel-release
sudo yum -y install certbot

SSL 인증서 요청:

export DOMAIN="registry.domain.com"
export EMAIL="[email "
certbot certonly --standalone -d $DOMAIN --preferred-challenges http --agree-tos -n -m $EMAIL --keep-until-expiring

예상되는 인증서 생성 결과:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for registry.computingforgeeks.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/registry.computingforgeeks.com/privkey.pem
   Your cert will expire on 2021-07-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

인증서는 /etc/letsencrypt/live/ 아래에 저장됩니다

/etc/letsencrypt/live/registry.domain.com/fullchain.pem
/etc/letsencrypt/live/registry.domain.com/privkey.pem

장소 :

  • fullchain.pem ⇒ 결합된 파일 cert.pem 및 chain.pem
  • chain.pem ⇒ 중간 인증서
  • cert.pem ⇒ SSL 서버 인증서(공개 키 포함)
  • privkey.pem ⇒ 개인 키 파일

Rocky Linux/AlmaLinux 8에서 Docker 레지스트리 실행하기

Docker 레지스트리를 SSL을 사용해서 실행할 수도 있고, 사용하지 않고 실행할 수도 있습니다. 두 방법 중 어느 것으로든 Docker 레지스트리를 실행하는 방법을 보여드리겠습니다.

하지만 먼저, Docker 레지스트리 이미지를 저장할 디렉토리를 만들어야 합니다:

sudo mkdir /var/lib/docker/registry

SSL 없이 로컬 Docker 레지스트리 실행하기

docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

SSL을 사용하여 로컬 Docker 레지스트리 실행

디렉토리를 생성하고 인증서를 호스트에 배치하세요:

export DOMAIN="registry.domain.com"
mkdir /certs
sudo cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem /certs/fullchain.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/privkey.pem /certs/privkey.pem
sudo cp /etc/letsencrypt/live/$DOMAIN/cert.pem /certs/cert.pem

Docker 레지스트리 컨테이너를 생성하세요:

docker run -d --name docker-registry --restart=always \
-p 5000:5000 \
-e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem  \
-e REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem \
-v /certs:/certs \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2

registry.domain.com을(를) 자신의 레지스트리 하위 도메인 이름으로 교체하세요.

존재하지 않는 경우 registry:2 도커 이미지를 다운로드하고 컨테이너를 생성합니다

Unable to find image 'registry:2' locally
2: Pulling from library/registry
ddad3d7c1e96: Pull complete
6eda6749503f: Pull complete
363ab70c2143: Pull complete
5b94580856e6: Pull complete
12008541203a: Pull complete
Digest: sha256:bac2d7050dc4826516650267fe7dc6627e9e11ad653daca0641437abdf18df27
Status: Downloaded newer image for registry:2
ed960bd27529be26e7ef728027844a62b0731b08bafdbbf63dea328dac46e024

컨테이너 상태 확인:

# docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS          PORTS                                       NAMES
ed960bd27529   registry:2   "/entrypoint.sh /etc…"   28 seconds ago   Up 27 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   docker-registry

이미지를 레지스트리 컨테이너 서버에 푸시하려면 아래와 같이 설정하세요:

$ curl https://$DOMAIN:5000/v2/_catalog
{"repositories":[]}

SELinux가 활성화되어 있는 경우 포트 5000을 사용할 때 문제가 발생할 수 있으므로, 문제가 발생하면 SELinux를 비활성화하거나 퍼미시브 모드로 설정하는 것을 고려하세요.

firewalld가 활성화되어 실행 중인 경우 방화벽에서 포트를 허용하십시오.

sudo firewall-cmd --add-port=5000/tcp --permanent
sudo firewall-cmd --reload

Docker 엔진에 신뢰할 수 없는 레지스트리 추가

기본적으로 Docker는 Docker 레지스트리에 연결할 때 https를 사용합니다. 하지만 신뢰할 수 있는 네트워크에 있는 경우와 같이 보안이 필요하지 않은 레지스트리를 사용해야 하는 경우도 있을 수 있습니다. 이는 내부 사용을 위해 CA 인증서가 필요 없거나 모든 Docker 노드에서 자체 서명된 인증서를 신뢰할 필요를 없애줍니다. Docker 엔진에 보안이 없는(Insecure) 레지스트리를 추가하는 단계는 다음과 같습니다.

Ubuntu Xenial의 경우, /etc/docker/daemon.json 파일을 편집하고 키 “insecure-registries”를 업데이트합니다. 예를 들면 다음과 같습니다.

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

파일 /etc/docker/daemon.json을 수정하세요, 예를 들어.

{
 "insecure-registries" : ["registry.domain.com:5000"]
 }

Ubuntu Trusty에서는 파일 /etc/default/docker 를 편집하고 DOCKER_OPTS 를 업데이트하세요, 예를 들어

DOCKER_OPTS='--insecure-registry registry.domain.com:5000'

그런 다음 Docker 엔진을 다시 시작하세요

sudo systemctl restart docker

로컬 레지스트리에 Docker 이미지 푸시하기

레지스트리가 준비되었으므로 이제 도커 이미지를 푸시할 수 있습니다. 활성 DNS 서버가 없다면 /etc/hosts 파일을 사용하여 호스트 이름을 IP 주소에 매핑하세요.

$ sudo vim /etc/hosts
192.168.1.23 registry.domain.com

저는 Docker 허브에서 ubuntu 최신 도커 이미지를 다운로드하고 이를 제 로컬 Docker 레지스트리에 푸시할 것입니다.

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
345e3491a907: Pull complete
57671312ef6f: Pull complete
5e9250ddb7d0: Pull complete
Digest: sha256:cf31af331f38d1d7158470e095b132acd126a7180a54f263d386da88eb681d93
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

이미지에 registry.domain.com:5000/ubuntu 태그를 지정하세요. 이렇게 하면 기존 이미지에 추가 태그가 생성됩니다. 태그의 첫 부분이 호스트 이름과 포트일 경우, Docker는 푸시할 때 이를 레지스트리의 위치로 해석합니다.

docker tag ubuntu $DOMAIN:5000/ubuntu

이미지를 registry.domain.com:5000/ubuntu에서 실행 중인 로컬 레지스트리에 푸시하세요

$ docker push $DOMAIN:5000/ubuntu
Using default tag: latest
The push refers to repository [registry.domain.com:5000/ubuntu]
2f140462f3bc: Pushed
63c99163f472: Pushed
ccdbb80308cc: Pushed
latest: digest: sha256:86ac87f73641c920fb42cc9612d4fb57b5626b56ea2a19b894d0673fd5b4f2e9 size: 943

이미지 업로드가 성공하면 마지막에 sha256 해시를 확인할 수 있습니다. 푸시된 이미지는 /var/lib/registry/docker/registry/v2/repositories 디렉토리에 저장됩니다.

$ ls /var/lib/docker/registry/docker/registry/v2/repositories/
ubuntu

이것은 맞춤형 도커 이미지를 푸시할 때 사용할 동일한 방법입니다. 로컬 레지스트리에서 도커 이미지를 다운로드하려면 다음 명령어를 사용하세요:

$ docker pull registry-hostname:500/image:tag
#E.g
$ docker pull registry.domain.com:5000/ubuntu

다음 가이드에서는 HTTPS를 통해 저장소에 접근할 수 있도록 nginx 프록시를 설정하는 방법을 다룰 것입니다.

또한 Docker UI 관리자 설치 – Portainer를 살펴볼 수 있습니다