본문 바로가기
DevOps/CICD

[DevOps] Harbor를 활용한 private registry 구축

by Yoon_estar 2024. 12. 6.
728x90

1. 환경 정보

  • OS : Ubuntu24.04
  • Docker : 27.3.1
  • Docker Compose version v2.25.0

 

2. 사전 준비

2.1 Docker 설치

sudo apt update
sudo apt install docker.io

 

2.2 Docker Compose 설치

sudo curl -L "https://github.com/docker/compose/releases/download/v2.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version  # 설치 확인

 

 

3. 인증서 생성 및 구성

 

  • Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주
  • 서버의 인증서라는 것을 표현하고 싶다면 .crt 형식이 아닌 .cert 형식으로 변환해주어야 하고 server.crt 파일을 server.cert 파일로 변환

 

3.1 Certification 파일 디렉터리 생성

mkdir ~/certs
cd ~/certs

 

3.2 Root CA (인증 기관) 생성

  • 실제 RootCA (신뢰할 수 있는 루트 인증 기관)를 사용하는게 아니라면, 직접 CA (인증 기관)를 생성하여 Server의 인증서가 안전하다고 인증해주어야 한다.
  • 따라서 아래의 명령어로 개인용 Root CA 역할을 할 CA.key를 생성하고, CA.key의 짝이 되는 CA.crt 공개키를 생성
openssl genrsa -out ca.key 4096

#CA인증서 개인키를 활용하여 인증서 생성

#아래 커맨드를 입력하면,여러가지를 물어보는데 별도로 설정하지 않으려면 엔터치면 됨

openssl req -x509 -new -nodes -sha512 -days 365 -key ca.key -out ca.crt

 

3.3 서버 인증서 생성

  • 서버의 인증서를 생성한다.
  • Root CA의 비밀키와 공개키를 만들 때와 마찬가지로 서버의 비밀키를 생성하고, 생성한 비밀키를 넣어 CSR 파일을 생성한다.
  • CSR 파일은 Certificate Signing Request 파일로, 인증서를 발급하기 위해 필요한 정보를 담고 있는 데이터
  • CSR 파일은 SSL 발급을 신청하기 위해 해당 파일 내용을 Root CA에 제출하는 용도로 사용하게 된다
  • 생성할 때 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

 

 

3.4 SAN 등록 

이제 위에서 생성한 서버의 CSR 파일을, 직접 만든 Root CA에 인증해달라고 요청하는 작업을 수행한다 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=192.168.207.210 #하버서버 IP주소
DNS.2=harbor.sj.io
DNS.3=harbor
EOF

 

3.5 서버 인증서 생성

# 위파일을 만들었으면, 해당파일을 가지고 하버호스트에 대한 인증서를 생성합니다. 
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

 

3.6 인증서 파일 복사

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

3.7 Docker 인증서 업데이트

Docker에서는 .crt 파일을 CA (인증 기관)의 인증서라고 간주

서버의 인증서라는 것을 표현하고 싶다면 .crt 형식이 아닌 .cert 형식으로 변환해주어야 하고 server.crt 파일을 server.cert 파일로 변환

# .crt를 .cert로 변환
openssl x509 -inform PEM -in harbor.sj.io.crt -out harbor.sj.io.cert

# Docker 인증서 디렉터리 생성 및 복사
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/

# 인증서 시스템 신뢰 설정
cp ca.crt /usr/local/share/ca-certificates/harbor.sj.io.crt
sudo update-ca-certificates

# Docker 재시작
sudo systemctl restart docker

참고

HTTPS 연결이 안된다면 아래와 같이 진행

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

# 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

4. Harbor 설치

4.1 Harbor 패키지 다운로드 및 압축 해제

#홈 디렉터리로 이동
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

 

4.2 Harbor 설정 파일 수정

# 호스트네임 및 인증서 위치 설정을 위해 harbor.yml 수정 
cp harbor.yml.tmpl harbor.yml 
vi harbor.yml 
hostname: harbor.sj.io 
certificate: /etc/docker/certs.d/harbor.sj.io/harbor.sj.io.cert 
private_key: /etc/docker/certs.d/harbor.sj.io/harbor.sj.io.key

 

5. 하버 Deploy 및 로그인

위 문단에서 작업한 harbor.yml의 작성이 끝나면, Harbor 설치의 사전 작업을 수행하는 prepare 스크립트를 실행

prepare 스크립트는 결과적으로 prepare 컨테이너를 생성

# 하버 서버에서 hosts파일 내용을 수정합니다.
vi /etc/hosts 
192.168.207.210 harbor.sj.io 
(  {하버서버IP} harbor.sj.io  )

cd ~/harbor
./prepare 
./install.sh

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

admin
Harbor12345

 

  • 완료 Message
[Step 5]: starting Harbor ...
WARN[0000] /root/harbor/docker-compose.yml: `version` is obsolete
[+] Running 9/10
 ⠹ Network harbor_harbor        Created                                                                                 4.7s
 ✔ Container harbor-log         Started                                                                                 1.3s
 ✔ Container redis              Started                                                                                 2.0s
 ✔ Container harbor-portal      Started                                                                                 1.9s
 ✔ Container registry           Started                                                                                 2.0s
 ✔ Container registryctl        Started                                                                                 2.0s
 ✔ Container harbor-db          Started                                                                                 2.0s
 ✔ Container harbor-core        Started                                                                                 2.7s
 ✔ Container nginx              Started                                                                                 4.0s
 ✔ Container harbor-jobservice  Started                                                                                 3.2s
✔ ----Harbor has been installed and started successfully.----

 

6. 완료

 

7. TEST

docker tag nginx:latest harbor.sj.io/test/nginx:1.0
docker push harbor.sj.io/test/nginx:1.0

8. 재부팅 후 재시작 시 manual

재부팅하면 harbor 웹이 올라오지 않는다 이때 아래와 같이 docker-compose를 해주면 정상적으로 web page로 접근 가능하다.

# cd /root/harbor
# docker-compose down
# docker-compose up -d