Docker Registry -> private 레지스트리
servera 와 serverb 두개의 노드를 사용하여 테스트를 진행
servera에 private 레지스트리 설치되어 있음
serverb는 client 역할
원격 Docker Registry 설정 및 사용하기
servera 에서 Registry 를 설정하고 serverb 에서 이를 테스트하는 순서로 진행
Servera node 에서 Docker Registry 시작
docker run -d -p 5000:5000 \
> -v /var/lib/registry:/var/lib/registry:Z \
> --restart=always --name registry registry:2
private registry의 기본 포트는 5000
-v /var/lib/registry:/var/lib/registry:Z
레지스트리가 volume을 마운트 => volume을 마운트시키지 않는다면 저장되어있던 이미지들이 다 삭제가 된다. 따라서 레지스트리에 볼륨을 마운트 해야된다.
인증에 관련된 내용이 없기 때문에 serverb에서 막 push해도 상관없음
Serverb node 에서 업로드 및 다운로드 테스트
서버b에도 도커가 실행 되어야 된다
# systemctl restart docker
# systemctl status docker
<server b>
vim /etc/docker/daemon.json
{ "insecure-registries":["servera.example.com:5000"] } 레지시트리가 저장되어 있는 곳의 url과 port번호
insecure => 안전하지 않은 => 암호화 따위 필요없다!
레지스트리 테스트 하기위해 서버a와 서버b가 통신해야된다.
근데 servera.example.com으로 ping 보내면 안되는데 host파일과 dns 서버에 등록되지 않기 때문이다.
따라서 servera와 serverb에서 host 파일을 등록해준다.
vim /etc/hosts
213.0.113.3 servera.example.com servera
213.0.113.4 serverb.example.com serverb
# docker pull nginx
# docker tag nginx servera.example.com:5000/nginx
tag -> url + 보내는 사람 id + 파일이름이 들어가있어야 한다 (이름만 지정하는 경우도 있고 url+파일이름만 지정하는 경우가 있음)
이 경우에는 push 할 때 목적지가 어디인지 명시해야 한다. 따라서, 이미지 이름을 변경할 때 목적지이름도 포함해야 한다.
dockerb의 nginx 이미지를 다음과 같이 바꿔준다
저장소에서 nginx라는 이미지로 저장하겠다는 뜻
# docker push servera.example.com:5000/nginx
그리고 이를 severa의 레포지토리로 업로드
가져오는것도 확인하기 위해 기존의 이미지 다 지우기
docker rmi -f $(docker images -q)
docker pull servera.example.com:5000/nginx
잘가져와진다
servera 에서 업로드에 했던 이미지가 어디에 저장되어 있는지 확인
ls /var/lib/registry/docker/registry/v2/repositories/nginx/
ls /var/lib/registry/docker/registry/v2/repositories/nginx/_layers/sha256/
_layers/sha256 에 이미지 레이어들이 저장되어 있다.
연두색으로 나와져 있는것이 serverb 에서 push한 이미지로 잘 저장된 것을 확인할 수 있다.
cf) serverbb에서 push한 이미지는 servera에서 사용못한다. servera가 다운받은 이미지들은 /var/lib/docker/images/에 있다.
cf) serverb에서 servera로 접속할 때 암호화가 안되어있다.
만약 도커 서버가 회사 내부에 있고 클라이언트가 회사 외부에 있다면 외부의 네트워크를 통해서 업로드 다운로드 할때 plain text 방식으로 통신하여 보안에 취약하다
Docker Registry 에서 SSL 사용하기
ssl 을 통해 보안
cf) https = http + ssl을 사용 => ssl : 가장 중요한 것은 암호화
=> 도커 클라이언트와 서버 사이 암호화
OpenSSL 이용하여 self-signed SSL 인증서 생성하기(Servera node)
openssl genrsa [-out filename] [numbits]
key 파일 생성
2048 bit 크기로 키가 만들어짐
private key여서 암호화에 사용
openssl req -new -key <사용할 key 파일명> -out <생성할 csr 파일명>
국가키 만들기
생성된 csr에는 공개키가 포함이 된다.
csr 파일을 생성하기 위하여 개인키가 필요하다.
주의할 점은 대문자, 소문자 구분하여 작성해야지 성공적으로 작성이 된다. 만약 잘못 작성 했을 경우 처음부터 다시하면 된다.
openssl x509 -req -days <유효기간> -in <csr파일> -signkey <key파일> -out <crt파일명>
csr 을 사용하여 인증서를 만든다. 파라미터로 csr 파일과 key 파일이 필요하며, 인증 유효 기간 등을 설정할 수 있다.
만들어진 crt와 key, csr 파일을 docker가 사용하는 경로에 복사해주면 된다
SSL 레지스트리 생성하기
기존에 생성한 registry는 삭제하고 다음과정을 진행한다
docker run -d -p 5000:443 --restart=always \
> --name registry -v /var/lib/registry:/var/lib/registry \
> -v /etc/docker/certs.d:/certs \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/servera.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/servera.key registry:2
- -v /etc/docker/certs.d:/certs
- /etc/docekr/cert.d는 host에서의 인증서 위치로 certs라는 디렉터리(도커내)로 mount 시킨다.
- mount 먼저 해줘야 certs 밑의 key와 crt를 사용할 수 있다
- -p 5000:443
- 443은 원래 https가 사용하는 포트이다. https는 http+ssl이다. 따라서 443 포트를 이용하여 ssl을 사용한다
Serverb node 에서 테스트
serverb에서 push하고 pull
curl -sk https://servera.example.com:5000/v2/_catalog
레지스트리의 이미지 목록을 확인
- -sk : https 의 안전하지 않는 연결 skip
SSL 테스트하기(serverb)
ssl 테스트
브라우저에서 접속했을때 인증서의 정보 확인
Docker Registry 에서 인증 사용하기
=> id와 password가 있어야만 인증이 가능함
Servera 노드에서 사용자 정보 설정하기
# dnf -y install httpd-tools
# htpasswd -Bc /etc/docker/.htpasswd admin
admin이라는 사용자로 로그인한다
비밀번호는 /etc/docker/.htpasswd 에 저장이 되고 htpasswd는 숨김파일을 나타낸다.
아파치 웹 서버에서 사용자를 인증할 때 사용하는하는 툴이 htpasswd 이고 이를 도커에서도 사용가능하다.
따라서 /etc/docker/.htpasswd에 저장한다
(저장경로는 사용자가 설정하는 것으로 다른곳에 저장해도 상관없다)
파일 확인하면 설정된것을 확인가능
cf) 명령어에 대한 도움말, 자세한 정보
man htpasswd (자세한 정보)
htpasswd help (도움말)
저번에 만들었던 키가 있는지 확인
인증 기능이 적용된 레지스트리 생성하기
docker run -d -p 5000:443 --restart=always \
> --name registry \
> -v /var/lib/registry:/var/lib/registry \
> -v /etc/docker/certs.d:/certs \
> -v /etc/docker:/auth \
> -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/servera.crt \
> -e REGISTRY_HTTP_TLS_KEY=/certs/servera.key \
> -e REGISTRY_AUTH=htpasswd \
> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/.htpasswd \
> -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
> registry:2
- -v /etc/docker:/auth
- .htpasswd 인증에 관련된 파일이 /etc/docker에 있기 때문에 이를 /auth와 mount 해준다
- -e REGISTRY_AUTH=htpasswd
- 인증을 htpasswd를 통해 할 것이다
- -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/.htpasswd
- 파일 위치 정해주기
- -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm"
- realm 그냥 구역 설정하는 거임 임의로 설정하면 됨
Serverb 노드에서 테스트
이번에는 httpd를 push하고 pull해보자
인증을 해기 때문에 serverb에서 push이 안될거임
따라서 login 과정이 필요함
docker login servera.example.com:5000
=> login succeeded가 떠야 한다
push하고 pull이 잘됨
servera에서 확인했는데 이미지가 잘 있는것도 확인 가능
참고로 curl은 안됨 -> 왜냐하면 curl을 할때 로그인을 하는 부분이 필요하기 때문이다