Harbor는 20년 CNCF(Cloud Native Computing Foundation)
의 오픈소스 프로젝트로 Docker hub
처럼 이미지를 저장할 수 있는 저장소이다. Docker는 이미 docker registry라는 이름으로 개인 이미지 저장소를 컨테이너화 하였습니다. Harbor는 사실 내부적으로 dcoker registry를 사용하고 있으며, 여기에 RBAC(Roll Base Access Control), Web page, Image scan 같은 기능을 추가하였습니다.
외부 서비스를 이용하는 것이 아닌 내부에서 이미지 파일을 저장하기 때문에 사내 보안 정책에도 알맛게 사용할 수 있습니다. 아니면 필요에 따라 S3, Minio(Object Storage Server)를 사용할 수 있기도 합니다.
docker registry를 사용시 가장 아쉬운 부분은 뭐니뭐니해도 GUI
복잡한 CLI과정을 편리하고 빠르게 단순하게 할 수 있게 기능을 제공하는 Harbor를 써야하는 이유 중 하나가 바로 이 부분입니다.
이미지 복제도 GUI로 할 수 있고 기본적인 이미지 삭제나 특정 기간을 지난 이미지 삭제 또는 가장 최근에 Pull 된 N개의 이미지만 제외하고 삭제하기 등 운용하기에 편하다는것이 사람들에게 널리 알려져 있는 상태입니다.
인증서 생성 및 기타 작업을 수행하기 위한 디렉터리를 생성합니다
$ cd ~
$ mkdir -p ~/certs
$ cd ~/certs
실제 RootCA (신뢰할 수 있는 루트 인증 기관)를 사용하는게 아니라면, 직접 CA (인증 기관)를 생성하여 Server의 인증서가 안전하다고 인증해주어야 합니다. 따라서 아래의 명령어로 개인용 Root CA 역할을 할 CA.key를 생성하고, CA.key의 짝이 되는 CA.crt 공개키를 생성합니다.
# Root CA의 비밀키 생성
$ openssl genrsa -out ca.key 4096
#Root CA의 비밀키와 짝을 이룰 공개키 생성
$ openssl req -x509 -new -nodes -sha512 -days 365 \
-key ca.key \
-out ca.crt
이번에는 서버의 인증서를 생성합니다. Root CA의 비밀키와 공개키를 만들 때와 마찬가지로 서버의 비밀키를 생성하고, 생성한 비밀키를 넣어 CSR 파일을 생성합니다. CSR 파일은 Certificate Signing Request 파일로, 인증서를 발급하기 위해 필요한 정보를 담고 있는 데이터입니다. CSR 파일은 SSL 발급을 신청하기 위해 해당 파일 내용을 Root CA에 제출하는 용도로 사용하게 됩니다.
# Server의 비밀키 생성
$ openssl genrsa -out server.key 4096
# Server의 CSR 파일 생성
$ openssl req -sha512 -new \
-key server.key \
-out server.csr
이제 위에서 생성한 서버의 CSR 파일을, 직접 만든 Root CA에 인증해달라고 요청하는 작업을 수행합니다. CSR 파일을 가지고 서버의 인증키를 생성하게 됩니다.
$ vi v3ext.cnf
# 아래 내용 추가
subjectAltName = IP:192.168.X.X,IP:127.0.0.1
v3v# 위 작업 수행 이후, SAN 등록하는 작업 수행
$ openssl x509 -req -sha512 -days 365 \
-extfile v3ext.cnf \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주합니다. 서버의 인증서라는 것을 표현하고 싶다면 .crt 형식이 아닌 .cert 형식으로 변환해주어야 합니다. 따라서 server.crt 파일을 server.cert 파일로 변환합니다.
$ openssl x509 -inform PEM -in server.crt -out server.cert
만들어진 인증서 파일들을 Docker와 Host에 등록, 업데이트하는 작업을 수행합니다.
# Docker
# host의 이름을 server라고 했으므로, /certs.d/server로 생성합니다.
sudo mkdir -p /etc/docker/certs.d/server
cp server.cert /etc/docker/certs.d/server/
cp server.key /etc/docker/certs.d/server/
cp ca.crt /etc/docker/certs.d/server/
# Host
sudo cp ca.crt /usr/local/share/ca-certificates/harbor-ca.crt
sudo cp server.crt /usr/local/share/ca-certificates/harbor-server.crt
sudo update-ca-certificates
Harbor는 Offline Install과 Online Install 두 가지 방식으로 설치를 지원하고 있습니다. 본 포스트에서는 Offline Install 을 기준으로 설치하도록 하겠습니다. 현재 2021년 5월 27일 기준으로 v2.2.2 릴리즈가 최신입니다.
# 홈 디렉터리로 이동합니다.
$ cd ~
# 설치 파일을 다운로드 합니다.
$ wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-offline-installer-v2.2.2.tgz
# 다운로드한 파일을 압축 해제 합니다.
$ tar xzvf harbor-offline-installer-v2.2.2.tgz
# 압축이 해제된 harbor 디렉터리로 이동하여 작업을 수행합니다.
$ cd ~/harbor
바로 위 문단에서 이동한 디렉터리에서 아래의 작업을 수행합니다. 기본적으로 디렉터리 내에는 harbor.yml.tmpl 파일이 존재합니다. 이 파일의 이름을 harbor.yml로 수정하고 내용을 필요에 맞게 수정합니다. 본 포스트에서는 아래 세 개의 내용을 수정했습니다.
$ cp harbor.yml.tmpl harbor.yml
$ vi harbor.yml
# 아래 내용 수정
hostname: {IP주소로 수정 (예시, 192.168.X.X)}
https.certificate: {server.cert로 수정 (예시, /etc/docker/certs.d/server/server.cert)
https.private_key: {server.key로 수정 (예시, /etc/docker/certs.d/server/server.key)
위 문단에서 작업한 harbor.yml의 작성이 끝나면, Harbor 설치의 사전 작업을 수행하는 prepare 스크립트를 실행합니다. prepare 스크립트는 결과적으로 prepare 컨테이너를 생성합니다.
prepare 작업을 완료했다면 이제 설치할 시간입니다. sudo 명령을 사용하지 않으면 권한 관련한 문제가 여럿 발생하는 것을 확인했습니다. sudo를 붙여주면 문제 없이 설치가 완료됩니다. 이 작업에는 시간이 조금 소요되니 차분히 커피 한 모금하며 기다려주시면 됩니다.
$ ./prepare
$ sudo ./install.sh
설치가 완료됐다면 이제 로그인해봅시다. .로그인할 때는 기본적으로 admin 과 Harbor12345 로 로그인할 수 있습니다. 보안상 최초 로그인 이후에 해당 패스워드를 변경해줄 필요가 있습니다.
Harbor의 프로젝에는 애플리케이션의 모든 repository가 포합됩니다. 참고로 프로젝트가 생성되기 전에는 이미지를 Harbor에 푸시 할 수 없습니다.
적절한 권한을 가진 유저만 프로젝트 작업을 원할히 수행 할 수 있습니다.
프로젝트 유형 2가지
Harbor 관리자 계정으로 로그인 하거나 프로젝트 관리자 계정으로 로그인해야 됩니다.
+USER
button을 눌러 등록된 계정의 Name과 Role을 지정하여 프로젝트의 멤버 추가를 합니다.ACTION
button을 클릭하여 역할을 변경하여 줍니다.설정탭
에서 프로젝트의 설정을 변경 할 수 있습니다.이미지 빌드 내역을 상세히 보고자 할 경우 확인하고자 하는 이미지를 선택할 경우 볼 수 있습니다.
Harbor내에서 사용자가 프로젝트에서 수행하는 모든 작업들을 로그로 확인 할 수 있습니다.
로그 내용을 필터링하여 볼 수 도 있습니다.
$ docker login harbor_address
docker pull harbor_address/프로젝트이름/이미지:태그
nabled content trust
를 활성화한 경우 unsigned image의 경우 pull 할 수 없습니다. 변경하고자 하는 경우 프로젝트 설정을 바꾸어야 합니다.프로젝트 구성 초기화를 GUI를 통해서 먼저 선행 하여야 합니다.
이미지 관리를 좀 더 효율적으로 사용하기 위해서 Trello, github등 여러 플랫폼의 라벨 관리를 서비스처럼 하보에서도 사용 할 수 있습니다.
Administrator
→ Configuration
→ Labels
프로젝트 디테일 페이지의 Labels
탭을 이용하여 라벨 생성, 변경, 삭제를 할 수 있습니다.
매번 docker CLI를 통하여 불편하게 태그를 지정하지 않고, 하버에서 이미지에 태그를 다시 지정할 수 있습니다.
release/app:stg -> release/app:prd
develop/app:v1.0 -> release/app:v1.0
이미지에 태그를 다시 지정하려면 원본 프로젝트에서 읽기 권한(게스트 역할 이상)이 있어야 하고 대상 프로젝트에서 쓰기 권한(개발자 역할 이상)이 있어야 합니다.
Harbour 인터페이스에서 태그를 다시 지정할 이미지를 선택하고 을 클릭 Retag
합니다.
태그 재지정 창에서 프로젝트 이름, 저장소 이름, 새 태그 이름을 입력하고 확인 을 클릭합니다 .
안녕하세요:) 글 잘 읽었습니다!! 지식 공유 감사해요 ㅎㅎ
다름이 아니라 따라하는 과정에서 에러가 발생해서 혹시 같은 문제가 없으셨는지 문의드리고 싶습니다!
sudo ./install.sh를 진행하는 과정에서 [Step 4]에
FileNotFoundError: [Errno 2] No such file or directory: '/hostfs/etc/docker/certs.d/server/server.key'
이러한 에러가 발생하는데, server.key의 경로를 Hyeseong님과 동일하게 설정한 것 같은데 에러가 발생하였습니다. 혹시 문제가 어떤 것인지 아시나요 ..?