설치 환경
Ubuntu 20.04 / Docker Engine 23.06 /
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에서 다운로드 했다.
cd /root/nginx_data
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;
}
}
두개의 파일이 생성됐다.
이제 SSL 인증을 실행해보자.
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 에러를 일으킨다.
sudo apt-get update
cp client-crt.crt /etc/pki/ca-trust/source/anchors/client-crt.pem
sudo apt-get install ca-certificates
service docker restart
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