Dockerのrestart policyごとの違いを表でまとめてみる
Dockerのrestart policyごとの違いが説明文だけだといまいちピンと来なかったので、実際に試した結果を表にまとめる。
https://docs.docker.com/config/containers/start-containers-automatically/
Start containers automatically
o=再起動する・x=再起動しないとして表にまとめると、
no | on-failure | always | unless-stopped | |
---|---|---|---|---|
コンテナが終了ステータス0で終了した場合 | x | x | o | o |
コンテナが終了ステータス0以外で終了した場合 | x | o | o | o |
コンテナのステータスがExitedの状態で Docker daemonを再起動した場合 |
x | Exited (0) のときはxそれ以外のときはo |
o | x |
コンテナのステータスがExited以外の状態で Docker daemonを再起動した場合 |
x | o | o | o |
となる。
on-failure
とalways
の違いは終了ステータスが0のときも再起動するか否かで、終了ステータスが0のときは前者は再起動せず、後者は再起動する。
always
とunless-stopped
の違いはコンテナをdocker stop
で手動で止めた場合にDocker daemonを再起動した場合で、前者は再起動するが後者は再起動しない。
on-failure
に設定したコンテナのstatusがExitedの状態でDocker daemonを再起動した場合、
終了ステータスが0のコンテナは再起動しないが、0以外のコンテナは再起動する。
on-failure
に設定したコンテナのstatusがExitedの状態でDocker daemonを再起動した場合の確認手順を備忘録がてら載せておく。
exit 0
するため再起動するコンテナexit 1
で再起動中にdocker stop
で止めたコンテナ
の2つのコンテナを用意して試してみる。
$ docker run -d --restart on-failure --name exited_with_0 centos:centos7 /bin/bash -c 'sleep 3; exit 0'
$ docker run -d --restart on-failure --name exited_manually centos:centos7 /bin/bash -c 'sleep 3; exit 1'
exited_manually
コンテナはstopしておく。
$ docker stop exited_manually
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d46d036d7aa centos:centos7 "/bin/bash -c 'sleep…" 17 seconds ago Exited (1) 3 seconds ago exited_manually
20f039939274 centos:centos7 "/bin/bash -c 'sleep…" 30 seconds ago Exited (0) 25 seconds ago exited_with_0
exited_manually
コンテナはステータスがExited (1)
、exited_with_0
コンテナはステータスがExited (0)
になっている。
ここでDocker daemonを再起動した後に再度docker ps -a
してみると、
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3d46d036d7aa centos:centos7 "/bin/bash -c 'sleep…" 5 minutes ago Up 2 seconds exited_manually
20f039939274 centos:centos7 "/bin/bash -c 'sleep…" 5 minutes ago Exited (0) 5 minutes ago exited_with_0
exited_manually
コンテナは再起動しているが、exited_with_0
コンテナはCREATEDが5 minutes agoでSTATUSも5 minutes agoなので再起動していないことがわかる。