Harbor를 이용한 Private Docker Registry 구축

김성수·2020년 9월 24일
4

사내용 도커 이미지 저장소를 구축할 방법을 찾던 중, 오픈 소스인 Harbor를 이용하여
구현했던 과정을 글로 적어보았습니다.

당시 사용한 버전(v1.8.0)과 현재 나온 최신 버전과는 차이가 있을 수 있습니다.
문제가 있다면 얼마든지 댓글에 남겨주세요 :)


개요

  • Private Docker Registry를 사용하는 이유와 방법에 대해 설명한다.
  • Harbor를 다루는 방법에 대해 알 수 있다.

Private Docker Registry

Docker에서는 Docker Hub라는 공용 Docker Image 관리 서비스를 제공하고 있다.

그러나 Hub에 올리는 이미지는 누구나 접근 가능하므로

기업의 내부 프로젝트, 또는 공개하고 싶지 않은 개인 프로젝트를 진행하는 경우 사적인 저장소가 필요하다.

Registry

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"]}

Harbor

docker registry는 간결하지만 CLI환경에서만 이용할 수 있다.

매번 코드 입력을 통해서만 이미지를 관리할 수 있기 때문에, 다수의 이미지를 관리하거나 다른 개발자와 협업 시 번거로움이 따른다.

Harbor는 registry의 장점을 포함하여 직관적인 Web 기반 User Interface를 제공하기 때문에 효율적인 이미지 관리가 가능하다.

  • Docker Image 개인 저장소 제공
  • Cloud-Native 기반 오픈 소스
  • Web UI 제공
  • 1개까지만 무료인 docker registry와 달리, 추가 요금 없이 다수의 registry 생성 가능(프로젝트별 이미지 분류 용이)

호스트 서버 구축

Harbor 설치

사용 버전: v1.8.0

호스트 서버에 Harbor를 설치한다. 설치 시 사용하고자 하는 주소를 등록한다.

Harbor 설치 안내 문서 (v1.10 기준)

//☝참고: 등록하려는 주소는 IP주소 혹은 정규화된 도메인 이름(FQDN)이어야 한다.//


Harbor 접속

Harbor의 설치가 완료되면 접속 가능한 포털 주소와 관리자 계정이 제공된다.

포털은 서버나 브라우저를 통해 접속할 수 있다.

아래 이미지는 브라우저를 통해 포털에 접속했을 때 나타나는 페이지다.

관리자 계정에는 생성된 모든 프로젝트 및 이미지에 대한 관리 권한이 존재한다.

실제 개발 작업 시에는 각 사용자 계정을 등록하여 프로젝트와 이미지를 관리한다.

admin 계정으로 로그인하면 아래와 같은 페이지가 나타난다.


프로젝트 관리

Harbor에서는 Registry가 아닌 'Project'라는 이름으로 정보 저장소를 제공한다.


프로젝트 만들기

'NEW PROJECT' 버튼을 클릭하여 새 프로젝트를 만들 수 있다.

프로젝트 생성 시, 공개 여부를 선택할 수 있다. 추후 프로젝트 페이지의 Configuration 탭에서 수정할 수 있다.

프로젝트가 생성되면 아래와 같이 목록에 나타난다.


프로젝트 페이지

생성된 프로젝트를 클릭하면 저장된 이미지의 목록을 보여주는 Repositories 탭을 비롯해 다양한 관리 탭이 존재한다.

각 탭의 기능에 대한 자세한 정보는 페이지 맨 아래 참조사이트에서 얻을 수 있다.


Push & Pull

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

이미지 업로드.

저장소에 이미지를 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페이지에서 저장된 이미지를 확인할 수 있다.

이미지를 클릭하면 이미지의 버전을 포함해 상세한 내용을 알 수 있다.


Pull

이미지 다운로드.

먼저, 방금 전에 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'버튼을 클릭하여 삭제한다.


Volume

  • Harbor는 data를 Host서버의 특정 디렉터리에 저장할 수 있도록 'data_volume'옵션을 제공한다.
  • data_volume을 설정하면 프로젝트 및 이미지 데이터를 지정된 디렉터리에 백업할 수 있다.
  • Harbor 서비스가 삭제되거나 UI페이지에서 데이터를 삭제해도 volume 디렉터리에 있는 데이터에는 영향을 끼치지 않는다.

☝참고: Harbor를 설치하기 전 'harbor.yml'파일에서 data_volume을 설정할 수 있다.


결론

도커 이미지를 통한 다양한 운영체제, 라이브러리의 구축 및 서비스 배포의 편리함은 이미 많은 사람들이 알고 있다고 생각한다.

그 안에서도 Harbor를 비롯한 오픈소스 도커 이미지 저장소는 도커를 활용한 서비스 배포 효율성을 한층 더 끌어올려줄 것이다.

참조 사이트

profile
뿌리가 튼튼한 사람이 되고자 합니다.

0개의 댓글