Docker Registry 구축 방법
도커(Docker)에서 이미지를 저장하고 배포 할 수 있는 Registry 구축 방법에 대해서 설명드리도록 하겠습니다. 저장소(Repository)를 구축 한 다음 이미지를 저장하고, 배포하는 예제와 함께 Registry 접근 제어 방법에 설정 방법에 대해 함께 알려드리도록 하겠습니다.
도커 Registry 구축 필요성
Docker Hub를 이용하면 Registry 구축 없이 도커 이미지를 저장하고 배포할 수 있습니다. 하지만 도커 이미지 등이 회사 내부에서 비공개적으로 사용되거나, 사설 네트워크 등에서 사용되기 위해서는 내부 서버에 도커 Registry를 구축해야 합니다.
공식적으로 제공되는 도커 이미지 처럼, 다양한 종류의 도커 이미지와 버전 등을 관리 할 수 있는 사설 저장소(Repository)를 구축하여 사용할 수 있습니다.
환경
이 글에서 설명드릴 방법으로는 Docker 엔전 버전이 1.6.0 또는 이상이 되어야 합니다.
그리고 Docker Registry 접근 제어를 하기 위해서는 Apache 웹 서버를 사용하도록 하겠습니다. 사설 Registry 구축을 목적으로 접근제어 기능을 사용하고자 하시는 분들은 Apache 웹서버를 설치해 주시기 바랍니다.
Docker Registry 구축
도커 Registry 또한 도커 이미지로 배포되고 있습니다. 따라서 도커 이미지로 Registry 구축 방법을 설명드리도록 하겠습니다.
Registry 이미지 다운로드
아래의 명령어를 사용하여, Registry 도커 이미지를 다운로드 받아 주시기 바랍니다.
$ docker pull registry
참고로 위에서 다운로드 받은 registry:latest 이미지는 registry:2 이미지와 동일합니다.
Registry 컨테이너 생성
다음 명령어를 사용하여 Registry 컨테이이너를 생성합니다.
$ docker run -d -p 5000:5000 --restart=always --name registry registry
위의 명령어를 실행하면 기본적인 Docker Registry 구축 방법 설명드렸습니다.
도커 이미지 저장하기
도커 이미지를 태깅하고 Registry에 추가하는 방법에 대해서 설명드리겠습니다. 다음 명령어로 테스트 할 이미지를 다운로드 받습니다.
$ docker pull ubuntu
그리고 Registry에 저장될 Docker 이미지 이름으로 아래와 같이 태깅합니다.
$ docker image tag ubuntu localhost:5000/myfirstimage
위의 명령어를 실행하면 로컬에 태깅된 이미지가 생성됩니다. 태깅된 이미지를 서버에 저장하기 위해서는 아래와 같은 명령어를 사용하면 됩니다.
$ docker push localhost:5000/myfirstimage
도커 이미지 배포
Registry에 저장된 도커 이미지는 아래와 같은 명령어로 다운 받을 수 있습니다.
$ docker pull localhost:5000/myfirstimage
Docker Registry 삭제
위에서 구축된 Docker Registry를 삭제하는 방법입니다. 아래와 같은 명령어를 실행하면 실행중인 Registry 를 종료하고, 컨테이너를 삭제하게 됩니다.
기존 Registry에 저장된 도커 이미지는 모두다 삭제 되므로 주의해 주시기 바랍니다.
$ docker container stop registry && docker container rm -v registry
Docker Registry 접근제어
위에서 구축된 Docker Registry는 외부에서 접근제어를 하고 있지 않습니다. 또한 배포할 때에도 접속 포트(5000)를 지정해야 하는 등 배포 주소가 길어 질 수 있습니다.
도메인을 이용하여 Registry 사용할 수 있는 방법과 Registry 접근 제어를 위해서 Apache 서버의 Reverse Proxy 기능을 이용하여 설정 방법을 설명드리도록 하겠습니다.
기존에 생성된 Docker Registry를 삭제하고, 아래의 명령어를 이용하여 다시 Registry 를 생성해 주시기 바랍니다.
$ docker run -d --restart=always --name registry registry
호스트와 도커 컨테이너가 연결되는 포트 설정 옵션을 제거하여 외부 접속을 차단하였습니다. 그 다음 Proxy 서버를 통해서만 접속하도록 설정할 것입니다.
로그인 인증파일 생성
아래의 명령어를 사용하여 로그인 인증파일을 생성합니다. username 대신에 원하시는 사용자 명을 지정하셔도 됩니다.
$ htpasswd -c /data/www/.htpasswd username
아파치 Proxy 서버 설정
아래와 같은 내용의 Reverse 프록시 설정 내용을 생성합니다.
<VirtualHost *:443>
ServerName docker.hiseon.me
SSLEngine on
SSLCertificateKeyFile /etc/letsencrypt/live/hiseon.me/privkey.pem
SSLCertificateFile /etc/letsencrypt/live/hiseon.me/fullchain.pem
<Proxy "*">
AllowOverride All
Options All
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /data/www/.htpasswd
Require valid-user
</Proxy>
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / http://172.17.0.2:5000/
ProxyPassReverse / http://172.17.0.2:5000/
Header always set "Docker-Distribution-Api-Version" "registry/2.0"
Header onsuccess set "Docker-Distribution-Api-Version" "registry/2.0"
RequestHeader set X-Forwarded-Proto "https"
ErrorLog ${APACHE_LOG_DIR}/docker.hiseon.me.error.log
CustomLog ${APACHE_LOG_DIR}/docker.hiseon.me.access.log combined
</VirtualHost>
docker 이미지를 push 하는 과정에서 아래와 같은 에러메세지가 발생 할 수 있기에, 따라서 위의 설정 내용에서 설정 파일에 Header 정보가 추가되었습니다.
The requested method PATCH is not allowed for the URL /v2/test/blobs/uploads/fd0a8886-1178-45d5-9de5-2d905c1dcc02.
아래의 headers 모듈을 활성화 하고 Reverse Proxy 와 관련된 추가 모듈들을 함께 활성화 합니다. Proxy 서버 설정과 관련하여서는 아래의 글을 참고해 주시기 바랍니다.
$ sudo a2enmod headers
Docker 이미지를 배포하기 위해서는 SSL 인증서가 필수입니다. 따라서 SSL 인증서 설정과 관련된 내용이 설정파일에 함께 추가되었습니다.
Registry 로그인
아래와 같은 이름으로 도커 이미지를 태깅하고, push를 하게 되면 다음과 같은 메세지가 발생하게 됩니다.
$ docker image tag ubuntu docker.hiseon.me/test
$ docker push docker.hiseon.me/test
The push refers to repository [docker.hiseon.me/test]
75e70aa52609: Preparing
dda151859818: Preparing
fbd2732ad777: Preparing
ba9de9d8475e: Preparing
no basic auth credentials
다음과 같은 명령어를 이용하여, 로그인 파일을 생성합니다.
$ docker login docker.hiseon.me
Username: username
Password:
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Docker 이미지 저장
Docker Registry에 로그인 할 수 있도록 설정 한다음, push 명령어를 실행하면 아래와 같이 성공적으로 저장할 수 있는 것을 확인 할 수 있습니다.
$ docker push docker.hiseon.me/test
The push refers to repository [docker.hiseon.me/test]
75e70aa52609: Pushed
dda151859818: Pushed
fbd2732ad777: Pushed
ba9de9d8475e: Pushed
latest: digest: sha256:eb70667a801686f914408558660da753cde27192cd036148e58258819b927395 size: 1152
이미지를 다운 받을 때에도 동일한 방법으로 로그인 한 뒤에 다운 받으면 됩니다.
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)