Docker Registry?

Private Registry가 왜 필요한가?

  • 나만의 이미지를 만들어서 외부에 공개하기 싫을 때 private repo가 필요하다.
  • docker hub는 1개의 private repo만을 무료로 제공하며 추가적인 private repo에 대해서는 유료이다.

구축 방법.

linux base 시스템에서 docker가 설치되어 있다고 가정한다.

  • 아래의 명령어만으로 registry를 바로 띄울수 있다.

    docker run -d -p 5000:5000 --restart always --name registry registry:2
  • localhost에 띄웠다고 가정하고 docker image를 push하는 방법

    docker tag my-image localhost:5000/my-image:latest
    docker push localhost:5000/my-image:latest

문제점

  • 위와 같이 기본적으로 구축하면 3가지 문제가 발생한다.
  1. persistent volume이 없어서 container가 죽을시 image가 전부 사라짐.
  2. authentication이 없어서 아무나 접근이 가능함 (network만 열려있다면)
  3. https미적용으로 push 불가.

해결

  1. container가 죽어도 image를 보존할 수 있도록 volume mount하기

    • 먼저 디렉토리를 만들고
      mkdir -p /mnt/docker/registry
    • container를 실행할 때 mount 해준다.
      docker run -d -p 5000:5000 --restart always -v /mnt/docker/registry:/var/lib/registry --name registry registry:2
  2. authentication을 위한 설정한다.

    • docker registry에서 제공하는 authentication에는 여러가지가 있는데 (참고) 간단하게 id, password기반인 htpasswd를 적용한다
    • 먼저 htpasswd파일을 위한 디렉토리를 만들고
      mkdir -p /mnt/docker/auth
    • htpasswd파일을 생성한다.(registry 이미지로 생성)
      docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > /mnt/docker/auth/htpasswd
    • htpasswd가 있는 디렉토리를 mount하고 option을 넣는다.
      docker run -d -p 5000:5000 \
       --restart always \
       -v /mnt/docker/registry:/var/lib/registry \
       -v /mnt/docker/auth:/auth \
       -e REGISTRY_AUTH=htpasswd \
       -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
       -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
       --name registry registry:2
  3. https미적용으로 push 불가

    • https가 미적용된 registry에는 기본적으로 push가 불가능 하도록 되어 있다.

    • 두가지 방법으로 해결이 가능하다.

      1. 인증서를 발급받아 https를 적용한다.
      2. docker client에 insecure-registries로 등록한다.
    • 첫번째 방법은 귀찮으므로 그냥 insecure-registries로 등록한다.

    • daemon.json 파일 경로를 찾아서 아래의 내용을 입력한다. (centos의 경우 /etc/docker/daemon.json) - 없다면 생성한다.

      {
      "insecure-registries" : ["localhost:5000"]
      }

결과

  • 먼저 push전에 registry에 login을 해야 한다.
    docker login localhost:5000
  • 이후에 push한다.
    docker tag my-image localhost:5000/my-image:latest
    docker push localhost:5000/my-image:latest

진짜 끗

'프로그래밍 > docker' 카테고리의 다른 글

Docker Registry용 SSL 인증서 합치기  (0) 2019.12.23

BELATED ARTICLES

more