티스토리 뷰

Private Registry

매번 Docker 이미지를 만들기 위해서 Dockerfile을 빌드하는 건 너무 오래걸린다.

 

때문에, 만들어 놓은 Docker 이미지를 docker registry에 저장(push)해놓고 다운로드(pull)해서 사용할 일이 생긴다.

 

그런데 내가 담당하고 있는 프로젝트가 외부로 노출되지 않게(private하게) 사용해야 할 경우 어떻게 해야할까?

 

기본적으로 사용되는 Docker Registry인 Docker Hub는,

 

아쉽게도 public Registry만 Free tier로 제공한다.

 

 

또한, Docker Hub에서 제공하고 있는 저장소는 로컬에 저장하는게 아니라 외부 저장소기 때문에 무작정 사용하기에는 너무 불안하다.

 

이러한 문제를 해결하기 위해 Private Container Registry 설정을 로컬에 할 수 있는 도구가 필요한데, 가장 일반적으로 사용되는게 Harbor다.

Harbor란?

Harbor는 Docker 이미지를 저장, 관리 및 배포하기 위한 오픈 소스 컨테이너 레지스트리이다.

 

Harbor는 컨테이너 이미지를 저장하기 위한 중앙 집중식 리포지토리를 제공하므로 팀이 조직 전체에서 이미지를 쉽게 공유하고 협업할 수 있게 된다.

 

이러한 핵심 기능 외에도 Harbor는 역할 기반 액세스 제어, 취약성 검색, 복제 및 널리 사용되는 CI/CD 파이프라인과의 통합을 비롯한 다양한 고급 기능 또한 제공한다.

 

전반적으로 Harbor는 컨테이너 관리 프로세스를 간소화하고 컨테이너화된 애플리케이션의 보안 및 규정 준수를 개선하려는 모든 조직에 유용한 도구이다.

 

installation and configuration

installation

처음 설치 페이지로 가면 상당히 당황스러운데 wget을 쓰면 다운로드할 수 있다.

# 압축파일 다운로드 
wget https://github.com/goharbor/harbor/releases/download/v1.10.17/harbor-offline-installer-v1.10.17.tgz
# 압축 풀기
tar xvf harbor-offline-installer-v1.10.17.tgz
# ./harbor 아래에 압축이 풀린다.

 

Configure yml

다음은 설치를 위해서 ./harbor/harbor.yml 파일 설정을 해준다.


hostname은 반드시 외부에서 접근 가능한 IP 혹은 DNS 설정된 URL로 지정해 주어야한다.

# Configuration file of Harbor

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: [hostname]

# http related config
http:
  # port for http, default is 80.If https enabled, this port will redirect to https port
  port: [http port]

# https related config
https:
  # https port for harbor, default is 443
  port: [https port]
  # The path of cert and key files for nginx
  certificate: [.crt path]
  private_key: [.key path]
...
# 나머지는 딱히 건드리지 않았음
data_volume: /data
...

https는 다음 단계에서 추가 설명

 

이 외에 별도의 설정은 하지 않았으나, 레지스트리의 저장공간이 /data 경로로 설정되어 있다. 저장 공간을 외부로 지정할 때 이 부분을 수정하면 된다.

 

Configure HTTPS

Harbor로 https 연결 할 경우 추가 설정이 필요하다. Habor 홈페이지에서도 production 용 서비스에서는 https 연결을 권장한다.

# 1. ca private key 생성
openssl genrsa -out ca.key 4096
# 2. ca cert 생성
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=KR/ST=SEOUL/L=SEOUL/O=Pineone/OU=Lab/CN=[hostname]" \
-key ca.key \
-out ca.crt
# 3. service cert 생성
openssl genrsa -out [hostname]:[https port].key 4096

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=[hostname]
DNS.2=harbor.ks.io
DNS.3=harbor
EOF

# 4. v3.ext 파일을 이용해 Harbor 호스트에 대한 인증서 생성
openssl x509 -req -sha512 -days 3650     -extfile v3.ext     -CA ca.crt -CAkey ca.key -CAcreateserial     -in [hostname]:[https port].csr     -out [hostname]:[https port].crt

# Harbor와 Docker에 인증서 제공하기
cp [hostname]:[https port].crt /data/cert/
cp [hostname]:[https port].key /data/cert/

# Docker에서 쓸수있도록 crt파일 형식을 cert로 변경
openssl x509 -inform PEM -in [hostname]:[https port].crt -out [hostname]:[https port].cert

# Docker 인증서 디렉토리로 이동
# /etc/docker/certs.d/ 디렉토리가 안만들어져 있으면 그냥 만들어서 하면 됨
cp [hostname]:[https port].cert /etc/docker/certs.d/[hostname]:[https port]/
cp [hostname]:[https port].key /etc/docker/certs.d/[hostname]:[https port]/
cp ca.crt /etc/docker/certs.d/[hostname]:[https port]/

# Docker 엔진 restart
# 현재 실행중인 도커 컨테이너가 재시작 안되는 것들이 있으니 주의할 것
systemctl restart docker

private key 이름과 cert key 이름, 그리고 상위 패스를 모두 [hostname]:[https port]로 지정했다.

 

별다른 이유는 없고, 그냥 홈페이지에서 가이드해주는 대로 했다. 보통 내 맘대로하다가 꼬이는 경우가 많기 때문에...

 

run the Installer Script

./prepare
./install.sh

위 스크립트가 정상적으로 수행 된 다음

docker-compose ps 

위와 같이 출력되면 정상적으로 설치된 것이다.

  • 다음 브라우저에서 https://[hostname]:[https port] 이 페이지가 나오면 정상적으로 설치된 것이다.

 

아쉽게도, 도커 레지스트리를 저장하는데 까진 작업을 진행하지 못했다.

 

하지만 사용 이유와 설치 방법을 알고 있으니 다음에는 제대로 사용할 떄 잘 쓸 수 있을거 같다.

 

설정이 완료되었다면, 아래와 같이 로그인 후 push 하면 이미지를 private 저장소에 저장할 수 있다고 한다.

docker login [hostname]:[https port]
docker push [hostname]:[https port]/myproject/myrepo:mytag

 

마치며

이 작업을 리버스 프록시가 이미 설정된 온프레미스 서버에서 진행해서 다른 문제가 발생 했다.

 

harbor의 default 리버스 프록시인 nginx가 아닌 별도의 리버스 프록시를 탄 후에 redirect해서 사용해서 발생한 문제였다.이 문제는 다음 포스팅에서 다루도록 하겠다.

 

일반적인 로컬환경에서 작업했다면 위의 작업들만으로도 충분히 사용할 수 있을 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함