사설 레지스트리 생성

사설 레지스트리(Private Registry)를 사용하면 개인 서버에 이미지를 저장할 수 있다. 해당 레지스트리는 도커 컨테이너로 구현되므로 이미지를 내려 받아 실행하여 구현한다.

$ Docker run -d --name my_registry -p 5000:5000 --restart=always registry
  • --restart 는 도커 엔진 혹은 컨테이너가 종료 되었을 때 재시작의 정책을 말하며 always로 설정하면 내가 docker stop으로 정지시키지 않는한 조건에 따라 차이가 있을 수 있지만 웬만한 비정상 종료 시엔 다시 컨테이너를 재시작 해준다.
  • 레지스트리 컨테이너는 5000번 포트를 사용하므로 -p 옵션으로 호스트의 5000번 포트와 연결해준다.

사설 레지스트리에 이미지 push

레지스트리에 이미지를 올리기 위해서는 이미지의 이름을 추가하여 정해진 형식으로 바꿔줘야한다. 호스트의 ip와 port, 그리고 우리가 정한 이름과 태그가 부여된다. 아래는 레지스트리 컨테이너를 실행 한 머신의 IP가 172.16.10.7인 상황에서의 예시다.

ex) docker tag ${Name}:{tag} ${레지스트리 호스트 IP}:5000/${Name}:{tag}

$ docker tag my-image:0.1 172.16.10.7:5000/my-image:0.0
  • 여기서 핵심은 tag 커맨드로 바꿔준 ${레지스트리 호스트 IP} 이다. 해당 IP의 장치에 사설 레지스트리가 구축되어있어야한다. 레지스트리를 실행해준 머신에서 tag 커맨드를 사용한다면 localhost도 유효하다.

이미지 push

위에서 이미지의 이름을 바꾸었다면 다음 명령어를 입력해서 레지스트리에 이미지를 올린다. 단, 바로 작동하지는 않고 문제가 있다.

ex) docker push ${도커 이미지}

docker push 172.16.10.7:5000/my-image:0.0

에러는 다음과 같이 적힌다.

The push refers to repository [172.16.10.7:5000/my-image]
Get https://172.16.10.7:5000/v2/: http: server gave HTTP response to HTTPS client

insecure-registry

위의 에러를 해결하기 위해 --insecure-registry 옵션을 사용해아한다. 일반적으로 HTTPS를 사용하지 않은 요청을 도커 데몬이 접근하지 못하도록 제지해서 발생한다. 이는 인증서를 적용해야하지만 지금은 예외를 적용하듯 해당 옵션을 적용한다. 여기선 우분투 OS의 경우다.

vi/etc/default/docker를 열어서 편집해준다. 중간에 주석처리가 되어있는 항목들이 보일텐데 주석을 해제하여 수정하거나 해당 내용을 추가하면된다.

DOCKER_OPTS="--insecure-registry=172.16.10.7:5000"

그리고는 도커 데몬과 서비스를 재시작해준다.

sudo systemctl daemon-reload
sudo systemctl restart docker 

레지스트리 컨테이너 삭제

레지스트리 컨테이너를 삭제하고 새로 만들 일이 있다면 다음과 같이 삭제한다. 레지스트리 컨테이너는 생성 시 호스트 머신에 볼륨을 생성하므로 볼륨도 지우는 옵션을 붙인다.

docker rm --volumes my_registry

이렇게만 해도 기본적으로 로컬에서는 사설 레지스트리를 사용하는데에는 문제가 없고 같은 IP대역 내에서도 일부 원격 사설 레지스트리 컨테이너에 전부 이미지를 push, pull 할 수 있다. 하지만 이렇게 되면 원하지 않는 머신에서도 접근 할 수 있기에 보안에 취약하다.인증서를 활용하여 정해준 머신들만 이용할 수 있어야 한다. 이는 추후 이어서 포스팅한다.

Leave a comment