デーモンが停止中でも、コンテナの実行を維持

デフォルトでは、 Docker デーモンを終了(terminate)すると、実行中のコンテナを停止(shut down)します。Docker Engine 1.12 からは、デーモンが利用できない場合に、コンテナを実行し続けるかどうか設定するためのオプションを追加しました。この機能はライブ・リストア( live restore )と呼びます。リストアのオプションがあれば、デーモンのクラッシュ発生や、計画的な停止、アップグレード時にダウンタイムを短縮するのに役立ちます。

注釈

ライブ・リストアは Windows コンテナをサポートしていません。しかし、Docker Desktop for Windows 上で実行している Linux コンテナには動作します。

ライブ・リストアの有効化

デーモンが利用できなくなった場合、コンテナを残し続けるようにライブ・リストアを有効化にするには、2つの方法があります。 以下にある、いずれか1つのみ行ってください

  • デーモンの設定ファイル上で、設定を追加します。 Linux 上であれば、デフォルトは /etc/docker/daemon.json です。Docker Desktop for Windows や Docker Desktop for Mac であれば、タスクバーの Docker アイコンから、 Preferences -> Daemon -> Advanced をクリックします。

    • 以下の JSON を使うと live-restore を有効化します。

    {"live-restore":true}
    • Docker daemon を再起動します。 Linux 上であれば、Docker デーモンを再読込することで、再起動を防止できます(そして、コンテナに対する停止期間も防止)。 systemd を使っている場合は、 systemctlrestartdocker コマンドを使います。あるいは、 dockerd プロセスに対して SIGHUP シグナルを送信します。

  • あるいは別の方法として、 dockerd プロセスを手動で起動し、 --live-restore フラグを付けても可能です。しかし、この方法は推奨しません。セットアップ環境にある systemd や他のプロセス・マネージャが Docker プロセスを開始してしまう可能性があるためです。その結果、予期しない挙動になる可能性があります。

アップグレード中のライブ・リストア

ライブ・リストアは、 Docker デーモンを更新中でもコンテナを実行したままにします。しかし、サポートしているのはパッチ・リリース( 年.月.x の形式 )のバージョンに対してのみであり、メジャー( 年.月 の形式 )バージョンには対応していません。

リリースを越えてアップグレードを試みると、デーモンはコンテナとの通信が修復(リストア)できない可能性があります。もしもデーモンが接続を修復できなければ、実行中のコンテナは管理できなくなり、手動でコンテナを停止する必要になります。

再起動時のライブ・リストア

ライブ・リストアのオプション設定が機能するのは、デーモンのコンテナに対するオプション指定のみです。ブリッジ IP アドレスと、グラフ・ドライバは変更しません。デーモン・レベルの設定オプションを変更するのであれば、ライブ・リストアは動作せず、手動でコンテナを停止する必要が出てきます。

実行中のコンテナに対するライブ・リストアの影響

長期間にわたりデーモンが停止すると、実行中のコンテナでは、デーモンが通常読み込む FIFO ログが溢れてしまう可能性があります。コンテナからのロギングや他データなど、全てのログをブロックします。デフォルトのバッファ・サイズは 64K です。バッファが溢れると、これらをフラッシュするには Docker デーモンの再起動が必要になります。

Linux 上では、このカーネルのバッファ・サイズを /proc/sys/fs/pipe-max-size で変更できます。しかし、Docker Desktop for mac や Docker Desktop for Windows では、このバッファ・サイズを変更できません。

ライブ・リストアと swarm モード

ライブ・リストアオプションが有効になるのは、スタンドアロンのコンテナに対してであり、 swarm サービでは利用できません。 Swarm サービスは swarm マネージャによって管理されます。swarm マネージャが利用できなくなれば、 swarm サービスはワーカ・ノード上で実行し続けようとしますが、クォーラムを維持するために利用可能な swarm マネージャが十分でなければ、サービスの実行は維持できません。

参考

Keep containers alive during daemon downtime

https://docs.docker.com/config/containers/live-restore/