본문 바로가기
  • 오늘처럼
소프트웨어 아키텍처/Docker

Docker registry service 2

by bluefriday 2018. 6. 20.
반응형

Docker registry config

 

 

docker registry를 사용하면, private 한 환경에서 image registry를 구축할 수 있다. 이번에는 단순하게 registry를 사용하는 것 뿐만 아니라 registry 를 배포하고 설정을 변경하여 실제 개발/운영 환경에서 사용하기 위한 추가사항에 대하여 다루어본다.

 

1. Registry 를 항상 재시작 하도록 설정

Docker registry 컨테이너가 구동되는 호스트가 재부팅 되거나, 호스트 내에서 docker process 가 재시작 될 경우 자동으로 registry 컨테이너가 구동되도록 할 경우, container 구동(run)시에 '--restart=always' 옵션을 추가할 수 있다. public registry를 사용하지 않고, 로컬 환경이나 private 환경에서 고정적으로 registry를 사용하는 경우 이 옵션을 부여하여, 호스트의 docker 환경이 재부팅 되더라도 항상 registry가 구동되어 있도록 설정해주자. (사용 예는 아래 3번 예제와 함께 표시한다.)

 

2. Registry 의 포트를 지정하여 구동

registry는 기본적으로 5000번 포트를 사용하여 서비스를 노출한다. 따라서 registry를 사용하기 위해서는 구동시에 port 옵션으로 5000번 포트를 그대로 노출하여 사용하는 것이 일반적이다. 하지만 특별한 경우에 따라서 로컬 환경에서 이미 5000번 포트를 사용하는 경우, container내부의 5000번 포트와 로컬환경의 다른 포트를 연결해줘야 한다. 물론 이렇게 다른 포트를 지정할 수도 있지만, 직관성을 위하여 컨테이너와 호스트에서 동일한 포트를 사용하고자 할 경우 컨테이너 내부의 환경변수로 REGISTRY_HTTP_ADDR 을 지정하여 내부의 registry 포트를 변경하고 동일한 포트로 호스트 포트를 바인딩 할 수도 있다. 아래 3번 예제를 참고하자.

 

3. Volume directory를 지정

registry 는 기본적으로 저장소 역할을 하기 때문에 컨테이너 내부에 계속 해서 데이터(이 경우는 docker image)가 적재 되는 구조이다. 기본적으로 컨테이너 내부의 /var/lib/registry 에 적재되는 데이터는 컨테이너가 삭제될 경우 컨테이너와 함께 삭제되어 유지되지 않는다. 따라서 registry 의 적재되는 데이터는 docker volume 명령어를 이용하여 호스트 환경에 영구적으로(persistent) 유지해 주는 것이 좋다. restart 옵션과 함께 사용할 경우, 호스트 docker 서비스가 중지 되는 경우에도 재기동 후에 registry 안의 데이터를 유지할 수 있다. 컨테이너 내부에 적재되는 데이터는 휘발성이므로, 비단 registry 이미지가 아니더라도, 데이터 성격의 컨테이너의 경우 항상 volume 옵션을 사용해주자. (적재되는 경로는 config 파일에 지정하여 변경 가능하다)

docker run -d --name=registry --restart=always -e REGISTRY_HTTP_ADDR=0.0.0.0:5007 -p 5007:5007 -v /registry:/var/lib/registry registry:latest

 

 

4.  외부에서 registry 에 접근가능하도록 설정

앞에서의 방법을 이용하여 registry를 구동하는 경우 기본적으로 localhost 로만 접근이 가능하다. 즉, 모든 이미지가 local에 있으며 이미지의 full name은 localhost:5000/image:tag 등으로 사용된다. 하지만 아무리 private한 환경에서 사용하기 위한 registry라고 해도 이렇게 로컬 호스트에서만 접근이 가능할 경우 활용성이 매우 떨어진다. 이번에는 private 네트워크 내부의, registry가 떠있는 host로 접근이 가능한, 다른 서버에서 registry를 이용하여 이미지를 저장하고 받아올 수 있도록 registry를 외부로 노출해보자. 먼저 registry가 구동되어 있는 host에 대한 crt 파일과 key 파일을 준비한다. (해당 파일을 생성하는 과정에 대해서는 여기서 다루지 않으니 다른 관련 자료를 참조하자.)  2개의 인증서 파일이 /certs 경로에 있다고 가정할 경우 아래와 같은 구동 명령어를 사용하여 registryf를 구동한다.

docker run -d \
     --name registry \
     -v /certs:/certs \
     -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
     -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
     -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
     -p 443:443 \
     registry:latest

 

위와 같이 구동할 경우 registry 호스트에 접근가능한 다른 네트워크에서 인증서에 등록된 도메인으로 docker pull/push 등이 가능하다.

 

5. registry 접근제어

안전성이 보증되는 네트워크에서 구동되는 경우가 아니라면 registry 에 대한 접근제어 또한 필요하다. docker registry는 기본적인 패스워드 기반의 인증을 제공하고 있다. 이번에는 registry 내부에서 이미 설치되어 있는 htpasswd 유틸리티를 이용하여 registry 접근 제어를 구현해보자. 먼저 registry 내부의 htpasswd 명령어를 사용하기 위해 아래의 명령을 실행한다. 해당 명령은 아이디와 패스워드를 각각 'admin', 'password'로 지정하여 특정 위치에 해당 계정 정보와 관련된 파일을 생성해준다.

mkdir $PWD/auth

docker run --entrypoint htpasswd registry -Bbn "admin" "password" > $PWD/auth/htpasswd

 

이제 생성된 파일을 이용하여 registry를 구동한다.

docker run -d --name registry \
     -v $PWD/auth:/auth \
     -e "REGISTRY_AUTH=htpasswd" \
     -e "REGISTRY_AUTH_HTPASSWD_PATH"=/auth/htpasswd \
     -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
     -p 5000:5000 \
     registry

 

위와 같이 구동할 경우, 지정한 아이디와 패스워드를 이용하여 아래와 같이 로그인이 가능하다.

docker login localhost:5000

 

'소프트웨어 아키텍처 > Docker' 카테고리의 다른 글

Docker and container runtime  (0) 2021.08.30
Docker registry 내부 구조  (1) 2018.06.21
Docker registry service  (0) 2018.06.17
Docker image  (3) 2018.06.15
Dockerfile Best Practice  (0) 2018.06.14

댓글