본문 바로가기
Docker

Harbor Private Registry 설치 및 설정

by beann 2023. 7. 20.
반응형

환경: [ROCKY LINUX]

1. 개요

Harbor Docker Image Registry를 구축하여 Docker Image를 Push / Pull을 하는 방법에 대한 가이드입니다.

 

2. 사전준비사항

## docker Install
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli


## docker-compose Install
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

## docker-compose command 정상 작동 확인
docker-compose --version

 


3. 구성

3.1 인증서 생성 

#Certification 파일 디렉터리 생성
mkdir ~/certs
cd ~/certs

#CA인증서 개인키 생성
openssl genrsa -out ca.key 4096

#CA인증서 개인키를 활용하여 인증서 생성
#아래 커맨드를 입력하면,여러가지를 물어보는데 별도로 설정하지 않으려면 엔터치면 됩니다.
openssl req -x509 -new -nodes -sha512 -days 365 \
-key ca.key \
-out ca.crt

#Server Certificates 생성 [Harbor서버의 IP 또는 dns주소 이름으로 생성 해야합니다.]
openssl genrsa -out harbor.sj.io.key 4096


#Server의 CSR 파일 생성
#아래 커맨드를 입력하면,여러가지를 물어보는데 별도로 설정하지 않으려면 엔터치면 됩니다.
openssl req -sha512 -new \
-key harbor.sj.io.key \
-out harbor.sj.io.csr


#FQDN또는 IP주소를 사용하는지에 대한 관계 없이 Harbor 호스트에 대한 인증서를 생성할 수 있도록 v3ext파일을 만들어야 합니다.
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names


[alt_names]
DNS.1=123.456.789.123 #하버서버 IP주소
DNS.2=harbor.sj.io
DNS.3=harbor
EOF


# 위파일을 만들었으면, 해당파일을 가지고 하버호스트에 대한 인증서를 생성합니다. 
openssl x509 -req -sha512 -days 365 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.sj.io.csr \
-out harbor.sj.io.crt


# 서버 인증서와 키를 Harbor 호스트의 인증서 폴더에 복사합니다.
mkdir -p /data/cert
cp harbor.sj.io.crt /data/cert/
cp harbor.sj.io.key /data/cert/


# docker에서 인증서를 인식할 수 있도록 crt를 cert로 변환합니다.
openssl x509 -inform PEM -in harbor.sj.io.crt -out harbor.sj.io.cert

# host의 이름을 harbor.sj.io라고 했으므로, /certs.d/harbor.sj.io로 생성합니다.
mkdir -p /etc/docker/certs.d/harbor.sj.io
cp harbor.sj.io.cert /etc/docker/certs.d/harbor.sj.io/
cp harbor.sj.io.key /etc/docker/certs.d/harbor.sj.io/
cp ca.crt /etc/docker/certs.d/harbor.sj.io/

 

 

### HTTPS 연결이 안된다면 아래와 같이 진행합니다. ###

(아래와 같이 OS단에서 인증서를 신뢰할 수 있도록 설정 해야할 수 있음.)

#[CentOS기준]  update-ca-trust ##커맨드가 없다면 아래 커맨드를 실행하여 설치 진행 
sudo yum update 
sudo yum install ca-certificates 
cp harbor.sj.io.crt /etc/pki/ca-trust/source/anchors/harbor.sj.io.crt  
update-ca-trust

 

 

 

3.2 도커 재시작

systemctl restart docker

 

 

3.3 Harbor package 다운로드

#홈 디렉터리로 이동합니다. 
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 수정 
cp harbor.yml.tmpl harbor.yml 
vi harbor.yml 
hostname: harbor.sj.io 
https.certificate: /etc/docker/certs.d/harbor.sj.io/harbor.sj.io.cert 
https.private_key: /etc/docker/certs.d/harbor.sj.io/harbor.sj.io.key

 

 

 

3.3 하버 Deploy 및 로그인

# 하버 서버에서 hosts파일 내용을 수정합니다. 
vi /etc/hosts {하버서버IP} harbor.sj.io  
cd ~/harbor ./prepare ./install.sh   

#하버 로그인 
docker login harbor.sj.io 또는  docker login IP

 

 

 

3.4 하버 접속 및 Project 생성

* Harbor Project란 Harbor에서 관리되는 Docker image, HelmCharts를 그룹화하는 가장 기본단위입니다.

 

- Projects > NEW PROJECT 버튼 클릭

 

- Project Name: 프로젝트 네임 설정

- Access Level: Public으로 설정하게 되면, 해당 Project에 누구나 접근할 수 있도록 생성하게 됩니다. Private으로 생성하게 되면 해당 Project에 Member로 등록된 계정에 한해 Role에 따라 Pull, Push를 할 수 있게됩니다.

- Storage Quota: 해당 Project에서 사용할 Storaeg Quota를 설정합니다.

- Proxy Cache: 해당 설정을 On하면 해당 Project에 없는 Docker image를 Pull 할 경우, 대상 Registry에서 Image를 Pull하고 해당 Registry에 Image를 캐시합니다. 대상 Registry는 사전에 미리 설정해야합니다.

 

Docker Image Push

# Harbor에 Docker image를 Push합니다. 
# 만약 이미지가 없다면 아래와 같이 Docker hub에서 받아옵니다. 
# 이미지를 받아오고 tag옵션을 통해 Image Name을 변경해줍니다. 
docker pull nginx 
docker tag nginx harbor.sj.io/dev/testimage:1.0 
docker push harbor.sj.io/dev/testimage:1.0

 

- Repository에 image가 올라간 것을 확인합니다.

 

- 다음은 2.0 버전을 push해봅니다.

 

해당 repository에 2.0도 정상적으로 업로드 된 것을 확인할 수 있습니다.

 

 

참고자료

- https://goharbor.io/docs/2.7.0/install-config/configure-https/

https://goharbor.io/docs/2.7.0/install-config/troubleshoot-installation/#https

 

 

 


추가

만약 Harbor의 admin계정 비밀번호를 잊어버렸을 때는 DB에 직접 접속하여 비밀번호를 업데이트하는 방법이 있습니다.

$ docker ps
CONTAINER ID   IMAGE                                COMMAND                  CREATED      STATUS                PORTS                                                                            NAMES
b9f8d956bfd1   goharbor/nginx-photon:v2.2.2         "nginx -g 'daemon of…"   4 days ago   Up 4 days (healthy)   0.0.0.0:80->8080/tcp, :::80->8080/tcp, 0.0.0.0:443->8443/tcp, :::443->8443/tcp   nginx
ce75cb999ecd   goharbor/harbor-jobservice:v2.2.2    "/harbor/entrypoint.…"   4 days ago   Up 4 days (healthy)                                                                                    harbor-jobservice
1a9a1fa7baee   goharbor/harbor-core:v2.2.2          "/harbor/entrypoint.…"   4 days ago   Up 4 days (healthy)                                                                                    harbor-core
7968c2f48ec9   goharbor/harbor-portal:v2.2.2        "nginx -g 'daemon of…"   4 days ago   Up 4 days (healthy)                                                                                    harbor-portal
7270fe902cad   goharbor/redis-photon:v2.2.2         "redis-server /etc/r…"   4 days ago   Up 4 days (healthy)                                                                                    redis
8b2154aa06e9   goharbor/harbor-registryctl:v2.2.2   "/home/harbor/start.…"   4 days ago   Up 4 days (healthy)                                                                                    registryctl
031791d01fca   goharbor/harbor-db:v2.2.2            "/docker-entrypoint.…"   4 days ago   Up 4 days (healthy)                                                                                    harbor-db
0cd44c936845   goharbor/registry-photon:v2.2.2      "/home/harbor/entryp…"   4 days ago   Up 4 days (healthy)                                                                                    registry
f4aa97a5ad5e   goharbor/harbor-log:v2.2.2           "/bin/sh -c /usr/loc…"   4 days ago   Up 4 days (healthy)   127.0.0.1:1514->10514/tcp                                                        harbor-log

$ docker exec -it 031791d01fca sh
$ psql -U postgres
$ \c registry
$ update harbor_user set salt='', password='Harbor12345' where user_id= 1;
$ exit
$ exit
$ docker-compose down -v
$ docker-compose up -d

 


 

 

반응형

'Docker' 카테고리의 다른 글

Dockerfile Best Practice #2  (0) 2024.03.18
Dockerfile Best Practice #1  (0) 2024.03.17