* Private Redistry란?

Private Rgeistry는 public한 docker hub와는 다르게, 개인적으로만 사용하도록 개인 서버에 구축하는 도커 이미지 저장소이다. 회사 사내에서 사용하거나 개인적으로 만든 이미지를 올리고 관리하기 위해서 사용된다.

 

Private registry를 구축하기 위해서는 도커에서 제공하는 "Registry" 라는 이미지를 사용할 수 있다. 도커에서 이 이미지를 실행하면 이 컨테이너에 자신의 이미지를 업로드할 수 있는 것이다. 이 Registry도 도커 컨테이너이므로, 여기 올리는 이미지들을 계속 유지하려면 볼륨을 다른 외부 스토리지 등 안정성있는 스토리지로 사용해야 한다.

 

Registry 이미지는 0점대 버전과 2점대 버전 2가지 계열이 있다. 0점대 버전은 파이썬, 2점대 버전은 go로 구축되어 있다. 이 둘은 호환성이 없으므로 주의해야 한다. 일반적으로 버전2를 많이 사용한다. 또한 registry는 5000번 포트를 사용한다.

 

 

* Private Registry 구축

컨테이너 시작

docker container run -d --restart=always -p 5000:5000  -v /registry:/var/lib/registry/docker/registry/v2 --name registry registry:latest

 다 완료한 후, 포트가 열렸는지 확인.

netstat -nlp | grep 5000

레지스트리에 있는 이미지 확인 (현재는 아무것도 없음)

curl -X GET http://localhost:5000/v2/_catalog

 

# 참고 : push / pull 할 때 "http: server gave HTTP response to HTTPS client" 비슷한 메시지가 발생하는 경우

사설 레지스트리를 구축한 자체 도커 서버에서 pull/push를 하는 경우는 문제가 없다. 하지만 외부에서 접속하는 경우, 도커 레지스트리에는 로그인 기능이 없다. 따라서 nginx의 기본 인증 기능을 사용한다. http 프로토콜은 인증을 지원하지 않으므로 반드시 https 프로토콜을 사용한다. 사설 레지스트리를 사용하는 다른 도커 엔진은 https 프로토콜을 사용해야 한다.

 

그러나 https 프로토콜을 쓰려면 복잡한 인증서 작업을 수행해야 한다. 사설 레지스트리에 접속할 다른 도커 엔진에 인증서 작업을 하지 않으려면, 도커 데몬에 insecure-registries 옵션을 설정하여 인증되지 않은 Registry를 사용할 수 있도록 해야 한다. /etc/docker/daemon.json 파일을 생성한 후, 아래와 같이 입력한다. (docker swarm을 사용한다면, 모든 노드에 아래와 같이 수정한다)

{
    "insecure-registries" : [ "도커서버ip:5000" ]
}

위 작업 후, docker 데몬을 재시작한다.

systemctl restart docker

docker info로 아래 내용 추가되었는지 확인

 

* 도커 이미지 업로드/다운로드하기 (도커허브, Private Registry)

 

1. 도커파일로 빌드하거나, 현재 보유한 이미지를 지정

아래와 같이 여러가지 이미지가 있을 것이다. 업로드할 이미지를 선택한다. 도커파일로 빌드할 때는 이름을 2번에 나오는 형식대로 지정한다.

 

2. 이미지에 태그 설정

이미지를 업로드하려면, 이미지에 Private Registry의 주소 또는 도커허브의 계정명을 명시해주어야 한다. 이러한 이름은 형식이 있다. 도커허브에 올리는 경우 계정명을 사용하고 (내 계정에 올리니깐) Private Registry에 올리는경우 해당 서버의 ip주소:포트번호 형식을 사용한다. 도커허브의 오피셜 이미지 (centos, nginx, mariadb 등등)는 이름 형식이 단순히 이미지명으로 되어있다. 아래 정리를 참고하자.

 

일반 이미지 형식 : 계정명(주소명:포트번호)/이미지명:태그 
오피셜 이미지 형식 : 이미지명:태그

 

따라서 아래 명령어로 이미지의 이름을 변경한다.

docker image tag 대상이미지명 새로운이미지정보

예시1 - 도커허브에 업로드용 : docker image tag sample utyk/sample:latest

예시2 - Private Registry에 업로드용 : docker image tag sample 192.168.1.61:5000/sample:latest

 

3. 업로드

 

* 도커허브에 업로드 : docker image push utyk/sample:latest  

도커허브에 업로드하려면, 해당 도커 엔진 서버에 utyk 계정으로 로그인이 되어있어야 한다. 로그인 관련해서는 아래 포스팅을 참고한다.

2020/03/31 - [Docker Basic] - [Docker Basic] 04. 도커 레지스트리와 도커허브

2020/04/09 - [Docker Basic] - [Docker Basic] 06. Docker 기본 명령어 - 시스템 명령

 

* Private Registry에 업로드 : docker image push 192.168.1.61:5000/sample:latest

 

4. 업로드 된 이미지 조회하기

 

* 도커허브

도커허브 사이트에서 내 계정으로 로그인하면, 아래와 같이 이미지가 올라간 것을 확인할 수 있다.

* Private Registry

Registry 컨테이너를 운영하고 있는 도커 엔진 서버에서, 다음 명령으로 이미지를 확인할 수 있다. 

curl -X GET http://도커서버IP:5000/v2/_catalog

 

5. Private 레지스트리에서 이미지를 다운로드하기

업로드 했던 이미지는 삭제해버리고, 다시 Private Registry에서 해당 이미지를 받아보자.

docker image pull 계정명(주소명:포트번호)/이미지명:태그
docker image pull 192.168.1.61:5000/sample:latest

 

* Registry 이미지 GUI tool "hyper"

Private Registry의 단점 중 하나는 어떤 이미지가 올라가 있는지 확인하기가 번거롭다는 것이다. 이를 위해 누군가가 WEB GUI로 Private Registry를 볼 수 있는 이미지를 만들었다. 아래 링크를 참고한다. 

https://hub.docker.com/r/hyper/docker-registry-web/

 

Docker Hub

 

hub.docker.com

설치하는 방법은 해당 링크에서 확인할 수 있으며, 가장 간단한 방법으로 한번 구축해본다. 또한 해당 링크 문서에서 작동하지 않는 버전이나 유의점이 있으므로 잘 참고해야 한다.

 

실행하기 

docker run -it -p 8080:8080 --name Registry_web --link Registry컨테이너이름 -e REGISTRY_URL=http://도커서버IP:5000/v2 -e REGISTRY_NAME=도커서버IP:5000 hyper/docker-registry-web

--link 에는 이미 구축해놓은 registry 컨테이너의 이름을 명시하며,  REGISTRY_NAME 부분은 WEB GUI에 나오는 이름이므로 자유롭게 쓰면 된다. 가능하면 해당 도커서버의 주소면 좀 더 보기 쉬우므로 추천된다.

 

위 명령을 실행하면, 아래와 같이 쭉 로그가 나오며, server startup 이라고 나온다.

해당 주소로 접속해보면, 아래와 같이 나오는 것을 확인할 수 있다.

이미지를 하나 올려보자.

 

다음과 같이 나오는 것을 확인할 수 있다.

# 참고

selinux가 설정되어 있는 경우, web registry 화면에서 에러가 날 수 있다. selinux를 허용하는 설정을 적용하거나, selinux를 해제해야 한다.

 

+ Recent posts