본문 바로가기
Docker

Docker Registry

by 손영진 2023. 8. 2.
728x90

#1 EC2 instance 생성

  • aws내에서 servera와 serverb라는 instance 생성
    • key : container-key
    • 보안그룹 : docker-sg : 22, 80, 5000, 8000-9000번 포트 허용
    • AMI : Amazon Linux 2023
    • Instance Type : t2.medium
    • 네트워크 : default vpc
  • VM에서 생성된 네트워크를 통해 따로 접속하여 두 인스턴스의 호스트 네임 변경
<servera>에서
hostnamectl set-hostname servera.example.com

<serverb>에서
hostnamectl set-hostname serverb.example.com

bash     // 변경한 hostname으로 변경
  • 두 인스턴스가 연결되도록 설정(각 인스턴스마다 설정)
vim /etc/hosts
>127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
>172.31.10.135   servera.example.com     servera
>172.31.5.154    serverb.example.com     serverb
>[각 인스턴스의 프라이빗 ip]	[hostname]	[설정할 이름]

<servera>에서			<serverb>에서
ping serverb			ping servera
  • Docker 설치
dnf install docker -y
systemctl enable --now docker		// 도커 실행
systemctl status docker			// 도커 상태 확인

#2 원격 Docker Registry 설정

   1. servera에 5000번 포트를 사용한 registry container와 image 생성

<servera>
docker run -d -p 5000:5000 \
> -v /var/lib/registry:/var/lib/registry:z \
> --restart=always --name registry registry:2 
			// Docker Image 저장소로 사용되는 Registry를 Image와 Container를 동시에 생성
			// restart=always 를 통해 계속해서 실행되게 설정
docker ps
docker images

 

   2. serverb에서 업로드 및 다운로드 테스트

<serverb>
vim /etc/docker/daemon.json
>{ "insecure-registries":["servera.example.com:5000"] }
systemctl restart docker

docker pull nginx
docker image tag nginx servera.example.com:5000/nginx:v10.0
			// 다운로드한 nginx를 servera.ex ~ :v10.0 이라는 이름으로 tag를 통해 복사
docker images			// 복사된 Image의 Image ID 확인
docker push servera.example.com:5000/nginx:v10.0
			// 복사된 servera.ex ~ :v10.0 을 servera에 업로드(push)
            
docker rmi -f nginx
docker rmi -f servera.example.com:5000/nginx:v10.0
			// 생성되어 있는 image 들을 삭제하고 업로드한 파일을 다운로드 할 준비

 

   3. servera 에 업로드 한 이미지 확인

<servera>
ls /var/lib/registry/docker/registry/v2/repositories/nginx/_layers/sha256/
			// serverb에서 업로드한 파일을 확인

-> 해당 명령어 확인 시 업로드 되어 있는Image ID들이 뜬다.

-> serverb에서 [docker image]라는 명령어를 통해 업로드한 파일의 Image ID 와 비교하여 업로드 된 파일을 확인

 

   4. 업로드한 파일을 다운받아 컨테이너 생성

<serverb>
docker pull servera.example.com:5000/nginx:v10.0

docker volume create web-server
			// web-server라는 이름을 가진 공유할 volume 생성
docker run --name nginx-docker1 -d -p 8000:80 \
> -v web-server:/usr/local/nginx/html:Z servera.example.com:5000/nginx:v10.0
			// 8000 포트를 사용한 nginx-docker1 생성
docker run --name nginx-docker2 -d -p 8001:80 \
> -v web-server:/usr/local/nginx/html:Z servera.example.com:5000/nginx:v10.0
			// 8001 포트를 사용한 nginx-docker2 생성

 

   5. 임의의 index.html 생성 후 4번에서 생성한 container로 복사

<serverb>
echo "Docker image test" > index.html
docker cp index.html nginx-docker1:/usr/local/nginx/html/index.html

curl localhost:8000
curl localhost:8001

#3 SSL 사용하여 Registry 구성

   1. SSL 인증서 생성

<servera>
cd /etc/pki/tls/certs
openssl genrsa -out servera.key 2048	//servera.key라는 이름의 인증키 생성

openssl req -new -key servera.key -out servera.csr	//csr의 인증서 생성

openssl x509 -req -days 365 -in servera.csr -signkey servera.key -out servera.crt

mkdir /etc/docker/certs.d
cp servera.* /etc/docker/certs.d/
cp servera.crt /etc/pki/ca-trust/source/anchors
update-ca-trust 
systemctl restart docker

 

   2. SSL Registry 생성

<servera>
docker rm -f registry
			// 기존 registry를 삭제하여 새 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

docker ps		//생성된 container 확인

 

   3. serverb에서 테스트

<serverb>
docker tag nginx servera.example.com:5000/nginx
docker push servera.example.com:5000/nginx

docker rmi -f $(docker images -q)
			// 모든 image 삭제
curl -sk https://servera.example.com:5000/v2/_catalog
결과 값 : {"repositories":["nginx"]}
			// servera의 registry image 목록 확인
            
docker pull servera.example.com:5000/nginx

 

=> Serverb 의 브라우저에서 https://servera.example.com:5000 으로 접속했을 때 인증서의 정보를 확인할 수 있다.

 

   4. 생성한 인증서 사용

<servera>
dnf -y install httpd-tools
htpasswd -Bc /etc/docker/.htpasswd admin
			//.htpasswd 에서 ' . ' 은 숨김파일을 의미
> New password: 
> Re-type new password:

docker rm -f registry		// 기존 registry 삭제

docker run -d -p 5000:443 --restart=always \		//만든 인증서를 적용한 Image 및 container 생성
> --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

<serverb>
docker rmi -f nginx:latest		// 기존 Image 삭제
docker pull servera.example.com:5000/nginx:latest
			// servera의 image 다운로드
docker login servera.example.com:5000
			// servera로부터 업로드한 파일에 접속
> Username: admin
> Password:

docker pull servera.example.com:5000/nginx:latest
			// 다시 다운로드 받아 재확인

=> 웹 브라우저에 serverbIP:5000 으로 하여 인증서의 정보를 확인

 

#4 Mariadb와 httpd 확인

   1. serverb에서 servera로 Image 업로드 및 다운로드 하여 container 생성

  • Mariadb
  • container 접속 후 DB 생성

 

docker pull mariadb
docker tag mariadb servera.example.com:5000/mariadb:v1.0
docker push servera.example.com:5000/mariadb:v1.0

docker rmi -f mariadb
docker rmi -f servera.example.com:5000/mariadb:v1.0
			// 기존 image들 삭제

docker pull servera.example.com:5000/mariadb:v1.0
docker run --name mariadb-registry -d -p 3306:3306 \
> -e MYSQL_ROOT_PASSWORD=r00tpassword servera.example.com:5000/mariadb:v1.0

docker exec -it mariadb-registry /bin/bash
			// DB 접속
mysql(mariadb) -uroot -pr00tpassword
> create database k_digital;

 

   2. serverb에서 servera로 Image 업로드 및 다운로드 하여 container 생성

  • Httpd
  • 웹 브라우저에서 공인ip(serverb):8888/index.html을 통해 생성한 text 확인
docker pull httpd
docker tag httpd servera.example.com:5000/httpd:v2.0
docker push servera.example.com:5000/httpd:v2.0

docker rmi -f httpd
docker rmi -f servera.example.com:5000/httpd:v2.0

docker pull servera.example.com:5000/httpd:v2.0
docker run --name httpd-test -d -p 8888:80 servera.example.com:5000/httpd:v2.0
			// 8888 포트를 사용하는 container 생성
echo 'Docker Registry Test file' > index.html
docker cp index.html httpd-test:/usr/local/apache2/htdocs/index.html
			// html을 복사하는 경로에 유의 
curl localhost:8888

'Docker' 카테고리의 다른 글

Docker 최종 연습  (1) 2023.08.06
Docker Swarm & Monitoring & Podman  (0) 2023.08.06
Docker Network  (0) 2023.08.03
다양한 Container 생성  (0) 2023.08.01
Docker의 기본개념  (1) 2023.07.31