Last Updated on 11월 20, 2021 by Jade(정현호)
안녕하세요
이번 포스팅에서는 Docker Registry 와 ONBUILD 에 대해서 확인 해보도록 하겠습니다.
아래 포스팅에서 이어지는 글입니다.
Contents
Docker Registry
Registry 란
Registry 는 Docker 이미지를 저장하고 배포하는 표준 방법입니다. 이 Registry는 개방형 Apache 라이선스에 따른 오픈 소스 기반 리포지토리입니다.
Repository 와 같은 개념으로 public registry 중 대표적인 사이트가 Docker Hub 입니다
내가 만든 이미지를 사내에서만 사용하거나 특정 그룹 등에게만 배포를 하고자 할 수 있습니다 그럴때 Public 한 Registry 서비스가 아닌 내가 별도로 구성한 Private Registry 를 사용하고자 하는 필요성이 있을 것 입니다.
이럴 경우 별도로 Registry 를 구성하여 다른 서버의 Docker 시스템에서 사용할 수 있습니다.
Registry 를 만드는 방법은 설치해야하는 패키지가 많을 수 있으며 다소 복잡 할 수 있습니다 그래서 포스팅에서는 Registry 의 docker image 를 통해서 구성하도록 하겠습니다.
Registry 구성
먼저 이번 포스팅은 2대의 VM 을 사용하여 진행하도록 하겠으며 위에서 설명한 내용과 같이 도커 컨테이너로 구성을 하도록 하겠습니다.
- 호스트네임 docker1 이 Registry 구성하는 서버
- 호스트네임 docker2 은 Registry 를 접속하는 서버
Docker 설치는 이전 포스팅을 참조하시면 됩니다
Registry 이미지 다운로드
Registry 도커 이미지를 다운로드 받습니다
-- docker1 서버에서 실헹 [devops@docker ~]$ docker pull registry:latest latest: Pulling from library/registry ddad3d7c1e96: Pull complete 6eda6749503f: Pull complete 363ab70c2143: Pull complete 5b94580856e6: Pull complete 12008541203a: Pull complete Digest: sha256:aba2bfe9f0cff1ac0618ec4a54bfefb2e685bbac67c8ebaf3b6405929b3e616f Status: Downloaded newer image for registry:latest docker.io/library/registry:latest [devops@docker1 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE registry latest 1fd8e1b0bb7e 3 months ago 26.2MB mynginx 1.0 7d749bc3b862 4 days ago 215MB
Registry 이미지 다운로드
다운로드 받은 이미지를 실행하도록 하겠습니다. 포트포워딩는 5000 으로 하였습니다.
[devops@docker1 ~]$ docker run -d --name registry -p 5000:5000 --restart=always registry [devops@docker1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7af63fbff1cf registry "/entrypoint.sh /etc…" 50 minutes ago Up 50 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
비 보안(insecure) 허용 설정
docker registry 를 remote 에서 사용하면 기본적으로 https 만 사용하게 됩니다. ssl 설정을 하거나 아래와 같이 http 도 접속이 되도록 설정하여 사용 할 수 있습니다.
/etc/docker/daemon.json 파일을 생성하여 내용을 입력합니다.
[devops@docker1 ~]$ sudo vi /etc/docker/daemon.json -- 아래 내용 입력 {"insecure-registries": ["docker1:5000"] }
위와 같이 설정 후 재시작이 필요 합니다.
[devops@docker1 ~]$ sudo systemctl restart docker
tag 설정
docker registry 에 push 하기 전에 tag를 먼저 설정해야 하며 형식은 아래와 같습니다.
docker tag 이미지이름:tag registry URL주소:포트/원하는_이미지이름:tag
이전 포스팅에서 build 로 생성한 mynginx 라는 이미지를 사용하여 아래와 같이 tag를 수행을 하도록 하겠습니다.
[devops@docker1 ~]$ docker tag mynginx:1.0 docker1:5000/mynginx:1.0
tag 시에 마지막 이미지명과 tag는 원하는 데로 수정하여 설정할 수 있습니다.
참고로 삭제는 rmi 옵션을 사용하여 생성한 tag 를 삭제 할 수 있습니다.
-- 삭제 [devops@docker1 ~]$ docker rmi docker1:5000/mynginx:1.0
tag 설정 후 images 를 조회하면 아래와 같이 설정한 태그 내역을 확인 할 수 있습니다
[devops@docker1 ~]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mynginx 1.0 7d749bc3b862 4 days ago 215MB docker1:5000/mynginx 1.0 7d749bc3b862 4 days ago 215MB registry latest 1fd8e1b0bb7e 3 months ago 26.2MB
[참고] 다른 서버에서 접속하기 위해서는 OS 방화벽 데몬이 활성화 되어있다면 포트오픈을 해줘야 접속을 할수 있습니다. CentOS 기준 firewalld 로 사용중일 경우 아래와 같이 5000번 포트를 오픈 할 수 있습니다.
~]# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" \ source address=docker1 port port="5000" protocol="tcp" accept'
docker push
docker push 는 공개된 저장소(docker hub 등) 나 지금 작업한 개별의 registry 에 이미지를 등록(업로드) 하는 명령어 입니다. 아래와 같이 수행할 수 있습니다.
[devops@docker1 ~]$ docker push docker1:5000/mynginx:1.0 The push refers to repository [docker1:5000/mynginx] c0182a141d30: Pushed c3ab09f5a36c: Pushing [=============> ] 113.6MB/114.7MB 015b884d7998: Pushed 878dab86cf0f: Pushed
[참고] 아래와 같은 에러는 https 통신관련 설정이 되지 않아서 발생된 에러 입니다.
The push refers to repository [docker1:5000/mynginx] Get https://docker1:5000/v2/: http: server gave HTTP response to HTTPS client
도커 이미지 다운로드
위의 단계까지 완료 하였다면 이제 다른 서버(포스팅에서는 docker2 서버) 에서 도커 이미지를 다운 로드 받도록 하겠습니다.
먼저 hosts 에 다른 서버 정보를 입력해 두겠습니다.
[devops@docker2 ~]$ sudo vi /etc/hosts -- registry 서버 192.168.56.51 docker1
두번째 서버에서도 동일하게 비 보안(insecure) 설정을 하고 docker 를 재 시작 합니다.
[devops@docker2 ~]$ sudo vi /etc/docker/daemon.json -- 입력 {"insecure-registries": ["docker1:5000"] } -- 입력 완료 후 docker 재시작 [devops@docker2 ~]$ sudo systemctl restart docker
재시작 까지 완료 되었다면 curl 을 통해서 registry 에 등록된 정보를 아래와 같이 조회해볼 수 있습니다.
-- 다운로드 가능한 도커 이미지 검색 [devops@docker2 ~]$ curl -X GET http://docker1:5000/v2/_catalog {"repositories":["mynginx"]} -- 버전까지 추가 확인 [devops@docker2 ~]$ curl -X GET http://docker1:5000/v2/mynginx/tags/list {"name":"mynginx","tags":["1.0"]}
이제 다운로드 진행을 하면 됩니다.
-- 다운로드 실행(pull) docker pull docker1:5000/mynginx:1.0 1.0: Pulling from mynginx e7ae86ffe2df: Pull complete 620f45d6255b: Pull complete 76c6ce81907f: Extracting [===> ] 2.753MB/42.96MB 511d880618ca: Download complete Status: Downloaded newer image for docker1:5000/mynginx:1.0 docker1:5000/mynginx:1.0 -- 다운로드 된 이미지 [devops@wmp docker]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker1:5000/mynginx 1.0 7d749bc3b862 5 days ago 215MB
다운로드까지 완료되었습니다. 이제 도커 이미지가 정상적으로 실행되는지 확인 해보겠습니다.
-- 도커 이미지 실행 [devops@wmp docker]$ docker run -d --name test_nginx docker1:5000/mynginx:1.0 9552d4e6cc66b70c98395f2c00a282f30891c84903b2ca0bec5889b866e6defa -- 조회 [devops@wmp docker]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9552d4e6cc66 docker1:5000/mynginx:1.0 "nginx -g 'daemon of…" 2 seconds ago Up 1 second 80/tcp test_nginx
별도로 생성한 도커 이미지를 별도의 레파지토리로 사내나 그룹 또는 일부에게만 공유하고자 할 때 Registry 를 구성하여 사용을 하시면 됩니다.
Docker ONBUILD
ONBUILD 는 생성한 이미지를 기반으로 다른 이미지를 생성될 할때 명령을 실행 되게합니다. 즉 처음 이미지 Build 시에는 ONBUILD 에서 설정한 명령어를 수행하지 않습니다.
이렇게 생성된 이미지를 바탕으로 다음 이미지가 FROM으로 사용될 때 명령어가 실행 됩니다. 즉 다음 이미지에서 실행할 명령을 예약하는 기능이라 할 수 있습니다
Docker Build 관련하여 이전 포스팅에서 다룬 내용으로 Docker Build 에 대한 내용은 아래 내용을 참조하시면 됩니다.
아래 예제를 통해서 확인해보도록 하겠습니다.
Dockerfile 작성
Docker 이미지를 생성하기 위해서 Dockerfile 을 작성하도록 하겠습니다. 내용은 아래와 같습니다.
[devops@docker1 work]$ vi Dockerfile FROM ubuntu:18.04 # nginx RUN apt update RUN apt -y install nginx EXPOSE 80 ONBUILD RUN echo "Test ONBUILD" > /var/www/html/index.nginx-debian.html CMD ["nginx", "-g", "daemon off;"]
위의 내용은 ubuntu 18.04 을 베이스 이미지로 하여 apt cache를 최신화 하고, 그 다음 apt 로 nginx 를 설치하게 됩니다.
그 다음 아래 ONBUILD 옵션이 기재되어 있으며 echo "" 를 통해 파일에 내용을 입력을 하는 내용이 기재되어 있으며 그 아래 CMD 에는 Nginx 계속 실행 될 수 있도록 기술되어 있습니다.
[참고] 참고로 ubuntu 18.04 에서 apt 로 nginx 설치시의 index.html 은 /var/www/html/index.nginx-debian.html 로 됩니다.
이미지 Build
위에서 생성한 Dockerfile 을 토대로 새로운 이미지를 작성을 진행해 보도록 하겠습니다. tag 는 onbuild_test1 로 지정하고 생성 하였습니다.
[devops@docker1 work]$ docker build --tag onbuild_test1:1.0 . < ... 중략 ... > Step 4/6 : EXPOSE 80 ---> Running in 5b11a8cec3cc Removing intermediate container 5b11a8cec3cc ---> ddd815870a80 Step 5/6 : ONBUILD RUN echo "Test ONBUILD" > /var/www/html/index.nginx-debian.html ---> Running in f153659d580b Removing intermediate container f153659d580b ---> 9f2ec3f838ee Step 6/6 : CMD ["nginx", "-g", "daemon off;"] ---> Running in 764927b05edc Removing intermediate container 764927b05edc ---> 63f92d411dab Successfully built 63f92d411dab Successfully tagged onbuild_test1:1.0 [devops@docker1 work]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE onbuild_test1 1.0 63f92d411dab 3 minutes ago 161MB
첫번째 이미지 실행
생성한 도커 이미지를 실행 후 index.html 파일의 내용을 확인 해보겠습니다.
-- 이미지 조회 [devops@docker1 work]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE onbuild_test1 1.0 63f92d411dab 3 minutes ago 161MB -- 컨테이너 실행 [devops@docker1 work]$ docker run -d --name nginx1 onbuild_test1:1.0 d7eb0e2c75033175081d9d488221ee04d1830769043454bee9f0d5c2e3ed980b -- IP 조회 [devops@docker1 work]$ docker inspect nginx1 -f {{.NetworkSettings.IPAddress}} 172.17.0.3 -- index.html 내용 확인 [devops@docker1 work]$ curl http://172.17.0.3 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
도커 이미지를 생성하였을 때 ONBUILD 절에서 echo "Test ONBUILD" 를 통해서 파일의 내용을 입력하였지만 기본 index.html 파일이 확인되고 있습니다.
이제는 이 도커 이미지를 통해서 다시 다른 이미지를 생성해보도록 하겠습니다.
Dockerfile 작성
Dockerfile 을 아래와 같은 내용으로 작성 합니다.
[devops@docker1 work]$ vi Dockerfile FROM onbuild_test1:1.0 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
작성된 내용은 간단 합니다. 이전에 생성한 이미지인 onbuild_test1:1.0 이라는 이미지를 사용하고 해당 이미지는 nginx 임으로 CMD 에 nginx 에서 사용하는 명령어를 기재해 주었습니다.
docker build
Dockerfile 을 통해서 다시 도커 이미지를 생성 합니다. 예제에서는 onbuild_test2:1.0 이름으로 생성하였습니다.
[devops@docker1 work]$ docker build --tag onbuild_test2:1.0 . [devops@docker1 work]$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE onbuild_test2 1.0 dddd9fa71a90 49 seconds ago 161MB onbuild_test1 1.0 63f92d411dab 7 minutes ago 161MB
두번째 이미지 실행
새로 생성된 이미지를 통해 컨테이너 실행 및 실행 후 index.html 내용을 확인 해 보도록 하겠습니다.
devops@docker1 work]$ docker run -d --name nginx2 onbuild_test2:1.0 [devops@docker1 work]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b3f69bb88e16 onbuild_test2:1.0 "nginx -g 'daemon of…" 4 seconds ago Up 3 seconds 80/tcp nginx2 d7eb0e2c7503 onbuild_test1:1.0 "nginx -g 'daemon of…" 5 minutes ago Up 5 minutes 80/tcp nginx1 [devops@docker1 work]$ docker inspect nginx2 -f {{.NetworkSettings.IPAddress}} 172.17.0.4 [devops@docker1 work]$ curl http://172.17.0.4 Test ONBUILD
이번에 index.html 은 처음에 Dockerfile 을 작성한 내용이 실행되어 index.html 내용이 변경된 것을 확인 할 수 있습니다.
이와 같이 ONBUILD 는 생성할 때를 위해서 정의하는 것이 아닌 해당 도커 이미지를 통해서 다른 이미지를 생성하였을 때 수행되는 명령어에 대해서 처리하는 기능을 하게 됩니다.
여기 까지 Docker 에 대해서 간단하게 알아보았습니다.
다음에는 k8s 로 지칭되는 쿠버네티스 에 대해서 확인 해보도록 하겠습니다.
해당 연재글의 시작
이어서 볼 만한 포스팅 글
Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io