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를 띄워주는 별도의 프로젝트를 설정해 준다면 관리의 불편함은 어느 정도 해소할 수 있을 것이다.
'Development > Docker' 카테고리의 다른 글
docker-compose: An http request took too long to complete 에러? (0) | 2021.02.08 |
---|---|
docker-compose 환경변수 사용 및 치환 (0) | 2020.12.26 |
Windows10에 docker 간편 설치하기 (0) | 2020.11.11 |