사내용 도커 이미지 저장소를 구축할 방법을 찾던 중, 오픈 소스인 Harbor를 이용하여
구현했던 과정을 글로 적어보았습니다.
당시 사용한 버전(v1.8.0)과 현재 나온 최신 버전과는 차이가 있을 수 있습니다.
문제가 있다면 얼마든지 댓글에 남겨주세요 :)
Docker에서는 Docker Hub라는 공용 Docker Image 관리 서비스를 제공하고 있다.
그러나 Hub에 올리는 이미지는 누구나 접근 가능하므로
기업의 내부 프로젝트, 또는 공개하고 싶지 않은 개인 프로젝트를 진행하는 경우 사적인 저장소가 필요하다.
Docker에서 제공하는 응용 프로그램이다. [링크]
개인 저장소 구축이 가능하며, 이미지 저장 후 아래와 같은 코드들을 통해 관리할 수 있다.
저장된 이미지 목록 확인:
$ curl -X GET http://localhost:5000/v2/_catalog
{"repositories":["golang"]}
특정 이미지의 태그 확인:
$ curl -X GET http://localhost:5000/v2/golang/tags/list
{"name":"golang","tags":["latest"]}
docker registry는 간결하지만 CLI환경에서만 이용할 수 있다.
매번 코드 입력을 통해서만 이미지를 관리할 수 있기 때문에, 다수의 이미지를 관리하거나 다른 개발자와 협업 시 번거로움이 따른다.
Harbor는 registry의 장점을 포함하여 직관적인 Web 기반 User Interface를 제공하기 때문에 효율적인 이미지 관리가 가능하다.
사용 버전: v1.8.0
호스트 서버에 Harbor를 설치한다. 설치 시 사용하고자 하는 주소를 등록한다.
Harbor 설치 안내 문서 (v1.10 기준)
//☝참고: 등록하려는 주소는 IP주소 혹은 정규화된 도메인 이름(FQDN)이어야 한다.//
Harbor의 설치가 완료되면 접속 가능한 포털 주소와 관리자 계정이 제공된다.
포털은 서버나 브라우저를 통해 접속할 수 있다.
아래 이미지는 브라우저를 통해 포털에 접속했을 때 나타나는 페이지다.
관리자 계정에는 생성된 모든 프로젝트 및 이미지에 대한 관리 권한이 존재한다.
실제 개발 작업 시에는 각 사용자 계정을 등록하여 프로젝트와 이미지를 관리한다.
admin 계정으로 로그인하면 아래와 같은 페이지가 나타난다.
Harbor에서는 Registry가 아닌 'Project'라는 이름으로 정보 저장소를 제공한다.
'NEW PROJECT' 버튼을 클릭하여 새 프로젝트를 만들 수 있다.
프로젝트 생성 시, 공개 여부를 선택할 수 있다. 추후 프로젝트 페이지의 Configuration 탭에서 수정할 수 있다.
프로젝트가 생성되면 아래와 같이 목록에 나타난다.
생성된 프로젝트를 클릭하면 저장된 이미지의 목록을 보여주는 Repositories 탭을 비롯해 다양한 관리 탭이 존재한다.
각 탭의 기능에 대한 자세한 정보는 페이지 맨 아래 참조사이트에서 얻을 수 있다.
Client로 포털에 접속하여 도커 이미지를 업로드하고 다운로드 받을 수 있다.
로그인 명령:
$ sudo docker login https://[DOMAIN NAME]:[PORT]
☝참고: Harbor 설치 - domain 등록 단계에서 기본 Port (http(80), https(443))로 설정하면 따로 Port를 입력할 필요가 없다.
로그인에 성공하면 아래와 같은 결과가 나타난다.
$ sudo docker login https://security.test.com:5000
Username: admin
Password:
Login Succeeded
이미지 업로드.
저장소에 이미지를 push하려면 'docker tag'명령을 통해 업로드하려는 이미지에 저장소의 주소와 프로젝트의 이름을 명시해야 한다.
$ sudo docker tag SOURCE_IMAGE[:TAG] [MyDomain.com]:[PORT]/[PROJECT]/IMAGE[:TAG]
e.g.:
$ sudo docker tag golang security.test.com:5000/test/golang:0.1
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
security.test.com:5000/test/golang 0.1 9fe4cdc1f173 3 weeks ago 774MB
push 명령:
$ sudo docker push [MyDomain.com]:[PORT]/[PROJECT]/IMAGE[:TAG]
e.g.:
$ sudo docker push security.test.com:5000/test/golang:0.1
The push refers to repository [security.test.com:5000/test/golang]
0.1: digest: sha256:e9741a00df83e432e89285f66bb417733e3daa65e50dc1cf1167c4c83a288c53 size: 1796
☝참고: UI페이지에서 'PUSH IMAGE'버튼을 클릭하면 해당 저장소의 tag 및 push 명령어를 제공한다. 옆의 아이콘을 클릭하면 명령어가 클립보드에 저장된다.
push가 완료되면 UI페이지에서 저장된 이미지를 확인할 수 있다.
이미지를 클릭하면 이미지의 버전을 포함해 상세한 내용을 알 수 있다.
이미지 다운로드.
먼저, 방금 전에 push 했던 이미지를 삭제해준다.
$ sudo docker rmi security.test.com:5000/test/golang:0.1
Pull 명령:
$ sudo docker pull [MyDomain.com]:[PORT]/[PROJECT]/IMAGE[:TAG]
e.g.:
$ sudo docker pull security.test.com:5000/test/golang:0.1
0.1: Pulling from test/golang
Digest: sha256:e9741a00df83e432e89285f66bb417733e3daa65e50dc1cf1167c4c83a288c53
Status: Downloaded newer image for security.test.com:5000/test/golang:0.1
삭제했던 이미지가 다시 생성된 것을 볼 수 있다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
security.test.com:5000/test/golang 0.1 9fe4cdc1f173 3 weeks ago 774MB
☝참고: 'Pull Command'란의 아이콘을 클릭하면 해당 이미지의 pull 명령어가 클립보드에 저장된다.
사용하지 않는 프로젝트나 이미지는 UI페이지에서 삭제할 수 있다.
삭제할 프로젝트를 선택하고 'DELETE'버튼을 클릭한다.
프로젝트에 이미지가 들어 있는 경우 에러가 나며 삭제되지 않는다.
이미지를 삭제한 후 프로젝트를 삭제할 수 있다.
프로젝트의 삭제 방법과 동일하다.
삭제할 이미지를 선택하고 'DELETE'버튼을 클릭하여 삭제한다.
☝참고: Harbor를 설치하기 전 'harbor.yml'파일에서 data_volume을 설정할 수 있다.
도커 이미지를 통한 다양한 운영체제, 라이브러리의 구축 및 서비스 배포의 편리함은 이미 많은 사람들이 알고 있다고 생각한다.
그 안에서도 Harbor를 비롯한 오픈소스 도커 이미지 저장소는 도커를 활용한 서비스 배포 효율성을 한층 더 끌어올려줄 것이다.