2016/03/20 14:12:52

ホストを再起動した時などにDockerコンテナを自動的に再起動できるようにする


Warning: Attempt to read property "post_excerpt" on null in /home/kpkyvkzp/public_html/unskilled.site/wp-content/themes/unskilled2/content-header-eyecatch.php on line 5
目次(クリックするとジャンプします)
  • 1:再起動ポリシーの設定
  • 1.1:--restartオプションがない場合
  • 1.2:--restartオプション(always)がある場合
  • 2:補足・ハマったポイント
  • 2.1:コンテナの起動順
  • 2.2:rmオプションとは併用できません
  • 3:まとめ

再起動ポリシーの設定

ホストを再起動するなりして、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オプションで再起動ポリシーが設定できる。
  • 設定値noon-failure[:max-retries]alwaysunless-stoppedの4つ。
  • うまく使えば自動起動設定として使える。
  • コンテナの起動順番は指定できない。