Dockerのrestartの挙動を確認してみる

まとめ

とりあえず、まず挙動をまとめておく。

ケース no on-failure unless-stopped always
コンテナ終了時(終了ステータス「0」) x x o o
コンテナ終了時(終了ステータス「0以外」) x o o o
Docker再起動時(終了ステータス「0」) x x x o
Docker再起動時(終了ステータス「0以外」) x o x o
Docker再起動時(終了していない状態) x o o o

--restart=no の場合 (デフォルト)

デフォルトでは、終了すると、

$ docker run -it --name my-con1 ubuntu
# exit

コンテナは停止する。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
5a6cdccff2e7   ubuntu    "/bin/bash"   6 seconds ago   Exited (0) 3 seconds ago             my-con1

また、コンテナが起動した状態で、

$ docker start my-con1
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
5a6cdccff2e7   ubuntu    "/bin/bash"   34 seconds ago   Up 4 seconds             my-con1

Dockerを再起動すると、

$ sudo systemctl restart docker

コンテナは停止した状態になる。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
5a6cdccff2e7   ubuntu    "/bin/bash"   53 seconds ago   Exited (0) 5 seconds ago             my-con1

※このコンテナは削除

$ docker rm my-con1

--restart=on-failure の場合

on-failureを指定した場合、
終了ステータス「0以外」で終了した場合は、

$ docker run -it --name my-con2 --restart=on-failure ubuntu
# exit 1

再起動する。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   3 minutes ago   Up 5 seconds             my-con2

終了ステータス「0」で終了した場合は、

$ docker attach my-con2
# exit

再起動しない。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                      PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   7 minutes ago   Exited (0) 25 seconds ago             my-con2

また、
終了ステータスが「0以外」の状態で、

$ docker start my-con2
$ docker kill my-con2
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                       PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   8 minutes ago   Exited (137) 5 seconds ago             my-con2

Dockerを再起動すると、

$ sudo systemctl restart docker

コンテナは再起動する。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   9 minutes ago   Up 3 seconds             my-con2

しかし、
終了ステータスが「0」の状態で、

$ docker stop my-con2
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                     PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   11 minutes ago   Exited (0) 3 seconds ago             my-con2

Dockerを再起動すると、

$ sudo systemctl restart docker

コンテナは再起動しない。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
17fc40e7e78a   ubuntu    "/bin/bash"   11 minutes ago   Exited (0) 35 seconds ago             my-con2

※このコンテナは削除

$ docker rm my-con2

--restart=unless-stopped の場合

unless-stoppedを指定した場合、
終了ステータスに関係なく、終了した場合は、

$ docker run -it --name my-con3 --restart=unless-stopped ubuntu
# exit

コンテナは再起動する。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1a3d5c4bf3eb   ubuntu    "/bin/bash"   4 seconds ago   Up 2 seconds             my-con3

Dockerを再起動した場合も、

$ sudo systemctl restart docker

コンテナは再起動するが、

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
1a3d5c4bf3eb   ubuntu    "/bin/bash"   2 minutes ago   Up 2 seconds             my-con3

終了ステータスに関係なく、コンテナが停止している場合、

$ docker kill my-con3
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                       PORTS     NAMES
1a3d5c4bf3eb   ubuntu    "/bin/bash"   3 minutes ago   Exited (137) 3 seconds ago             my-con3

Dockerを再起動しても、

$ sudo systemctl restart docker

コンテナは再起動しない。

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                        PORTS     NAMES
1a3d5c4bf3eb   ubuntu    "/bin/bash"   3 minutes ago   Exited (137) 34 seconds ago             my-con3

※このコンテナは削除

$ docker rm my-con3

--restart=always の場合

alwaysを指定した場合、 終了ステータスに関係なく、終了した場合は、

$ docker run -it --name my-con4 --restart=always ubuntu
# exit

コンテナは再起動する。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
374667e4f4db   ubuntu    "/bin/bash"   6 seconds ago   Up 4 seconds             my-con4

終了ステータスに関係なく、コンテナが停止している場合も、

$ docker stop my-con4
$ docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS                     PORTS     NAMES
374667e4f4db   ubuntu    "/bin/bash"   About a minute ago   Exited (0) 3 seconds ago             my-con4

Dockerを再起動すると、

$ sudo systemctl restart docker

コンテナは再起動する。

$ docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
374667e4f4db   ubuntu    "/bin/bash"   2 minutes ago   Up 5 seconds             my-con4

補足

Dockerのrestartの挙動を確認してみる(補足) https://yk5656.hatenablog.com/entry/20201225/1608822000