デーモン停止時のコンテナー継続起動

Docker デーモンが停止すると、デフォルトでは起動中のコンテナーも停止します。 デーモンが利用できなくなっても、コンテナーが起動し続けるように設定することができます。 この機能のことを ライブリストア(live restore)と呼びます。 ライブリストアのオプションを使えば、デーモンの障害時、計画停電時、システム更新時などに伴うコンテナーのダウンタイムを軽減できます。

メモ

ライブリストアは Windows コンテナーに対応していません。 ただし Docker Desktop for Windows 上にて動作する Linux コンテナーには対応しています。

ライブリストア有効化

ライブリストアを有効にする方法は2つあります。 デーモンが利用不能になっても、これによりコンテナーを起動し続けることができます。 ただしこれを行うのは 2つのうちのいずれか1つ としてください。

  • デーモン設定ファイルに設定を加えます。 Linux の場合、設定ファイルのデフォルトは /etc/docker/daemon.json です。 また Docker Desktop for Mac あるいは Docker Desktop for Windows の場合は、タスクバー上の Docker アイコンを選び、 Preferences -> Daemon -> Advanced をクリックします。

    • 以下の JSON 記述を加えて live-restore を有効にします。

      {
        "live-restore": true
      }
      
    • Docker デーモンを再起動します。 Linux の場合、再起動はせず(いずれのコンテナー停止も避けるために)Docker デーモンのリロードを行うこともできます。 systemd 利用時は systemctl reload docker コマンドを実行します。 それ以外の場合は dockerd プロセスに対して SIGHUP シグナルを送信します。

  • 上とは別に、dockerd プロセスを手動で起動する際に --live-restore フラグを与える方法もあります。 ただしこの方法は推奨されません。 この方法によると Docker プロセス起動時に、systemd や他のプロセスが利用可能な環境を作り出していないからです。 このことが予期しない動作となることがあります。

デーモン更新時のライブリストア

ライブリストアの機能により、Docker デーモンの更新中でもコンテナーを起動し続けることができます。 ただしパッチリリース (YY.MM.x) のインストール時のみが対象であって、メジャーアップデート (YY.MM) の場合はサポートされません。

各アップデートのリリースを1度でも取りやめていた場合、デーモンによるコンテナーへの接続が復元できなくなる場合があります。 コンテナーへの接続が復元できなかった場合、起動中のコンテナーを制御できなくなっているので、手動でコンテナーを停止させる必要があります。

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

ライブリストアのオプションによってコンテナーが復元されるのは、デーモンのオプション、たとえばブリッジ 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 マネージャーが管理できる状態になるまで、Swarm サービスを管理することはできません。

docker, upgrade, daemon, dockerd, live-restore, daemonless container