再起動ポリシーの設定
ホストを再起動するなりして、Dockerコンテナを立ち上げる際に手動で行うのはとても面倒なものです。
そこでコンテナを作るときに、run
コマンドの--restart
オプションをつけて、再起動のポリシーを決めておく手があります。
こんな感じ。
$ docker run -it --restart=always --name nores busybox
オプションでの設定は4つあります。
ポリシー | 結果 |
---|---|
no | 再起動を行わない。デフォルトではこれです。 |
on-failure[:max-retries] | コンテナが異常終了した場合(ステータス0以外)に再起動をします。再起動のリトライ回数を設定できます。 |
always | 終了ステータスに関わらずデーモンが起動する際などどんな条件下でも(stopコマンドで止めない限り)再起動します。 |
unless-stopped | デーモンが起動する際に直近コンテナが停止状態無い限り再起動します。 |
–restartオプションがない場合
--restart
オプションがない場合、ホストを再起動した場合など、コンテナを終了させると勝手には起動しません。別途start
コマンドなどで立ち上げる必要があります。
実際に試してみます。まずは–restartオプションがない(つまりnoの状態)場合です。
$ docker run -it --name nores busybox
ctrl+p ctrl+q
でコンテナを抜けてdocker ps
コマンドでコンテナを確認してみます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9128e235d17 busybox "sh" 32 seconds ago Up 4 seconds nores
起動していることが確認できます。
この状態でDockerデーモンを再起動してみます。
$ sudo systemctl restart docker.service
再起動させた後にdocker ps
コマンドで確認してみます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
デーモンが再起動した際にコンテナは停止したので、なんにも表示されません。
–restartオプション(always)がある場合
今度は--restart
を設定してみます。設定はalways
で試してみます。
$ docker run -it --restart=always --name res busybox
先ほどと同じ様にctrl+p ctrl+q
でコンテナを抜けてdocker ps
コマンドでコンテナを確認してみます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90b39bfe51cd busybox "sh" 9 seconds ago Up 7 seconds res
この状態でDockerデーモンを再起動してみます。
$ sudo systemctl restart docker.service
再起動させた後にdocker ps
コマンドで確認してみます。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90b39bfe51cd busybox "sh" 2 minutes ago Up 8 seconds res
自動的に起動していることが確認できます。
こんな風に、自動的に再起動されるので場合によってはとても便利かと思いマス。
補足・ハマったポイント
コンテナの起動順
コンテナの起動順番を指定するようなものではないようです。
たとえばデータベースコンテナと連携するコンテナなどの場合、データベースコンテナを先に起動している必要がありますが、この--restart
オプションを使っても、おそらく起動順を保証できないかと思います(はず)。
もし連携があるならDocker Comoposeなどのオーケストレーションツールを使うのが吉かと思いマス。
rmオプションとは併用できません
--restart
と --rm
は排他的なので同時には設定できません。終了したら削除されちゃいますからね。
まとめ
- Dockerコンテナは
run
コマンドの--restart
オプションで再起動ポリシーが設定できる。 - 設定値
no
、on-failure[:max-retries]
、alway
、sunless-stopped
の4つ。 - うまく使えば自動起動設定として使える。
- コンテナの起動順番は指定できない。