웹사이트 검색

Ubuntu 18.04 LTS에서 개인 Docker 레지스트리를 설정하는 방법


이 페이지에서

  1. 1단계 - 패키지 종속성 설치
  2. 2단계 - Docker 및 Docker-compose 설치
  3. 3단계 - 개인 Docker 레지스트리 설정
  4. 4단계 - 테스트
  5. 참조

Docker Registry 또는 Registry는 Docker 이미지를 저장하고 배포하는 데 사용할 수 있는 확장성이 뛰어난 오픈 소스 서버 측 애플리케이션입니다. Docker Hub 뒤에 있는 서버 측 애플리케이션이었습니다. 대부분의 사용 사례에서 애플리케이션 개발에 CI/CD 시스템을 구현하려는 경우 Docker 레지스트리는 훌륭한 솔루션입니다. Private Docker Registry는 애플리케이션의 모든 사용자 지정 Docker 이미지를 한 곳에서 중앙 집중화하여 개발 및 생산 주기에 더 많은 성능을 제공합니다.

이 가이드에서는 Ubuntu 18.04 서버에 비공개 Docker 레지스트리를 설치하고 구성하는 방법을 보여드리겠습니다. Nginx 웹 서버를 사용하고 사용자 이름과 비밀번호(기본 인증)로 레지스트리를 보호합니다.

전제 조건

  • 우분투 18.04 서버
  • 루트 권한\n

우리는 무엇을 할 것입니까?

  1. 종속성 설치
  2. Docker 및 Docker-compose 설치
  3. 개인 Docker 레지스트리 설정
  4. 테스트

1단계 - 패키지 종속성 설치

우선 Private Docker Registry를 배포하기 위한 일부 패키지 종속성을 설치하려고 했습니다.

다음 명령을 사용하여 패키지 종속성을 설치합니다.

sudo apt install -y gnupg2 pass apache2-utils httpie

gnupg2 및 pass 패키지는 도커 레지스트리에 암호 인증을 저장하는 데 사용됩니다. 그리고 apache2-utils는 기본 인증을 생성하는 데 사용되고 httpie는 테스트에 사용됩니다.

2단계 - Docker 및 Docker-compose 설치

이제 공식 우분투 저장소에서 docker와 docker-compose를 설치하려고 합니다.

다음 명령을 실행하여 Docker 및 Docker-compose를 설치합니다.

sudo apt install -y docker.io docker-compose -y

설치가 완료되면 docker 서비스를 시작하고 부팅 시간에 추가하십시오.

sudo systemctl start docker
sudo systemctl enable docker

Docker가 실행 중이고 Docker-compose가 설치되었습니다. 아래 명령어로 확인해보세요.

docker version
docker-compose version

그러면 시스템에 설치된 Docker 및 Docker-compose 버전이 표시됩니다.

3단계 - 개인 Docker 레지스트리 설정

이 단계에서는 일부 디렉토리 환경을 생성하여 Docker 레지스트리 환경을 구성하고 docker-compose.yml, nginx 가상 호스트 및 추가 구성 등을 포함한 일부 구성을 생성하려고 했습니다.

- 프로젝트 디렉토리 생성

registry라는 프로젝트를 위한 새 디렉토리를 생성하고 내부에 nginx 및 auth 디렉토리를 생성합니다.

mkdir -p registry/{nginx,auth}

그런 다음 디렉터리 레지스트리로 이동하여 nginx 내에 새 디렉터리를 다시 만듭니다.

cd registry/
mkdir -p nginx/{conf.d/,ssl}

결과적으로 프로젝트 디렉토리는 다음 그림과 같습니다.

tree

- Docker-compose 스크립트 생성

이제 Docker Registry를 배포하기 위한 새로운 docker-compose.yml 스크립트를 생성하려고 합니다.

레지스트리 디렉터리로 이동하여 새 구성 파일 docker-compose.yml을 만듭니다.

cd registry/
vim docker-compose.yml

먼저 사용하려는 Compose 버전과 서비스를 정의합니다.

version: '3'
services:

그런 다음 registry라는 첫 번째 서비스를 추가합니다. Docker Registry 서비스는 docker 팀 레지스트리에서 제공하는 docker 이미지를 사용합니다.2. 도커 볼륨 registrydata와 기본 인증 파일인 registry.passwd가 포함된 auth라는 로컬 디렉터리를 마운트합니다. 그리고 마지막으로 mynet이라는 사용자 지정 도커 이미지에서 실행되고 컨테이너와 호스트 모두에서 포트 5000을 노출합니다.

#Registry
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet

다음으로 HTTP 및 HTTPS 포트를 실행하고 가상 호스트 구성을 위한 로컬 디렉토리 conf.d와 SSL 인증서를 위한 SSL을 마운트할 nginx 서비스 구성입니다.

#Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

마지막으로 브리지 드라이버로 사용자 지정 네트워크 mynet을 정의하고 로컬 드라이버로 레지스트리 데이터를 정의합니다.

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

구성을 저장하고 닫습니다.

다음은 전체 구성입니다.

version: '3'
services:

#Registry
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet

#Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

- Nginx 가상 호스트 구성

docker-compose 스크립트를 생성한 후 nginx 서비스에 대한 가상 호스트 및 추가 구성을 생성합니다.

nginx/conf.d/ 디렉토리로 이동하여 registry.conf라는 새 가상 호스트 파일을 만듭니다.

cd nginx/conf.d/
vim registry.conf

다음 구성을 붙여넣습니다.

upstream docker-registry {
    server registry:5000;
}

server {
    listen 80;
    server_name registry.hakase-labs.io;
    return 301 https://registry.hakase-labs.io$request_uri;
}

server {
    listen 443 ssl http2;
    server_name registry.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        # Do not allow connections from docker 1.5 and earlier
        # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
        if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" )  {
            return 404;
        }

        proxy_pass                          http://docker-registry;
        proxy_set_header  Host              $http_host;
        proxy_set_header  X-Real-IP         $remote_addr;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }

}

저장하고 닫습니다.

다음으로 nginx에서 max_body_size를 늘리기 위한 추가 구성을 만듭니다. 이렇게 하면 최대 크기가 2GB인 도커 이미지를 업로드할 수 있습니다.

vim additional.conf

아래에 구성을 붙여넣습니다.

client_max_body_size 2G;

저장하고 닫습니다.

- SSL 인증서 및 기본 인증 구성

도메인의 SSL 인증서 파일을 ssl 디렉터리에 복사합니다.

cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/

이제 auth 디렉토리로 이동하여 새 비밀번호 파일인 registry.passwd를 생성하십시오.

cd auth/

사용자 hakase의 새 비밀번호를 생성하십시오.

htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD

그리고 Private Docker Registry를 배포하기 위한 환경 설정이 완료되었습니다.

아래는 환경 파일 및 디렉토리의 스크린샷입니다.

tree

- 도커 레지스트리 실행

아래의 docker-compose 명령을 사용하여 Docker Registry를 실행합니다.

docker-compose up -d

그러면 아래와 같은 결과를 얻게 됩니다.

그런 다음 레지스트리 및 nginx 서비스가 실행 중인지 확인하십시오. 다음 명령을 사용하여 확인합니다.

docker-compose ps
netstat -plntu

그러면 레지스트리 서비스가 포트 5000에서 실행되고 있는 것으로 표시되고 nginx 서비스는 아래와 같이 HTTP 및 HTTPS 포트를 노출합니다.

4단계 - 테스트

개인 Docker 레지스트리를 테스트하기 전에 루트 CA 인증서를 도커 자체와 시스템에 추가해야 합니다.

pem 파일 인증서를 사용하는 경우 OpenSSL 명령을 사용하여 인증서를 .crt 파일로 내보냅니다.

openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt

이제 docker 인증서를 위한 새 디렉터리를 만들고 루트 CA 인증서를 여기에 복사합니다.

mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/

그런 다음 새 디렉터리 /usr/share/ca-certificate/extra를 만들고 루트 CA 인증서를 여기에 복사합니다.

mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/

그런 다음 ca-certificate 패키지를 재구성하고 Docker 서비스를 다시 시작하십시오.

dpkg-reconfigure ca-certificates
systemctl restart docker

- 도커 이미지 다운로드

다음 명령을 사용하여 새 Docker 이미지를 다운로드합니다.

docker pull ubuntu:16.04

완료되면 아래 명령을 사용하여 프라이빗 레지스트리의 이미지에 태그를 지정합니다.

docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16

시스템의 Docker 이미지 목록을 다시 확인하면 아래와 같이 새 이미지를 얻을 수 있습니다.

docker images

- 비공개 로컬 레지스트리에 이미지 푸시

다음 명령을 사용하여 Private Docker Registry에 로그인합니다.

docker login https://registry.hakase-labs.io/v2/

registry.htpasswd 파일을 기반으로 사용자 이름과 암호를 입력합니다.

이제 레지스트리에서 사용 가능한 도커 이미지를 확인하십시오.

http -a hakase https://registry.hakase-labs.io/v2/_catalog

그리고 레지스트리에는 도커 이미지가 없습니다.

이제 커스텀 이미지를 Private Docker Registry로 푸시합니다.

docker push registry.hakase-labs.io/ubuntu16

다시 확인하고 Private Repository에 ubuntu16 도커 이미지가 있는지 확인하십시오.

http -a hakase https://registry.hakase-labs.io/v2/_catalog

마지막으로 Nginx 및 기본 인증을 사용하는 Private Docker Registry의 설치 및 구성이 성공적으로 완료되었습니다.

참조

  • https://linux-console.net/tutorial/how-to-create-docker-images-with-dockerfile/