[docker] 가장 기초적인 private docker registry 구축하기
2020. 4. 28. 02:15
Docker Registry?
- Container 이미지를 저장하는 저장소.
- https://hub.docker.com/ 는 대표적인 public 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가지 문제가 발생한다.
- persistent volume이 없어서 container가 죽을시 image가 전부 사라짐.
- authentication이 없어서 아무나 접근이 가능함 (network만 열려있다면)
- https미적용으로 push 불가.
해결
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
- 먼저 디렉토리를 만들고
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
https미적용으로 push 불가
https가 미적용된 registry에는 기본적으로 push가 불가능 하도록 되어 있다.
두가지 방법으로 해결이 가능하다.
- 인증서를 발급받아 https를 적용한다.
- 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 |
---|