vm을 운영하던 중 하버 이미지 프라이빗 레지스트리를 사용해서 배포 및 ci/cd를 진행하려고 한다.
기존 docker-compose 로 컨테이너 패키징 하여 사이드 프로젝트 시 개발자 별로 도커 컴포즈를 이용하여 로컬 개발환경을 production 레벨의 배포 전 단계의 빌드업을 위해서 vm환경에 사이드 프로젝트 배포 프로세스를 갖추려고 한다.
현재 프로젝트 레벨 혹은 아키텍처에서는 많은 리소스를 사용하지 않기때문에 docker-compose로도 충분히 가능하고 굳이 프라이빗 레지스트리를 운영할 필요도 없다는 것을 인지하고 있다.
학습을 위해 docker-hub가 아닌 레지스트리를 선택했으며, harbor를 택했다. 추가적으로 ssl 적용을 위해 자체서명 crt파일을 사용하였다.
현재 사이드 프로젝트는 harbor 레지스트리를 통해 도커이미지 파일을 push하고 지속적으로 배포및 업데이트를 진행하고 있다.
이미지 레지스트리 (Image Registry)는 도커 이미지와 같은 컨테이너 이미지를 저장하고 관리하는 중앙 저장소 역할을 한다. 이는 팀 협업 및 배포 자동화 (CI/CD)에 있어 핵심적인 역할을 하며, 다양한 환경에서 일관된 이미지를 제공할 수 있도록 돕고있다.
1. 퍼블릭 레지스트리 (Public Registry):
• 누구나 접근 가능.
• 예: Docker Hub, Google Container Registry (GCR).
2. 프라이빗 레지스트리 (Private Registry):
• 특정 조직이나 개인만 접근 가능.
• 예: Harbor, AWS Elastic Container Registry (ECR), GitLab Container Registry.
1. tar 다운로드
wget https://github.com/goharbor/harbor/releases/download/v<버전>/harbor-offline-installer-v<버전>.tgz
2. 압축해제
tar xvf harbor-offline-installer-*.tgz
3.해당 harbor 디렉토리로 이동하여
4. harbor.yml파일을 수정 -> 기본적으로 하버 yml의 템플릿 파일이 있어서
해당 파일 복사해서 사용해도됨
5. sudo ./install.sh 설치 및 실ㅎㅇ
docker ps 로 확인
관리자 기본 계정은 harbor.yml에서 설정할 수 있다
hostname: <ip> # 실제 IP 주소
harbor_admin_password: "test"
https:
port: 8443 - https 적용할 포트
certificate: crt파일 경로
private_key: key파일 경로
data_volume: /data/harbor
# jobservice 설정
jobservice:
max_job_workers: 10
job_loggers: file # 로그를 파일로 저장
log:
level: info
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 2.0.0
proxy:
http_proxy: ""
https_proxy: ""
no_proxy: 127.0.0.1,localhost
자체 서명 인증서 생성
openssl req -newkey rsa:2048 -nodes -keyout /경로/파일이름.key -x509 -days 365 -out /경로/파일이름.crt
sudo mkdir -p /etc/docker/certs.d/harbor-host:port (혹은 도메인)
해당 디렉토리에 ca.crt를 저장
-> sudo systemctl restart docker.service
harbor에서 pull 할 때나 혹은 push할때 해당 인증서를 신뢰할 수 없기때문에 harbor의 인증서를 받아서 호스트에 신뢰하도록 업데이트 해줘야한다
우분투 기준
sudo cp 인증서 파일 /usr/local/share/ca-certificates/파일이름.crt
//해당 인증서 등록
sudo update-ca-certificates
docker login <harbor url> -> 하버 레지스트리에 로그인
docker build -t 하버url/프로젝트명(하버 레지스트리에서 지정한 이름)/이미지 이름:태그이름 . -> 현재 디렉토리의 도커파일 이미지 빌드
docker push 하버url/프로젝트명(하버 레지스트리에서 지정한 이름)/이미지 이름:태그이름 -> 빌드한 이미지를 push
docker tag 기존 이름:태그이름 태깅할 새 이미지이름
예시
docker tag link-backend:latest harbor-url/link-backend/link-backend:latest
먼저 , 프라이빗 레지스트리로 클라우드 환경에서 ecr을 사용하여 ci/cd를 해본적이 있었는데, 자체 온프레미스 환경에서 프라이빗 레포지토리를 운영해서 사용하는 것이 호스트 리소스에 대해 좀 더 고민해볼 것 같다. 사이드 프로젝트를 실제 배포 운영할때는 아마 docker-hub나 ecr, 혹은 github-actions를 사용할 수도 있을 것 같다.
최근, 인프라 학습을 하면서 배포 및 개발을 진행 중인데, 네트워크나 호스트 리소스 파악 같은 것들을 확인하는 것이 상당히 고난스러운 것 같다. 왜 오픈소스를 사용하는지 이해할 수 있었던 부분이다.