컨테이너 레지스트리는 컨테이너 이미지를 기반으로 삽입하고 꺼내는 저장 каталог입니다.
개발자에게 많은 공개 또는 개인 레지스트리가 사용 가능하며 Docker Hub, Amazon ECR, Google Cloud Artifact Registry과 같이 사용 가능합니다. 그러나 외부 제조업체에 의존하지 않고 자신의 이미지를 호스트하고자 할 때가 있습니다. 이렇게 하면 컨테이너 이미지를 어디에 호스트하고 레지스트리의 구성을 어떻게 할지 더 많은 제어 权利을 얻을 수 있습니다.
이 記事은 컨테이너 레지스트리를 자신에게 托管하는 방법을 배우는 실습 튜토리얼입니다.
목차
이 문서를 이해하기 위해서는 Docker와 NGINX과 같은 도구에 대해 이미 孰悉하고, 컨테이너가 무엇인지 일반적인 이해가 있어야 합니다.
컨테이너 이미지는 무엇인가?
컨테이너 레지스트리에 대해 이야기하기 전에 컨테이너 이미지를 이해하는 것이 중요합니다. 간단하게 말하면, 컨테이너를 실행할 수 있는 모든 파일, 라이브러리, 및 configurations을 포함하는 패키지입니다. 이들은 层次에 组assets며, 각 层次는 파일 시스템 변경을 추가, 제거, 수정하는 一套의 것을 나타냅니다.
컨테이너 이미지를 만들기 가장 일반적인 방법은 Dockerfile을 사용하는 것입니다.
# 이미지 생성
docker build -t pliutau/hello-world:v0 .
# 로컬에서 이미지 확인
docker images
# REPOSITORY TAG IMAGE ID CREATED SIZE
# hello-world latest 9facd12bbcdd 22 seconds ago 11MB
이러한 컨테이너 이미지가 로컬 기기에 저장됩니다. 그러나 이 이미지를 다른 사용자들과 공유하거나 다른 기기에서 사용하고자 하면 어떻게 해야 하는지 생각하시나요? 이러한 이슈를 해결하는 것이 컨테이너 REGISTRY입니다.
컨테이너 REGISTRY이란?
컨테이너 REGISTRY은 컨테이너 이미지를 푸시하고 꺼내는 기능을 가진 저장소 каталог입니다. 이미지는 리포지토리로 그룹핑되며, 同名의 관련 이미지들을 포함하는 모음입니다. 예를 들어 Docker Hub REGISTRY에서 nginx는 NGINX 이미지의 여러 버전을 포함하는 리포지토리의 이름입니다.
일부 REGISTRY는 공개되어 있으며, 이들은 인터넷에 任何人都可以访问的 이미지를 호스트합니다. Docker Hub과 같은 공개 REGISTRY는 오픈 소스 프로젝트를 호스트하는 좋은 옵션입니다.그러나 개인 REGISTRY은 사업 컨테이너 이미지 저장에 보안과 개인隐私을 적용하는 수단을 제공합니다. 이러한 개인 REGISTRY은 보안 기능과 기술 지원을 일반적으로 제공합니다.
Amazon ECR, GCP Artifact Registry, GitHub Container Registry 과 같은 많은 개인 REGISTRY이 사용 가능합니다. 또한 Docker Hub은 개인 리포지토리 기능을 제공합니다.
개발자는 docker push
및 docker pull
명령을 사용할 때 컨테이너 레지스트리와 상호 작용합니다.
docker push docker.io/pliutau/hello-world:v0
# Docker Hub의 경우 레지스트리 부분을 건너뛸 수도 있습니다
docker push pliutau/hello-world:v0
컨테이너 이미지 URL의 구조를 살펴보겠습니다:
docker pull docker.io/pliutau/hello-world:v0@sha256:dc11b2...
| | | |
↓ ↓ ↓ ↓
registry repository tag digest
컨테이너 레지스트리를 자체 호스팅해야 하는 이유
때로 AWS나 GCP 같은 공급자에 의존하는 대신 이미지를 직접 호스팅하고 싶을 수도 있습니다. 이렇게 하면 인프라를 내부에 유지하면서 외부 공급업체에 대한 의존도를 줄일 수 있습니다. 규제가 심한 일부 산업에서는 이것이 필수 요건이 되기도 합니다.
자체 호스팅 레지스트리는 자체 서버에서 실행되므로 레지스트리 구성 방법과 컨테이너 이미지 호스팅 위치를 더 잘 제어할 수 있습니다. 동시에 레지스트리를 유지 관리하고 보호하는 비용이 발생합니다.
컨테이너 레지스트리를 자체 호스팅하는 방법
사용 가능한 오픈 소스 컨테이너 레지스트리 솔루션은 여러 가지가 있습니다. 가장 널리 사용되는 것은 컨테이너 이미지와 아티팩트의 저장 및 배포를 위해 구현된 registry라는 Docker에서 공식적으로 지원하는 것입니다. 즉, 컨테이너 내에서 자체 레지스트리를 실행할 수 있습니다.
서버에서 레지스트리를 실행하는 주요 단계는 다음과 같습니다.
-
서버에 Docker 및 Docker Compose 설치.
-
레지스트리 컨테이너를 구성 및 실행합니다.
.
-
TLS를 처리하고 요청을 컨테이너로 转发하기 위해 NGINX 을 실행합니다.
-
SSL 인증서를 설정하고 도메인을 구성합니다.
단계 1: 서버上에 Docker와 Docker Compose를 설치합니다.
Docker를 지원하는 모든 서버를 사용할 수 있습니다. 예를 들어, Ubuntu를 사용하는 DigitalOcean Droplet을 사용할 수 있습니다. 이 데모에서는 Google Cloud Compute를 사용하여 Ubuntu VM을 생성했습니다.
neofetch
# OS: Ubuntu 20.04.6 LTS x86_64
# CPU: Intel Xeon (2) @ 2.200GHz
# 메모리: 3908MiB
VM 안에 들어가면 Docker과 Docker Compose를 설치해야 합니다. Docker Compose는 선택적입니다が 다수의 컨테이너 应用程序을 관리하기 위해 더 쉽게 사용할 수 있습니다.
# install docker engine and docker-compose
sudo snap install docker
# 설치를 확인합니다
docker --version
docker-compose --version
단계 2: registry 컨테이너를 설정하고 실행합니다.
다음으로 우리는 registry 컨테이너를 설정해야 합니다. 다음과 같은 compose.yaml 파일은 이미지를 저장하는 ボリューム과 암호 파일을 저장하는 ボリューム을 생성하여 registry 컨테이너를 생성합니다.
services:
registry:
image: registry:latest
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
# 암호 파일 마운트
- ./registry/registry.password:/auth/registry.password
# 데이터 디렉터리 마운트
- ./registry/data:/data
ports:
- 5000
REGISTRY_AUTH_HTPASSWD_PATH에 정의 된 암호 파일을 이용하여 사용자가 レジス트리에서 이미지를 푸시하거나 풀기 위해 인증하는 것에 사용되ます。我们应该使用htpasswd 명령어로 암호 파일을 생성해야합니다。我们还应该创建一个用于存储图像的文件夹。
mkdir -p ./registry/data
# htpasswd 설치
sudo apt install apache2-utils
# 암호 파일 생성。 사용자 이름: busy, 암호: bee
htpasswd -Bbn busy bee > ./registry/registry.password
이제 레지스트리 컨테이너를 시작할 수 있습니다。 이 메시지를 보면 모든 것이 예상대로 작동하는 것입니다:
docker-compose up
# 성공적인 실행은 다음과 같은 것을 출력해야 합니다:
# registry | level=info msg="listening on [::]:5000"
第3步: 실행 NGINX TLS 처리
이전에 말씀하신 것처럼, NGINX를 TLS 처리하고 요청을 레지스트리 컨테이너로 转发할 수 있습니다.
Docker Registry가 작동하기 위해 유효하고 신뢰할 수 있는 SSL 인증서가 필요합니다. 이를 手動으로 생성하거나 Let’s Encrypt과 같은 것을 사용할 수 있습니다。 서버에 도메인 이름이 있어야 합니다(在我的情况下registry.pliutau.com)。 이 demp에서는 이미 certbot을 사용하여 인증서를 얻었고 ./nginx/certs 디렉터리에 넣었습니다。
compose.yaml 파일에 다음과 같은 서비스를 추가하여 컨테이너内에 NGINX을 运行시키 수 있습니다.
services:
registry:
# ...
nginx:
image: nginx:latest
depends_on:
- registry
volumes:
# nginx configurations 를 挂载
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
# Let's Encrypt에서 인증 받은 인증서를 挂载
- ./nginx/certs:/etc/nginx/certs
ports:
- "443:443"
我们的nginx.conf文件可能看起来像这样:
worker_processes auto;
events {
worker_connections 1024;
}
http {
upstream registry {
server registry:5000;
}
server {
server_name registry.pliutau.com;
listen 443 ssl;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
location / {
# 대형 이미지에 대한 중요한 설정
client_max_body_size 1000m;
proxy_pass http://registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
}
准备好出发!
这些步骤之后,我们可以运行我们的注册表和NGINX容器。
docker-compose up
现在,在客户端上,您可以从您的注册表中推送和拉取图像。但是,首先我们需要登录到注册表。
docker login registry.pliutau.com
# 用户名:busy
# 密码:bee
# 登录成功
现在,是时候构建并将我们的映像推送到我们自托管的注册表了:
docker build -t registry.pliutau.com/pliutau/hello-world:v0 .
docker push registry.pliutau.com/pliutau/hello-world:v0
# v0: digest: sha256:a56ea4... size: 738
您可以在服务器的数据文件夹中检查已上传的映像:
ls -la ./registry/data/docker/registry/v2/repositories/
其他选项
如上所示示例,您还可以在Kubernetes上运行注册表。或者,您可以使用像Harbor这样的托管注册表服务,这是一个开源的注册表,提供高级安全功能,并兼容Docker和Kubernetes。
또한, 자신의 호스트를 사용하여 등록 시스템의 UI를 가져오고자 하시면 joxit/docker-registry-ui과 같은 프로젝트를 사용하여 별도의 컨테이너에 실행할 수 있습니다.
결론
자신의 등록 시스템을 完全하게 관리하고 배포 방법을 결정할 수 있는 자신에게 호스팅되는 컨테이너 등록 시스템을 사용하면 이를 유지하고 보호하는 비용이 있을 수 있습니다.
자신의 등록 시스템을 실행하는 이유가 무엇이든지, 이제 어떻게 실행되는지 알고 있습니다. 이곳から 다양한 옵션을 比较하여 자신의 需要에 가장 적합한 것을 선택할 수 있습니다.
이 데모의 전체 소스 코드는 GitHub에서 찾을 수 있습니다. 또한, 이를 비디오 形式으로 我们的 YouTube 채널에서 보실 수 있습니다.
Source:
https://www.freecodecamp.org/news/how-to-self-host-a-container-registry/