환경: [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 |