デーモンが停止したときにDockerコンテナを実行し続ける方法
Dockerが終了すると、すべてのコンテナが停止します。デフォルトのインストールでは、デーモンも稼働していない限り、コンテナは実行できません。デーモンのダウンタイム中にコンテナを生かしておくことで作業負荷のダウンタイムを最小限に抑える方法を紹介します。
これはなぜ重要なのですか?
Dockerは、製品環境でのソリューションをサポートできる信頼性の高いシステムであることが証明されています。しかし、それが無謬であるとは言えません。ダイモンが機能を停止し、コンテナがオフラインになるようなクラッシュに遭遇する可能性もまだあります。
別のシナリオでは、オペレーティングシステムのパッケージマネージャがDockerを自動更新し、デーモンが再起動され、一時的なダウンタイムが発生する可能性があります。理想的には、これらの状況は作業負荷に影響を与えることなく解決されるべきです。デーモンはコンテナのみを管理するため、次のようなコマンドを実装することができます。
docker runそして
docker rm
そのため、コンテナのライフサイクルにおいて、その期間中ずっと存在する必要は本質的にはありません。
コンテナライブリストア
Dockerは「ライブリストア」と呼ばれるシステムをサポートしており、これにより可能になります。デーモンのシャットダウン中にコンテナを終了するのではなく、Dockerはそれらを実行し続けます。再起動後、Dockerは前回の状態から再開します。
ライブリストアは手動で有効にする必要があります。実行することで、一度限り使用できます。
dockerdと共に
--live-restore flag:
sudo dockerd --live-restoreライブリストアを永続的に有効にするには、Dockerデーモンの設定ファイルに追加してください。これは通常、/etc/docker/daemon.jsonにあります。ファイルが存在しない場合は、作成する必要があります。
{
"live-restore": true
}
次に、Dockerに設定を再読み込みするように指示する必要があります。再読み込みは、フルデーモン再起動とは異なり、コンテナに影響を与えません。
sudo systemctl reload dockerライブリストアは現在アクティブになりました。Dockerデーモンを停止することでテストできます。
sudo systemctl stop docker
実行中のコンテナは、デーモンがシャットダウンしてもアクティブなままであるべきです。デーモンへの接続が失われるため、docker コマンドを使用することはできませんが、コンテナは実行を続け、ネットワーク接続も保持されます。
Dockerは再起動時に既存のコンテナを自動的に検出します。ダウンタイムなしで、作業を中断したところから再開できます。
持続的なデーモンなしの実行の取り扱い
アクティブなデーモン接続なしでコンテナを実行しても、長時間にわたって深刻な影響はないはずです。しかし、長期間にわたるデーモンの停止中には、ログが失われ始めることがあることに気付くでしょう。
Dockerコンテナは、そのログを先入れ先出し(FIFO)バッファにパイプします。Dockerデーモンはバッファの内容を読み取り、docker logsで表示される永続ログファイルを作成します。
デフォルトのバッファサイズはわずか64Kなので、デーモンがその内容を積極的に読み取っていないと枯渇する可能性があります。バッファが満杯になると、デーモンがバッファフラッシュを完了するまで、これ以上のログを処理することができません。/proc/sys/fs/pipe-max-sizeの値を編集することで、バッファサイズを増やすことができます。
ライブリストアの注意事項
Live Restoreは、Dockerデーモンがシャットダウンし、その後復旧するほとんどのシナリオをカバーするはずです。これにはDockerの更新が含まれますが、マイナーパッチリリースの間だけです。新しいメジャーDockerバージョン(例えば19.03から20.10)をインストールすると、Live Restoreは使用されず、Dockerデーモンは常に再起動されます。
Live Restoreを使用してDockerデーモン設定を即時変更することには注意が必要です。ブリッジIPアドレスなどのいくつかのオプションを変更すると、デーモンが再起動した際にコンテナが適切に復元されなくなります。この場合、影響を受けたすべてのコンテナを手動で停止し、新しいコンテナに置き換える必要があります。この状況は、オペレーティングシステムが再起動後に異なるネットワーク設定を割り当てた場合にも発生する可能性があります。
ライブリストアは、Dockerのアップデートや予期しないデーモンの停止中に使用することを目的としています。デーモンの設定を編集する必要がある場合は、ダウンタイムを計画することをお勧めします。また、systemctl reload dockerを使用して、デーモンを完全に再起動することなく設定ファイルを再読み込みすることもできます。
WindowsベースのコンテナにはまだLive Restoreはありません。LinuxベースのコンテナではWindowsでLive Restoreを使用できます。これはDocker Desktopに組み込まれており、設定 > デーモン > 高度な設定から有効にできます。
結論
Live Restoreは、Dockerデーモンが不在の場合でもコンテナを実行し続けることで、混乱を最小限に抑えることができます。緊急のDockerアップデートをインストールする必要がある場合や、予期しないクラッシュが発生した場合でも、デーモンが再起動している間、ワークロードは稼働し続けるべきです。
本番環境でDockerを実行する際、ライブリストアを有効にすることは最良の実践手順です。構成分析ツールは、それを有効にしていないインストールを警告することがあります。
ライブリストアを使用するだけでなく、コンテナに適切な再起動ポリシーが設定されていることも確認すべきです。restart: alwaysを使用すると、OSの再起動後やライブリストアが使用できなかった他のデーモン起動時に、個々のコンテナが再起動します。
