컨테이너와 Docker (6) - Registry - Docker ONBUILD

Share

Last Updated on 11월 20, 2021 by Jade(정현호)


안녕하세요 
이번 포스팅에서는 Docker Registry 와 ONBUILD 에 대해서 확인 해보도록 하겠습니다. 


아래 포스팅에서 이어지는 글입니다.

       

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 로 지칭되는 쿠버네티스 에 대해서 확인 해보도록 하겠습니다.


해당 연재글의 시작



이어서 볼 만한 포스팅 글

       

0
글에 대한 당신의 생각을 기다립니다. 댓글 의견 주세요!x