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 b72abbbDocker 서비스를 시작하고 활성화합니다:
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 certbotSSL 인증서 요청:
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/registrySSL 없이 로컬 Docker 레지스트리 실행하기
docker run -d -p 5000:5000 \
--name docker-registry \
--restart=always \
-v /var/lib/docker/registry:/var/lib/registry \
registry:2SSL을 사용하여 로컬 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.pemDocker 레지스트리 컨테이너를 생성하세요:
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:2registry.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 --reloadDocker 엔진에 신뢰할 수 없는 레지스트리 추가
기본적으로 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를 살펴볼 수 있습니다