Docker Registry를 활용하여 사설 레지스트리 사용하기

    Docker Hub와 같은 public docker registry를 사용하는 대신, 사내 전용 혹은 개인 용도로 Docker 사설 레지스트리를 설치하고자 할 때, Docker Registry를 사용하여 private registry를 설정해 보자.

     

    Docker Registry 설치 방법

    Docker Hub에서 Docker Registry 이미지를 찾아보자.

    $ docker search registry
    
    NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
    registry                             The Docker Registry 2.0 implementation for s…   3305      [OK]
    ...

    검색한 이미지를 받아온다.

    $ docker pull registry:latest
    
    latest: 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:latest
    docker.io/library/registry:latest

    정상적으로 이미지를 받아왔는지 확인한다.

    $ docker images registry
    
    REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
    registry     latest    1fd8e1b0bb7e   8 weeks ago   26.2MB

     

    Docker Registry 실행

    다운로드한 Docker Image를 다음과 같이 실행해 보자.

    $ docker run --name docker-registry -d -p 5000:5000 registry
    
    dc5b7ffb769a02f9304e6ed57bc3ee3eb07a2e50b88a0aff8c349ed293dee5ac

    정상적으로 실행이 되었다면, telnet을 비롯한 여러 방법으로 정상 가동 여부를 확인할 수 있다. telnet으로 손쉽게 확인해 본다.

    // telnet으로 확인
    $ telnet localhost 5000
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.

     

    Docker Registry 동작 테스트

    Docker Registry를 띄웠으므로, 이제 샘플 이미지를 활용하여 동작 테스트를 해보자.

     

    샘플 Docker Image 제작

    다음과 같이 Dockerfile을 작성하자.

    FROM ubuntu:latest
    CMD echo 'Hello, new world!'

    위 이미지는 단순히 Hello, new world!만 출력하는 아주 단순한 이미지이다. 다음의 명령어 형식으로 Docker Image를 생성할 수 있다.

    docker build --tag 이미지이름:tag 

    $ docker build --tag luran/docker-registry-test .

    명령어를 다음과 같이 실행하였다.

    $ docker build --tag luran/docker-registry-test .
    [+] Building 2.5s (6/6) FINISHED
     => [internal] load build definition from Dockerfile                                                                     0.0s
     => => transferring dockerfile: 36B                                                                                      0.0s
     => [internal] load .dockerignore                                                                                        0.0s
     => => transferring context: 2B                                                                                          0.0s
     => [internal] load metadata for docker.io/library/ubuntu:latest                                                         2.4s
     => [auth] library/ubuntu:pull token for registry-1.docker.io                                                            0.0s
     => CACHED [1/1] FROM docker.io/library/ubuntu:latest@sha256:82becede498899ec668628e7cb0ad87b6e1c371cb8a1e597d83a47fac2  0.0s
     => exporting to image                                                                                                   0.0s
     => => exporting layers                                                                                                  0.0s
     => => writing image sha256:76779e033ff6e0346ada241fa2c05ef8e4cd0ef31b2af9e7c282d539f26a89d5                             0.0s
     => => naming to docker.io/luran/docker-registry-test                                                                    0.0s

    정상적으로 로컬에 Docker Image가 생성되었다면 조회가 가능하다. 아래와 같이 확인해 본다.

    $ docker images
    REPOSITORY                                      TAG                          IMAGE ID       CREATED         SIZE
    luran/docker-registry-test                      latest                       76779e033ff6   4 weeks ago     72.8MB

    Docker Image를 실행하여, 의도한 바와 같이 실행되는지 확인해 보자.

    $ docker run luran/docker-registry-test
    Hello, new world!

     

    docker registry에 local image push 하기

    로컬에 Docker Image 샘플을 만들었으므로, 사설 Docker Registry에 등록해 보자. 사설 Repository를 사용할 것이므로, 다음과 같이 Docker tag 명령어를 사용하여 태그를 지정하자.

    $ docker tag 원본이미지(:tag) {리모트주소:포트/}{프로젝트)/이미지(:tag)
    $  docker tag luran/docker-registry-test localhost:5000/docker-registry-test
    
    docker images | grep docker-registry-test
    luran/docker-registry-test                      latest                       76779e033ff6   4 weeks ago     72.8MB
    localhost:5000/docker-registry-test             latest                       76779e033ff6   4 weeks ago     72.8MB

    이렇게 도커 이미지 앞에 registry의 주소 및 포트를 지정하고 push 하면, 해당 도커 레지스트리로 이미지가 push된다.

    $ docker push localhost:5000/docker-registry-test
    Using default tag: latest
    The push refers to repository [localhost:5000/docker-registry-test]
    7555a8182c42: Pushed
    latest: digest: sha256:22af30a18f9c02836fae8c23da3fab5e23591459fd80069e6d7ef0619c8c8d43 size: 528

    이제 localhost:5000에 띄운 나만의 사설 Docker Registry에 luran/docker-registry-test라는 이미지를 localhost:5000/docker-registry-test라는 태그를 달고 push 하였다.

    Docker Registry에 어떤 변화가 생겼는지 살펴보자면, 위의 샘플 이미지를 push 하기 전에는

    $ curl -X GET http://localhost:5000/v2/_catalog
    {"repositories":[]}

    와 같은 상태였으나, 해당 이미지를 push한 후에는 아래와 같이 상태를 조회해 볼 수 있다.

    $ curl -X GET http://localhost:5000/v2/_catalog
    {"repositories":["docker-registry-test"]}
    
    $ curl -X GET http://localhost:5000/v2/docker-registry-test/tags/list
    {"name":"docker-registry-test","tags":["latest"]}

     

    docker registry pull 테스트

    위와 같이, 사설 Docker Registry에 push한 이미지를 이제 pull하여 사용해 보자. push를 하느라 사용한 이미지가 로컬에 남아 있을 것이다. 원본 이미지와 tag한 사본 이미지를 docker rmi 명령어를 사용하여 모두 로컬에서 삭제한다.

    $ docker rmi luran/docker-registry-test localhost:5000/docker-registry-test
    Untagged: luran/docker-registry-test:latest
    Untagged: localhost:5000/docker-registry-test:latest
    Untagged: localhost:5000/docker-registry-test@sha256:22af30a18f9c02836fae8c23da3fab5e23591459fd80069e6d7ef0619c8c8d43

    로컬에서 해당 이미지들을 모두 삭제했으므로, 이제 docker images로도 조회가 되지 않는다. 이제 실행하면, 사설 Docker Registry로부터 pull이 잘 되는지 실행 해보자.

    $ docker run localhost:5000/docker-registry-test
    Unable to find image 'localhost:5000/docker-registry-test:latest' locally
    latest: Pulling from docker-registry-test
    Digest: sha256:22af30a18f9c02836fae8c23da3fab5e23591459fd80069e6d7ef0619c8c8d43
    Status: Downloaded newer image for localhost:5000/docker-registry-test:latest
    Hello, new world!

    위의 메시지로부터 pulling from ~ 이라는 문장이 발견되었다. 이제 다시 images를 조회해보면, 정상적으로 로컬에서 확인된다.

    $ docker images | grep docker-registry
    localhost:5000/docker-registry-test             latest                       76779e033ff6   4 weeks ago     72.8MB

    이것으로 간단하게 나마, 로컬에서 사설 Docker Registry를 설치하고 동작하는 것을 확인하였다.

     

    실제 서비스에 활용하려면?

    안타깝게도 위와 같이 설정한 수준으로는 여러 명이 사내에서 그대로 사용할 수 없다. 우선 네트워크가 접근이 안될 것이다. 따라서, 로컬이 아니라, 특정 서버에 설치하고 그 서버가 접속이 되도록 IP/ DNS 등을 설정해 줘야 한다. 그리고, 서비스의 storage가 로컬 머신에 한정되지 않도록 구성해야 할 것이다. 뿐만 아니라, 서비스 자체가 장애나지 않도록 redundancy도 확보해 줘야 한다. 게다가, UI가 자체 내장되어 있지 않으므로, UI를 띄워주는 별도의 프로젝트를 설정해 준다면 관리의 불편함은 어느 정도 해소할 수 있을 것이다.

    참고) https://hub.docker.com/r/joxit/docker-registry-ui

    댓글(0)

    Designed by JB FACTORY