Dockerのrestart policyごとの違いが説明文だけだといまいちピンと来なかったので、実際に試した結果を表にまとめる。

https://docs.docker.com/config/containers/start-containers-automatically/

Start containers automatically

Docker provides restart policies to control whether your containers start automatically when they exit, or when Docker restarts. Restart policies ensure that linked containers are started in the correct order....

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-failurealwaysの違いは終了ステータスが0のときも再起動するか否かで、終了ステータスが0のときは前者は再起動せず、後者は再起動する。

alwaysunless-stoppedの違いはコンテナをdocker stopで手動で止めた場合にDocker daemonを再起動した場合で、前者は再起動するが後者は再起動しない。

on-failureに設定したコンテナのstatusがExitedの状態でDocker daemonを再起動した場合、 終了ステータスが0のコンテナは再起動しないが、0以外のコンテナは再起動する。


on-failureに設定したコンテナのstatusがExitedの状態でDocker daemonを再起動した場合の確認手順を備忘録がてら載せておく。

  1. exit 0するため再起動するコンテナ
  2. 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なので再起動していないことがわかる。