도커 데몬이 종료되어도 컨테이너의 상태 보존
아래 링크를 참조하였습니다.
https://docs.docker.com/config/containers/live-restore/
도커 데몬이 종료되면 컨테이너들도 종료가 됩니다. 만약 도커 데몬이 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
Commercial support is available at
<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)
4월 23 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...
4월 23 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...
4월 23 13:42:31 centos77.linux dockerd[4312]: time="2020-04-23T13:42:31...
4월 23 13:42:31 centos77.linux systemd[1]: Started Docker Application ....
4월 23 14:04:27 centos77.linux dockerd[4312]: time="2020-04-23T14:04:27...
4월 23 14:09:39 centos77.linux systemd[1]: Stopping Docker Application....
4월 23 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...
4월 23 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...
4월 23 14:09:39 centos77.linux dockerd[4312]: time="2020-04-23T14:09:39...
4월 23 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/...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 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
Commercial support is available at
<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
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux dockerd[5267]: time="2020-04-23T14:14:11...
4월 23 14:14:11 centos77.linux systemd[1]: Started Docker Application ....
4월 23 14:19:38 centos77.linux systemd[1]: Stopping Docker Application....
4월 23 14:19:38 centos77.linux dockerd[5267]: time="2020-04-23T14:19:38...
4월 23 14:19:38 centos77.linux dockerd[5267]: time="2020-04-23T14:19:38...
4월 23 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 ~]#
컨테이너의 CREATED와 STATUS의 값이 증가 된 것을 확인할 수 있습니다.
이와 비슷한 기능으로는 컨테이너를 가동시킬 때에 설정할 수 있는 옵션인 --restart가 있습니다. 해당 옵션은 도커 데몬이 실행될 때에 자동으로 옵션을 설정한 컨테이너를 재시작시킬 것인가를 지정하는 옵션입니다.
https://docs.docker.com/engine/reference/commandline/run/#restart-policies---restart