도커/개념 및 실습

07장, 프라이빗 이미지 저장소

Jaden Park 2021. 6. 4. 09:50

프라이빗 이미지 저장소 개요

  • 도커가 기본적으로 사용하는 이미지 저장소는 도커 허브
  • 도커 허브는 기본적으로 퍼블릭 이미지 저장소로 사용되기 때문에 기업이 자체적으로 이미지를 보관하려면 별도로 프라이빗 이미지 저장소를 구성해야 함
  • 프라이빗 이미지 저장소는 경우에 따라 내부망 뿐만 아니라 인증을 통해 외부에서도 접근 가능하도록 구성할 수 있음

프라이빗 이미지 저장소란?

  • 기업이 사내에 구축하여 내부 또는 외부에서 사용할 수 있도록 만든 이미지 저장소
  • 도커 허브에서도 프라이빗 이미지 저장소를 구성할 수 있지만 하나의 레포지토리만 가능하며, 이미지 자체를 사내에서 보유하지 않아 불안하다면 사내에 저장소를 구축하는 방법이 가장 적합

프라이빗 이미지 저장소 종류

  • 도커 초기에는 도커 레지스트리를 주로 사용했음
  • 현재는 다양한 프라이빗 이미지 저장소 서비스가 있기 때문에 필요에 따라 골라서 사용하면 됌
  • 퍼블릭 클라우드를 주로 사용하고 있다면 해당 클라우드에서 제공하는 프라이빗 이미지 저장소를 사용하는 것도 좋은 방법

도커 레지스트리

  • 초기에는 도커 레지스트리를 수동으로 구성해서 씀
  • 요즘에는 이미지 형태로 제공되어 여러 가지 옵션을 함께 사용하여 컨테이너로 싱행하면 프라이빗 이미지 저장소로 사용할 수 있음
  • 다른 서비스에 비해 기능이 적어 인기가 떨어지고 있음

Nexus

  • Sonatype Inc에서 만든 Maven Repository 를 관리하기 위한 프로젝트
  • Nexus 2 버전까지는 Maven Repository 를 사설로 구축하여 공통 라이브러리 배포 용도나 다른 Maven Repository를 캐시하여 빠르게 다운로드하는 기능
  • Nexus 3 버전부터는 npm 프라이빗 저장소와 프라이빗 이미지 저장소까지 구축 할 수 있음

JFrog Artifactory

  • JFrog Artifactory는 도커 외에도 쿠버네스 배포를 위한 Helm Chart 저장소를 제공
  • 빌드 환경과 통합하여 안정적인 원격 프라이빗 이미지 저장소를 제공

Portus

  • Protus는 오픈소스 사용자 인증 기능과 LDAP 연동을 제공
  • 프라이빗 이미지 저장소로는 간단한 htpasswd 사용자 인증 기능만 제공

Harbor

  • RBAC 기반으로 CNCF에서 관리하는 오픈 소스 컨테이너 이미지 레지스트리
  • 웹 인터페이스, 이미지 취약점 스캐닝, 멀티테넌트, 복제, 이미지 서명 등의 기능을 제공
  • 다양한 서드파티 제품들과 호환되기 때문에 편리

프라이빗 이미지 저장소 구축

Harbor 저장소 구축 (HTTP 접근 방식)

자세한 사항은 Harbor 공식 홈페이지 참고

1. 하드웨어 요구사항 확인

2. docker engine, docker compose 설치

엔진은 이전에 설치했으니 compose 만 설치하면 됌

[root@docker ~]# curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

[root@docker ~]# sudo chmod +x /usr/local/bin/docker-compose

[root@docker ~]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

3. 하버 릴리즈 다운로드

harbor github에서 원하는 버전 선택하여 다운로드

[root@docker ~]# curl -LO https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-offline-installer-v2.2.2.tgz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   641  100   641    0     0   1580      0 --:--:-- --:--:-- --:--:--  1582
100  481M  100  481M    0     0  14.7M      0  0:00:32  0:00:32 --:--:-- 21.3M

[root@docker ~]# ls
anaconda-ks.cfg  harbor-offline-installer-v2.2.2.tgz

[root@docker ~]# tar xvf harbor-offline-installer-v2.2.2.tgz 
harbor/harbor.v2.2.2.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl

4. 설정파일 수정

[root@docker ~]# hostname
docker.JadenPark.co.kr

[root@docker ~]# cd harbor/
[root@docker harbor]# ls
common.sh  harbor.v2.2.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@docker harbor]# cp harbor.yml.tmpl harbor.yml
[root@docker harbor]# nano harbor.yml

  • 빨간줄 : 로컬 hostname 과 일치 시켜야 함
  • 파란줄 : 주석처리
[root@docker ~]# ip a s
...
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:7e:eb:99 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.101/24 brd 192.168.56.255 scope global noprefixroute dynamic enp0s8
       valid_lft 468sec preferred_lft 468sec
    inet6 fe80::e407:eea4:a780:2f46/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
...


[root@docker ~]# cat > /etc/docker/daemon.json 
{
"insecure-registries" : ["192.168.56.101"]
}
[root@docker ~]# systemctl restart docker
  • CLI를 사용하여 이미지 저장소에 접근할 때 443포트가 아니라 80번 포트로 접근
  • 192.168.56.101은 도커 호스트 ip 주소

5. install.sh 스크립트 실행

// 충돌이 나지 않도록 이전 컨테이너들 모두 삭제
[root@docker ~]# docker rm -f $(docker ps -aq)

[root@docker ~]# ./install.sh

...

6. 로그인

// 초기 아이디, 비밀번호 -> admin, Harbor12345
[root@docker harbor]# docker login -u admin -p Harbor12345 192.168.56.101
...
Login Succeeded

7. 이미지 업로드

  • 이미지를 업로드 하려면 태그를 지정해야함.
  • 태그를 지정하는 방식은 "Harbor의 주소/프로젝트 이름/저장소 이름:태그"
  • admin 사용자의 기본 프로젝트는 library
//태그
[root@docker ~]# docker tag golang_test:v1 192.168.56.101/library/docker:golang_test

//푸시
[root@docker ~]# docker push 192.168.56.101/library/docker:golang_test 
The push refers to repository [192.168.56.101/library/docker]
5a4d11d779b8: Pushed 
golang_test: digest: sha256:a93e9aa38ef18b290d82377ba29acb974c60a1fae3b499d21038665b3be5333a size: 528

8. 이미지 다운로드

// 다운로드가 정상적으로 되는지 확인하기 위해 삭제
[root@docker ~]# docker rmi 192.168.56.101/library/docker:golang_test


//풀
[root@docker ~]# docker pull 192.168.56.101/library/docker:golang_test 
golang_test: Pulling from library/docker
Digest: sha256:a93e9aa38ef18b290d82377ba29acb974c60a1fae3b499d21038665b3be5333a
Status: Image is up to date for 192.168.56.101/library/docker:golang_test
192.168.56.101/library/docker:golang_test

9. 이미지 확인

  • IP주소/harbor 로 브라우저에서 접속.
    • 예시에서는 192.168.56.101/harbor
    • 초기 아이디 : admin
    • 초기 비밀번호 : Harbor12345

 

  • Library -> docker 를 들어가면 이미지가 업로드 되어있는 것을 확인 할 수 있음.