원격서버에서 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 |