티스토리 뷰

728x90
반응형

이번 포스팅에서는 도커 이미지 스냅샷 생성 과정에 대해 살펴보겠습니다.

지난 시간까지 도커 폐쇄망 구축 및 도커 내부 저장소 설치 과정 및 이미지 백업 / 롤백 과정에 대해 살펴보았습니다.

해당 포스팅은 아래를 참고하시기 바랍니다.

 

[Docker] 폐쇄망에 Docker 구축하기

[Spring Boot] Spring Boot Structure

[Spring Boot] Nexus3 도커 레지스트리

기동 중인 도커 컨테이너에 파일 복사하기

1) Docker Container 기동 및 Hi.html 파일 복사

지난 시간에 Apache를 이용한 Docker 이미지를 생성하고 Hello.html 파일을 적용하는 과정에 대해 살펴보았습니다.

이번에는 생성 된 이미지를 기동한 상태로 사용 중에 변경 사항이 발생되어 이미지에 추가로 파일을 적용하거나, 설정을 변경하거나, 소프트웨어를 설치하거나 등의 이유로 내부 컨테이너로 파일을 복사하여 운영하고자 할 경우 어떻게 해야 하는지 살펴보는 시간이 될 것입니다.

a) docker run & docker ps -a 확인

[root@nrson ~]# docker run -dit --name my-running-app -p 8090:80 192.168.56.107:9090/privatedockereg/my-apache2:latest 
d82ff474b64ca3112fff000c45c5c3680dc35978695bb6011701d4e62243b313 
[root@nrson ~]# docker exec -it ^C 
[root@nrson ~]# docker ps -a 
CONTAINER ID        IMAGE                                                  COMMAND              CREATED             STATUS              PORTS                  NAMES 
d82ff474b64c        192.168.56.107:9090/privatedockereg/my-apache2:latest   "httpd-foreground"   2 minutes ago       Up 2 minutes        0.0.0.0:8090->80/tcp   my-running-app 
[root@nrson ~]# 

위와 같이 docker run을 이용하여 Docker Container를 기동합니다. docker ps 명령어로 도커 컨테이너 기동상태를 확인합니다.

b) docker cp

[root@nrson public-html]# cat Hi.html 
Hi! 
[root@nrson public-html]# docker cp Hi.html my-running-app:/usr/local/apache2/htdocs/ 
[root@nrson public-html]# 

다음으로 Hi.html 파일을 작성하여 docker cp를 이용한 Docker Container 특정 위치로 파일을 복사합니다.

c) docker exec (docker container 내부 접속)

[root@nrson ~]# docker exec -it d82ff474b64c /bin/bash 
root@d82ff474b64c:/usr/local/apache2# cd htdocs/ 
root@d82ff474b64c:/usr/local/apache2/htdocs# ls -la 
total 8 
drwxr-xr-x 1 root     root     24 Jul 17 05:58 . 
drwxr-xr-x 1 www-data www-data 18 Jul 10 15:22 .. 
-rw-r--r-- 1 root     root      7 Jul 17 04:26 Hello.html 
-rw-r--r-- 1 root     src      45 Jun 11  2007 index.html 
root@d82ff474b64c:/usr/local/apache2/htdocs# ls -la 
total 12 
drwxr-xr-x 1 root     root     21 Jul 19 00:44 . 
drwxr-xr-x 1 www-data www-data 32 Jul 10 15:22 .. 
-rw-r--r-- 1 root     root      7 Jul 17 04:26 Hello.html 
-rw-r--r-- 1 root     root      4 Jul 19 00:44 Hi.html 
-rw-r--r-- 1 root     src      45 Jun 11  2007 index.html 
root@d82ff474b64c:/usr/local/apache2/htdocs# 

복사가 완료되면 다음과 같이 docker exec로 도커 컨테이너에 접속을 수행합니다.

복사 명령어인 docker cp를 사용하기 전에는 해당 경로에 Hi.html 파일이 존재하지 않았고, 명령어 수행 후 Hi.html 파일이 /usr/local/apache2/htdocs 하위에 복사된 것을 확인할 수 있습니다.

복사가 완료되었으면, 직접 화면을 호출해 보도록 하겠습니다.

위와 같이 Hi.html이 정상적으로 호출되는 것을 볼 수 있습니다.

d) docker container 빠져나오기

위의 경우 애플리케이션을 적용하기 위한 방안으로 정적 파일이라 별다른 작업 없이 복사가 완료되었는지만 확인한 후 Docker Container를 빠져 나옵니다. 이때 유의해야 할 점은 exit나 Ctrl + C 등으로 빠져나오게 되면 Apache Process가 다운되며, Docker Container Process가 종료되게 되므로 다음과 같이 수행하여 빠져나와야 합니다.

Ctrl + p + q

도커 컨테이너 스냅샷 생성

현재 기동 중인 도커 컨테이너는  docker commit 명령어로 스냅샷을 생성할 수 있습니다.

명령어 옵션은 다음과 같습니다.

docker commit -p CONTAINER_ID IMAGE

[root@nrson ~]# docker ps -a  
CONTAINER ID        IMAGE                                                  COMMAND              CREATED             STATUS              PORTS                  NAMES  
d82ff474b64c        192.168.56.107:9090/privatedockereg/my-apache2:latest   "httpd-foreground"   2 minutes ago       Up 2 minutes        0.0.0.0:8090->80/tcp   my-running-app  
[root@nrson ~]# 

위와 같이 docker ps -a로 현재 기동 중인 상태의 Docker Container를 확인하고 CONTAINER_ID와 IMAGE를 아래와 같이 매칭 시켜 스냅샷을 생성합니다.

docker commit -p d82ff474b64c 192.168.56.107:9090/privatedockereg/my-apache2-hi:latest 

[root@nrson ~]# docker commit -p d82ff474b64c 192.168.56.107:9090/privatedockereg/my-apache2-hi:latest 
sha256:10f4cecc2acbf6e1592ac6aa6738e78df4c4b1fe256bea522c235ba917c70003 
[root@nrson ~]# docker images 
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE 
192.168.56.107:9090/privatedockereg/my-apache2-hi   latest              10f4cecc2acb        17 seconds ago      154 MB 
192.168.56.107:9090/privatedockereg/my-apache2      latest              d7376096de75        42 hours ago        154 MB 
192.168.56.107:9090/privatedockereg/httpd           latest              ee39f68eb241        5 days ago          154 MB 
docker.io/httpd                                    latest              ee39f68eb241        5 days ago          154 MB 
[root@nrson ~]# 

생성이 완료되었으며, docker images 명령어로 신규로 생성한 my-apache2-hi Local Reposiroty가 생성되었는지 확인합니다.
생성이 완료되었으면 아래와 같이 Docker Private Registry or Docker Public Registry에 해당 이미지를 push 합니다.

[root@nrson ~]# docker push 192.168.56.107:9090/privatedockereg/my-apache2-hi:latest 
The push refers to a repository [192.168.56.107:9090/privatedockereg/my-apache2-hi] 
b5ed9ff9622b: Pushed 
cfb6da81464a: Layer already exists 
635721fc6973: Layer already exists 
bea448567d6c: Layer already exists 
bfaa5f9c3b51: Layer already exists 
9d542ac296cc: Layer already exists 
d8a33133e477: Layer already exists 
latest: digest: sha256:6a990e55564e5efae09bda7c5d84826cf81898335a58aa2ab0b12570ab2028f1 size: 1781 
[root@nrson ~]# 

도커의 경우 위와 같이 변경된 스냅샷만 변동이 발생하여 나머지 Layer는 그대로 유지되고 변동된 부분의 스냅샷만 Pushed 되는 상태로 Repository에 업로드 되게 됩니다.

마지막으로 Nexus3 Docker Private Registry에 접속하여 Push 상태를 확인해 보도록 하겠습니다.

이를 기반으로 전체적인 복사 및 스냅샷 과정은 다음과 같습니다.

이상으로 도커 컨테이너 스냅샷 생성 과정에 대한 포스팅을 마치겠습니다.

사실 이와 같은 작업은 사전 Dockerfile을 잘 작성하여 수행할 수 있으나, 사용 도중 부득이하게 변동이 이뤄날 경우 유지해야 하는 데이터가 있거나, 셋팅한 정보를 잃고 싶지 않거나 등등 도커 컨테이너 자체를 스냅샷 뜨고 싶을때 유용하게 사용할 수 있을 듯 합니다.

728x90
반응형