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 |