개요

멜론 빅데이터팀에서는 하둡/Hbase, ES를 비롯한 다양한 서버들을 관리하고 있습니다. 빅데이터 서버들 관리 효율화 하고자 docker를 활용한 devops를 고민하고 있습니다. 두 기술 다 국내에 유행한지 2~3년 정도 지난 것 같은데 (느낌상) 현재에 와서는 기능도 충분하고 안정성도 확보된 느낌입니다.

개인적으로는 docker를 로컬 개발환경 구성 시 꽤 활용해보았지만 회사에서는 다루어보지 않았습니다. 이유는 성능 및 안정성 확보에 있습니다. 개인적인 견해로는 회사에서도 전면 도입보다는 점차 내부 서비스 위주로 차츰차츰 서비스를 늘여가며 운영경험을 쌓는게 좋지 않을까 합니다.

이번 글에서는 회사에서 사용하기 위한 docker 사설 저장소(이하 private registry)를 구축하는 방법을 정리하여 공유합니다.

이하 글 부터는 편의상 존칭을 생략합니다.

유의사항

docker mirroring 문서에 보면 아래와 같이 나와있다.

It’s currently not possible to mirror another private registry. Only the central Hub can be mirrored.

또한 stackoverflow 글에서도 docker hub pull 기능과 docker push를 내부적으로 사용하기 위해서는 private registrymirror registry를 띄워야 한다고 의견이 모아지고 있다.

필자가 실제로 해보니 docker mirror registry를 띄우고 push를 시도하자 정상동작 하지 않았다. 따라서 필자가 아는한 docker를 private registry와 mirror registry로 나누어 띄워 git pull시에는 mirror registry를 이용하고 push를 할때는 private registry를 이용해야 한다.

private registry / mirror registry 구축하기

아래 글부터 로컬 이미지 저장을 위한 private registry와 인터넷이 안되는 내부망 장비의 docker들이 바라볼 mirror registry를 구축하는 것을 진행해보자.

private registry

자체 서명 인증서 만들기

$ mkdir -p ~/docker_registry/certs

CN을 private domain으로 등록한다. 예를 들어 docker-registry.kwangsiklee.com으로 등록한다.

$ openssl req \
  -newkey rsa:4096 -nodes -sha256 -keyout ~/docker_registry/certs/domain.key \
  -x509 -days 36500 -out ~/docker_registry/certs/domain.crt

클라이언트에서

만들어진 ~/docker_registry/certs/domain.crt를 각 장비 /etc/docker/certs.d/docker-registry.kwangsiklee.com:5000/ca.crt에 복사하여 CA를 등록한다.

$ mkdir -p /etc/docker/certs.d
$ mkdir -p /etc/docker/certs.d/docker-registry.kwangsiklee.com:5000
$ cp ~/docker_registry/certs/domain.crt /etc/docker/certs.d/docker-registry.kwangsiklee.com:5000/ca.crt
$ ls /etc/docker/certs.d/docker-registry.kwangsiklee.com:5000/
ca.crt
$ # docker registry에 접속할 각 장비에도 같은 경로로 ca.crt파일 복사해야함

hosts 등록

/etc/hosts에 docker-registry.kwangsiklee.com 호스트를 등록한다.

registry 실행

~/docker_registry/start.sh를 아래와 같이 만든다.

$ docker run -d \
  --restart=always \
  --name registry \
  -v ~/docker_registry/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -v /data01/registry:/var/lib/registry \
  -p 5000:5000 \
  registry:2

검증하기

$ docker pull ubuntu:16.04
$ docker tag ubuntu:16.04 docker-registry.kwangsiklee.com:5000/my-ubuntu
$ docker push docker-registry.kwangsiklee.com:5000/my-ubuntu
$ docker pull docker-registry.kwangsiklee.com:5000/my-ubuntu

docker 종료

~/docker_registry/stop.sh를 아래와 같이 만든다.

$ docker stop registry && docker rm -v registry

mirror registry

docker hub를 미러링 하는 private mirror registry를 띄워보자. 목적은 크게 아래의 2가지이다.

  • 사내의 외부방이 열려있지 않은 서버에서 private mirror registry를 이용하여 docker hub의 이미지를 pull
  • private mirror registry에서 이미지를 1차례 받으면 로컬 캐시하므로 여러차례 docker hub로 부터 중복된 이미지를 받는 것 대비하여 효율성으 증대됨

전제사항

docker mirror registry는 image들이 저장될 예정이라 보통 디스크를 마운트한 곳을 docker volume으로 지정해서 사용해야 한다. 아래 예제에서는 /data01에 디스크가 마운트 되었다고 가정하고 docker volume으로 지정한다.

mirror registry docker 실행

$ docker run -d --restart=always -p 5555:5000 --name v2-mirror \
-v /data01/hub:/var/lib/registry registry:2 \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io

/etc/docker/daemon.json 수정

이 뜻은 mirroring registry는 5555포트 registry로 하고 image commit 따위는 5000포트의 registry를 사용한다는 뜻이다.
도메인이 같다고 해서 헷갈리면 안된다.

{
  "allow-nondistributable-artifacts": ["docker-registry.kwangsiklee.com:5000"],
  "registry-mirrors": ["http://docker-registry.kwangsiklee.com:5555"]
}

파일 수정 이후 docker 데몬을 재시작해준다.

$ sudo service docker restart

검증하기

$ docker pull busybox:latest
$ curl http://docker-registry.kwangsiklee.com:5555/v2/_catalog

docker 종료

~/docker_registry/stop.sh를 아래와 같이 만든다.

$ docker stop v2-mirror && docker rm -v v2-mirror

참고자료