원격서버에서 docker private registry에 접근하기 위해 https가 필요하므로 도메인과 인증서가 필요함.

여기선 iptime 공유기 사용시 얻을 수 있는 DOMAIN_NAME.iptime.org DDNS와 Let's Encrypt 인증서를 사용함.

 

 

공유기

DDNS

iptime 공유기를 사용하면 DOMAIN.iptime.org DDNS를 이용할 수 있음.

참고: http://iptime.com/iptime/?page_id=67&pageid=1&mod=document&uid=18107

 

포트포워딩

도커 레지스트리에서 사용할 5000번 포트를 라즈베리파이로 포워딩 해야함.

라즈베리파이의 IP를 192.168.0.10 같은 식으로 static ip를 발급하고 아래 링크를 참조해서 5000:5000 포트포워딩.

참고: http://iptime.com/iptime/?page_id=67&pageid=1&mod=document&uid=18104

(FTP 설명이라 21번 포트로 되어 있는데 5000번으로 바꿔서 동일하게 세팅하면 됨)

 

 

인증서

DDNS 발급받은 도메인으로 letsencrypt 인증서 발급

// 패키지 매니저 업데이트
[root@localhost]# apt update
 
 
// letencrypt 설치
[root@localhost]# apt install -y letsencrypt
 
 
// 인증서 발급을 위해 80 포트가 bind 되어 있으면 안됨
// 혹시 apache가 80 포트를 이용하고 있다면 잠시 내려야 함
[root@localhost]# service apache2 stop
 
 
// 인증서 발급
[root@localhost]# letsencrypt certonly --standalone -d mydomain.iptime.org
 
 
// 발급이 완료되면 아래 경로에 인증서가 생성됨
/etc/letsencrypt/live/mydomain.iptime.org
 
 
// 인증서 유효기간이 90일이므로 cron에 등록해서 주기적으로 업데이트 해줄 것
0 0 1 * * /usr/bin/certbot renew
 
 
// 만약 apache에서도 인증서를 사용한다면 인증서 업데이트 후 apache 재시작도 해주면 좋음
0 0 1 * * /usr/bin/certbot renew --renew-hook="sudo systemctl restart apache2"

 

Docker

// docker 설치
[root@localhost]# curl -s https://get.docker.com | sudo sh
 
 
// docker 서버 실행
[root@localhost]# service docker start
 
 
// 상태 확인
[root@localhost]# service docker status
 
 
// registry 이미지 받아오기
[root@localhost]# docker pull registry
 
 
// 확인
[root@localhost]# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
registry                     latest              432bf69f0427        4 months ago        22.1MB
 
 
// 기본적인 htpasswd 인증을 위해 htpasswd 파일 생성
[root@localhost]# mkdir -p /opt/docker-registry/auth
[root@localhost]# cd /opt/docker-registry
[root@localhost]# docker run --entrypoint htpasswd registry -Bbn USERNAME PASSWORD > ./auth/htpasswd
 
 
// registry 컨테이너 실행
// 인증서가 symbolic link로 되어 있어서 상위폴더를 volume으로 잡아줌
[root@localhost]# docker run -d -p 5000:5000 --restart=always --name registry \
-v /etc/letsencrypt:/letsencrypt \
-v /opt/docker-registry:/var/lib/registry \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/letsencrypt/live/mydomain.iptime.org/fullchain.pem \
-e REGISTRY_HTTP_TLS_KEY=/letsencrypt/live/mydomain.iptime.org/privkey.pem \
-e REGISTRY_AUTH=htpasswd \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/var/lib/registry/auth/htpasswd \
registry
 
 
// 컨테이너 확인
[root@localhost]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
cd0d19e7d6c4        registry            "/entrypoint.sh /etc…"   4 seconds ago       Up 2 seconds        0.0.0.0:5000->5000/tcp   registry
 
 
// localhost에서 접속 확인
[root@localhost]# curl https://USERNAME:PASSWORD@mydomain.iptime.org:5000/v2/_catalog
{"repositories":[]}

 

 

원격서버

원격서버에서 접속 확인

// 접속 체크 겸 이미지 리스트 확인
[root@remotehost]# curl https://USERNAME:PASSWORD@mydomain.iptime.org:5000/v2/_catalog
{"repositories":[]}
 
 
// docker login도 해보자
[root@remotehost]# docker login mydomain.iptime.org:5000
Username: USERNAME
Password:
Login Succeeded

 

 

이제 나만의 이미지를 만들어서 push까지 해보자.

 

Dockerfile이란 파일을 만들어서 아래 내용대로 입력한 후 저장

FROM alpine:latest
 
CMD echo "Hello World!"

 

위에서 만든 Dockerfile을 바탕으로 build

[root@remotehost]# docker build -t hellowworld:latest .
 
 
// 확인
[root@remotehost]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
helloworld          latest              9c7fb2de0d28        3 seconds ago       5.57MB
alpine              latest              a24bb4013296        9 days ago          5.57MB
 
 
// 실행
[root@remotehost]# docker run helloworld
Hello World!

 

push

// push하기 전 마지막으로 private registry에 아무것도 없는 것 확인
[root@remotehost]# curl https://USERNAME:PASSWORD@mydomain.iptime.org:5000/v2/_catalog
{"repositories":[]}
 
 
// tag 생성
[root@remotehost]# docker tag helloworld mydomain.iptime.org:5000/helloworld
 
 
// push
[root@remotehost]# docker push mydomain.iptime.org:5000/helloworld
 
 
// 확인
[root@remotehost]# curl https://USERNAME:PASSWORD@mydomain.iptime.org:5000/v2/_catalog
{"repositories":["helloworld"]}

 

원격서버에서 pull

// 컨테이너 싹 비우기
[root@remotehost]# docker rm $(docker ps -aq)
 
 
// 로컬에 있는 이미지 삭제
[root@remotehost]# docker rmi mydomain.iptime.org:5000/helloworld
[root@remotehost]# docker rmi helloworld
[root@remotehost]# docker rmi alpine
 
 
// 아까 push한 helloworld 이미지를 라즈베리파이 private registry에서 pull
[root@remotehost]# docker pull mydomain.iptime.org:5000/helloworld
 
 
// 확인
[root@remotehost]# docker images
REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
bloodguy.iptime.org:5000/helloworld   latest              9c7fb2de0d28        11 minutes ago      5.57MB
 
 
// 실행
[root@remotehost]# docker run mydomain.iptime.org:5000/helloworld
Hello World!

 

 

'Docker' 카테고리의 다른 글

[Docker] CentOS non-root user cron 실행  (0) 2021.11.04
[Docker] Dockerfiles로 빌드하기  (0) 2020.06.10
[Docker] 기본 사용법  (0) 2020.06.09
Posted by bloodguy
,