[Docker] Docker Registry를 사용한 프라이빗 레지스트리 구축(이미지 업로드 및 다운로드)
Docker Registry
Docker 이미지를 공유하고 싶으나 인터넷상에는 공개하고 싶지 않은 경우에는 Docker 이미지를 관리하기 위한 레지스트리를 로컬 환경에 구축하여 관리합니다. 이러한 레지스트리를 프라이빗 네트워크 안에서 구축하려면 Docker Store에 공개되어 있는 공식 이미지인 'registry'를 사용합니다.
https://hub.docker.com/_/registry
Docker Registry 이미지 업로드
우선 이 registry 이미지를 docker image pull 을 사용하여 로컬 환경에 다운로드 합니다.
실습에서는 최신 버전을 사용하겠습니다.
docker image pull registry
다운로드 후 docker image ls 명령어로 확인합니다.
docker image ls
...
registry latest 1fd8e1b0bb7e 6 weeks ago 26.2MB
...
다운로드한 registry 이미지를 바탕으로 레지스트리용 컨테이너를 실행합니다. 레지스트리는 5000번 포트를 사용하므로 -p 옵션을 사용하여 포트를 전송합니다.
docker run -d -p 5000:5000 --name registry registry
docker ps 명령어로 실행된 컨테이너를 확인합니다.
docker ps
결과
...
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c0959b6a6b5a registry "/entrypoint.sh /etc…" 45 seconds ago Up 44 seconds 0.0.0.0:5000->5000/tcp registry
...
이후 Docker 레지스트리에 업로드하기 위해 docker image tag 명령어를 통해이미지에 태그를 설정합니다. 실습에서는 my-react-app:1.0 이라는 기존에 생성된 이미지를 사용하겠습니다. localhost의 5000번 포트에서 작동하는 레지스트리에 'my-react-app:1.0'이라는 이름으로 업로드 하기 위해 이미지 태그를 localhost:5000/my-react-app:1.0 으로 설정합니다.
docker image tag my-react-app:1.0 localhost:5000/my-react-app:1.0
생성된 이미지 확인
docker image ls
결과
...
my-react-app 1.0 586455626728 4 weeks ago 134MB
localhost:5000/my-react-app 1.0 586455626728 4 weeks ago 134MB
...
localhost:5000/my-react-app:1.0라는 이름의 태그가 붙은 이미지가 만들어진 것을 확인할 수 있습니다. 그리고 이 이미지는 기존의 my-react-app:1.0 이미지와 같은 이미지 입니다.
이후 docker image push 명령어를 사용하여 프라이빗 레지스트리에 업로드합니다.
docker image push localhost:5000/my-react-app:1.0
결과
The push refers to repository [localhost:5000/my-react-app]
c8420b29171f: Pushed
64ee8c6d0de0: Pushed
974e9faf62f1: Pushed
15aac1be5f02: Pushed
23c959acc3d0: Pushed
4dc529e519c4: Pushed
7e718b9c0c8c: Pushed
1.0: digest: sha256:cf2d240ed42f875d750f0e8109184efe11ea4981fe79afc3d1796b5656a6112e size: 1780
이것으로 이미지 업로드가 완료되었으므로 로컬에 저장된 이미지를 삭제합니다.
docker image rm localhost:5000/my-react-app:1.0
docker image rm my-react-app:1.0
Docker Registry 이미지 다운로드 및 작동 확인
프라이빗 레지스트리 상의 이미지를 로컬 환경으로 다운로드 하려면 docker image pull 명령어를 실행합니다. 위에서 업로드 한 이미지를 다운로드 받겠습니다. localhost의 5000번 포트에서 작동하는 레지스트리로 부터 my-react-app:1.0 이미지를 받기위해 다음과 같이 입력합니다.
docker image pull localhost:5000/my-react-app:1.0
레이어가 다운로드되며 이미지가 다운로드되는 것을 볼 수 있습니다. 다운로드 받은 이미지를 확인해봅니다.
docker image ls
결과
...
localhost:5000/my-react-app 1.0 586455626728 4 weeks ago 134MB
...
이후 컨테이너 작동을 확인해봅니다.
docker run -it -p 80:80 localhost:5000/my-react-app
컨테이너가 잘 실행되는 것을 볼 수 있습니다. 웹 서비스도 잘 동작하는지 curl 명령어로 확인해 보겠습니다.
주의할 점
프라이빗 레지스트리에서는 Docker 이미지를 영구 데이터로 관리할 필요가 있습니다.
Docker에서는 호스트 머신에 볼륨을 공유함으로써 영구 데이터를 관리할 수 있습니다.(Docker volume 활용)
작성된 이미지는 아주 중요한 데이터이기 때문에 이 데이터를 관리하려면 신뢰성이 높고 용량이 충분한 스토리지를 마련해야하고, 장애에 대비하여 다중화로 구성할 필요도 있으며, 정기적 백업이나 감시가 필요합니다.
또한 최근의 클라우드 서비스를 이용한 컨테이너 레지스트리 서비스가 있으므로 (ex) Google Cloud Platform의 'Google Container Registry' 위와 같은 서비스를 이용하는 것도 좋은 방법일 것입니다.
Docker의 Private Registry에 대하여 알아보았습니다.