Docker Registry 구축 방법


Docker Registry 구축 방법
도커(Docker)에서 이미지를 저장하고 배포 할 수 있는 Registry 구축 방법에 대해서 설명드리도록 하겠습니다. 저장소(Repository)를 구축 한 다음 이미지를 저장하고, 배포하는 예제와 함께 Registry 접근 제어 방법에 설정 방법에 대해 함께 알려드리도록 하겠습니다.

Docker 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

이미지를 다운 받을 때에도 동일한 방법으로 로그인 한 뒤에 다운 받으면 됩니다.

( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)