Linux(Centos or RHEL)/docker

도커 데몬이 종료되어도 컨테이너의 상태 보존

최소양 2020. 4. 23. 16:37

아래 링크를 참조하였습니다.

https://docs.docker.com/config/containers/live-restore/

 

Keep containers alive during daemon downtime

By default, when the Docker daemon terminates, it shuts down running containers. Starting with Docker Engine 1.12, you can configure the daemon so that containers remain running if the daemon...

docs.docker.com

 

도커 데몬이 종료되면 컨테이너들도 종료가 됩니다. 만약 도커 데몬이 crash가 발생하여 종료되거나, 도커 데몬의 업그레이드를 위해서 데몬을 재시작해야 하는 경우가 있습니다. 이 경우에 가동중인 컨테이너도 종료할 수밖에 없고, 그럼 서비스 제공을 잠시 멈춰야 할 경우가 있습니다. 여기서는 도커 데몬이 종료되더라도 컨테이너의 상태를 보존하는 옵션인 “live-restore”를 설정을 해 보겠습니다.

 

step1. 옵션을 설정하지 않은 상태에서 컨테이너를 가동시킨 후, 도커 데몬을 정지시켜봅니다.

1. 도커 데몬 설정합니다.

“/etc/docker/daemon.json“ 설정

[root@centos77 ~]# cat /etc/docker/daemon.json

{

}

[root@centos77 ~]#

 

”docker info“ 결과

[root@centos77 ~]# docker info

...

Live Restore Enabled: false

...

[root@centos77 ~]#

 

 

 

2. 테스트용 nginx 컨테이너를 하나 가동합니다.

[root@centos77 ~]# docker run --name nginx -d -p 80:80 nginx

bce15d7a2acd5e2de9c39118d87431723028ca91b3be31e4b4c147501e8b90f6

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bce15d7a2acd nginx "nginx -g 'daemon of" About a minute ago Up About a minute 0.0.0.0:80->80/tcp nginx

[root@centos77 ~]#

 

 

 

3. nginx 컨테이너에 curl로 동작을 확인해 봅니다.

[root@centos77 ~]# curl 127.0.0.1:80

<!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

nginx.org.

Commercial support is available at

nginx.com.

 

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

[root@centos77 ~]#

 

반응이 돌아오는 것을 확인할 수 있습니다.

 

 

 

4. 실행중인 컨테이너를 ps 몀령어로 확인해 봅니다.

[root@centos77 ~]# ps -ef | grep bce15d7a2acd

root 4947 1232 0 14:04 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/bce15d7a2acd5e2de9c39118d87431723028ca91b3be31e4b4c147501e8b90f6 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

root 5037 3521 0 14:08 pts/0 00:00:00 grep --color=auto bce15d7a2acd

[root@centos77 ~]#

 

”bce15d7a2acd”“1.”에서 확인한 컨테이너의 id입니다. 현재 컨테이너가 가동중이라는 것을 확인할 수 있습니다.

 

 

 

5. 도커 데몬을 정지시킵니다.

[root@centos77 ~]# systemctl stop docker

[root@centos77 ~]# systemctl status docker

docker.service - Docker Application Container Engine

Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

Active: inactive (dead) since 2020-04-23 14:09:39 KST; 5s ago

Docs: https://docs.docker.com

Process: 4312 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)

Main PID: 4312 (code=exited, status=0/SUCCESS)

 

423 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...

423 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...

423 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...

423 13:42:31 centos77.linux systemd[1]: Started Docker Application ....

423 14:04:27 centos77.linux dockerd[4312]: time="2020-04-23T14:04:27...

423 14:09:39 centos77.linux systemd[1]: Stopping Docker Application....

423 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...

423 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...

423 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...

423 14:09:39 centos77.linux systemd[1]: Stopped Docker Application ....

Hint: Some lines were ellipsized, use -l to show in full.

[root@centos77 ~]#

 

 

 

6. 컨테이너의 상태를 확인해 봅니다.

[root@centos77 ~]# curl 127.0.0.1:80

curl: (7) Failed connect to 127.0.0.1:80; 연결이 거부됨

[root@centos77 ~]# docker ps -a

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

[root@centos77 ~]# ps -ef | grep bce15d7a2acd

root 5227 3521 0 14:11 pts/0 00:00:00 grep --color=auto bce15d7a2acd

[root@centos77 ~]#

 

curl 명령어로도 아무런 답을 얻을 수 없고, docker 명령어도 듣지 않으며, ps 명령어로도 컨테이너를 확인할 수 없습니다.

 

 

 

 

step2. 옵션을 설정한 상태에서 컨테이너를 가동시킨 후, 도커 데몬을 정지시켜봅니다.

 

1. 도커 데몬 설정을 해 줍니다.

[root@centos77 ~]# cat /etc/docker/daemon.json

{

"live-restore": true

}

[root@centos77 ~]# systemctl restart docker

[root@centos77 ~]#

 

 

 

2. 도커 데몬의 설정을 확인해 봅니다.

[root@centos77 ~]# systemctl status docker

docker.service - Docker Application Container Engine

Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

Active: active (running) since 2020-04-23 14:14:11 KST; 53s ago

Docs: https://docs.docker.com

Main PID: 5267 (dockerd)

Tasks: 8

Memory: 40.0M

CGroup: /system.slice/docker.service

└─5267 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/...

 

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux systemd[1]: Started Docker Application ....

Hint: Some lines were ellipsized, use -l to show in full.

[root@centos77 ~]# docker info

...

Live Restore Enabled: true

...

 

 

 

3. step1에서 실행했던 컨테이너를 재가동 시키고, 컨테이너의 동작을 다시 확인해 봅니다.

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bce15d7a2acd nginx "nginx -g 'daemon of" 11 minutes ago Exited (0) 6 minutes ago nginx

[root@centos77 ~]# docker start nginx

nginx

[root@centos77 ~]# curl 127.0.0.1:80

<!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

nginx.org.

Commercial support is available at

nginx.com.

 

 

<p><em>Thank you for using nginx.</em></p>

</body>

</html>

[root@centos77 ~]# ps -ef | grep bce15d7a2acd

root 5506 1232 0 14:17 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/bce15d7a2acd5e2de9c39118d87431723028ca91b3be31e4b4c147501e8b90f6 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

root 5569 3521 0 14:19 pts/0 00:00:00 grep --color=auto bce15d7a2acd

[root@centos77 ~]#

 

 

4. 도커 데몬을 정지시킵니다.

[root@centos77 ~]# systemctl stop docker

[root@centos77 ~]# systemctl status docker

docker.service - Docker Application Container Engine

Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)

Active: inactive (dead) since 2020-04-23 14:19:38 KST; 3s ago

Docs: https://docs.docker.com

Process: 5267 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=0/SUCCESS)

Main PID: 5267 (code=exited, status=0/SUCCESS)

Tasks: 0

Memory: 24.0K

CGroup: /system.slice/docker.service

 

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...

423 14:14:11 centos77.linux systemd[1]: Started Docker Application ....

423 14:19:38 centos77.linux systemd[1]: Stopping Docker Application....

423 14:19:38 centos77.linux dockerd[5267]: time="2020-04-23T14:19:38...

423 14:19:38 centos77.linux dockerd[5267]: time="2020-04-23T14:19:38...

423 14:19:38 centos77.linux systemd[1]: Stopped Docker Application ....

Hint: Some lines were ellipsized, use -l to show in full.

[root@centos77 ~]#

 

 

5. 컨테이너의 상태 및 동작을 확인해 봅니다.

[root@centos77 ~]# docker ps -a

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

[root@centos77 ~]# curl 127.0.0.1:80

curl: (7) Failed connect to 127.0.0.1:80; 연결이 거부됨

[root@centos77 ~]# ps -efl | grep bce15d7a2acd

0 S root 5506 1232 0 80 0 - 26922 futex_ 14:17 ? 00:00:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/bce15d7a2acd5e2de9c39118d87431723028ca91b3be31e4b4c147501e8b90f6 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

0 R root 5728 3521 0 80 0 - 29219 - 14:25 pts/0 00:00:00 grep --color=auto bce15d7a2acd

[root@centos77 ~]#

 

컨테이너 프로세스는 살아 있으나, 동작은 하지 않는 것을 알 수 있습니다. 컨테이너 프로세스의 상태를 보면 S(TASK_INTERRUPTIBLE) 상태인 것을 알 수 있습니다.

 

 

6. 도커 데몬을 다시 실행시킵니다.

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bce15d7a2acd nginx "nginx -g 'daemon of" 26 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp nginx

[root@centos77 ~]#

 

컨테이너의 상태가 계속 유지되고 있는 것을 확인할 수 있습니다.

 

 

도커 데몬을 정지시키더라도 컨테이너 자체는 종료되지 않는 것을 알 수 있었습니다. 컨테이너 프로세스의 상태가 S이므로, 커널의 여러 다른 S 상태의 프로세스들과 같이 대기 상태인 것임을 알 수 있었습니다.

추가로, 도커 데몬에 “live-restore“옵션을 설정한 상태에서, 도커 데몬을 20분 가량 정지시켜 놓은 상태로 두었다가, 다시 실행하였을 때에 컨테이너의 상태는 다음과 같습니다.

 

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bce15d7a2acd nginx "nginx -g 'daemon of" 26 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp nginx

[root@centos77 ~]# systemctl stop docker

# 여기서 20분 가량 대기

[root@centos77 ~]# systemctl start docker

[root@centos77 ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bce15d7a2acd nginx "nginx -g 'daemon of" 52 minutes ago Up 39 minutes 0.0.0.0:80->80/tcp nginx

[root@centos77 ~]#

 

컨테이너의 CREATEDSTATUS의 값이 증가 된 것을 확인할 수 있습니다.

 

 

이와 비슷한 기능으로는 컨테이너를 가동시킬 때에 설정할 수 있는 옵션인 --restart가 있습니다. 해당 옵션은 도커 데몬이 실행될 때에 자동으로 옵션을 설정한 컨테이너를 재시작시킬 것인가를 지정하는 옵션입니다.

https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart