[Docker] Docker Private Registry 사용

메린·2023년 5월 22일
0

Docker

목록 보기
3/3
post-thumbnail

Docker Private Registry 를 Deploy 해보자.

이미지 관리

  • Docker hub
    • 이미지를 저장하는 것에는 제한이 없지만 Private 저장소를 1개까지만 제공하며, 2개 이상 사용시 일정 금액 결제 필요
  • Docker Private Registry 컨테이너
    • 사용자가 직접 관리해야 하지만, 개인의 저장소이다 보니 Private 하게 사용가능

설치

설치 환경

Ubuntu 20.04 / Docker Engine 23.06 / 
  • 'registry_data'와 'nginx_data' 디렉토리를 생성한다. 이 디렉토리는 registry 데이터와 Nginx 설정파일이 저장될 곳이다.
  • private registry 컨테이너를 생성한다.
docker run -d -v /root/registry_data:/var/lib/registry --name registry registry:2

위 명령어는 '-v'옵션을 사용하여 호스트의 'registry_data' 디렉토리를 컨테이너 내부의 '/var/lib/registry' 경로에 마운트한다. 이렇게 함으로써 이미지를 push 하여 registrydp 저장하면 '/root/registry_data'디렉토리에 이미지 파일들이 저장된다.

성공적으로 registry 컨테이너가 생성되었다. 'registry:2' 이미지가 로컬에 존재하지 않았기 때문에 Docker가 해당 이미지를 Docker Hub에서 다운로드 했다.

  • Nginx 설정을 위해 nginx_data 디렉터리로 이동한다.
cd /root/nginx_data
  • Nginx에 로그인하는 기능 활성화하기 위해 'apache2-utils' 파키지를 설치함으로써 사용할 수 있다.
sudo apt update
sudo apt install apache2-utils

  • 설치가 완료되면 사용자 이름과 비밀번호를 입력한다. 이 정보는 나중에 사용될 수 있으므로 기록해두자.
sudo htpasswd -c /root/nginx_data/registry.password ptty


위 명령어는 '/root/nginx_data/registry.password' 파일을 생성하고 사용자이름 'ptty'와 해당 사용자 비밀번호를 설정한다.

이제 Nginx 설정을 위해 준비가 되었다.

registry.conf 파일을 생성하여 내용을 입력한다.

upstream docker-registry {
  server registry:5000;
}
 
server {
  listen 443;
  server_name 10.3.41.105
 
  # SSL
  ssl on;
  ssl_certificate /etc/nginx/conf.d/server-nginx.crt;
  ssl_certificate_key /etc/nginx/conf.d/server-nginx.key;
 
  # disable any limits to avoid HTTP 413 for large image uploads
  client_max_body_size 0;
 
  # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
  chunked_transfer_encoding on;
 
  location /v2/ {
    # 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;
    }
 
    # To add basic authentication to v2 use auth_basic setting plus add_header
     auth_basic "registry.localhost";
     auth_basic_user_file /etc/nginx/conf.d/registry.password;
     add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
 
    proxy_pass                          http://docker-registry;
    proxy_set_header  Host              $http_host;   # required for docker client's sake
    proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
  }
}

두개의 파일이 생성됐다.

  • 'registry.password' 파일은 Nginx에 HTTP 요청을 보낼 때 사용될 사용자 이름과 비밀번호를 저장하는 파일이다. 이를 통해 Nginx 가 인증을 요구할 수 있다.
  • 'registry.conf' 파일은 private registry 컨테이너로 리디렉션을 수행하고 SSL 인증에 사용되는 옵션들을 저장하는 설정파일이다. 이 파일을 통해 Nginx는 SSL 암호화된 연결을 허용하고, Docker 이미지 업로드 시 크기 제한을 해제하며, Docker 클라이언트의 IP 주소를 전달하는 작업을 수행한다.

이제 SSL 인증을 실행해보자.

  • 키 파일과 root 인증서 파일을 생성한다. 이는 self-signed SSL certificate을 생성하기 위한 것이다.
openssl genrsa -out client-crt-key.key 2048
openssl req -x509 -new -nodes -key client-crt-key.key -days 10000 -out client-crt.crt

  • 이제 서버측을 위한 키를 생성한다.
openssl genrsa -out server-nginx.key 2048

openssl req -new -key server-nginx.key -out my-registry.csr
  • 입력시 Common Name 에 자신의 IP를 적어준다. 나의 경우 IP는 10.3.41.105 이다.

  • extfile.cnf 파일을 생성한다. 또한 IP에서는 자신의 IP를 입력한다.

echo subjectAltName = IP:10.3.41.105,IP:127.0.0.1 > extfile.cnf
  • 최종 파일을 생성한다.
openssl x509 -req -in my-registry.csr -CA client-crt.crt -CAkey client-crt-key.key -CAcreateserial -out server-nginx.crt -days 10000 -extfile extfile.cnf

앞에서 실행한 subjectAltName을 입력하지 않으면 cannot validate certificate for IP because it doesn't contain any IP SANs 에러를 일으킨다.

  • 파일을 확인해보자.
  • 이제 인증서를 Host에 등록해주어야 사용할 수 있다.
sudo apt-get update
cp client-crt.crt /etc/pki/ca-trust/source/anchors/client-crt.pem
sudo apt-get install ca-certificates
  • Docker를 재시작하자.
service docker restart
  • 기존에 생성했던 registry컨테이너를 재시작하고, nginx 컨테이너를 생성한다.
docker start registry
docker run -d -p 443:443 --link registry:registry -v /root/nginx_data:/etc/nginx/conf.d --name nginx nginx:1.9

위의 run 명령어는 호스트의 443 포트를 컨테이너의 443 포트로 바인딩하고, registry 컨테이너에 link 하여 registry라는 이름으로 접근할 수 있게 해주고, 호스트의 nginx_data 디렉터리를 공유함으로써 설정파일을 가져온다.

업로드중..

  • docker login 명령어로 로그인해보자.
docker login

https://m.blog.naver.com/alice_k106/220781810110

profile
I can do it ! 苦盡甘來

0개의 댓글