Dockerが終了すると、すべてのコンテナーが停止します。デフォルトのインストールでは、デーモンも起動していない限り、コンテナは実行されません。デーモンの停止中にコンテナを存続させることにより、ワークロードのダウンタイムを最小限に抑える方法は次のとおりです。
なぜこれが重要なのですか?
Dockerは、本番環境でソリューションをサポートできる信頼性の高いシステムであることが証明されています。それは間違いないということではありません。それでも、デーモンが動作しなくなり、コンテナがオフラインになるクラッシュが発生する可能性があります。
別のシナリオでは、オペレーティングシステムのパッケージマネージャーがDockerを自動更新し、デーモンが再起動して短時間のダウンタイムが発生する場合があります。理想的には、これらの状況はワークロードに影響を与えることなく解決できます。デーモンは管理するだけなので コンテナ、docker run
などのコマンドを実装する およびdocker rm
、コンテナのライフサイクルの間にある期間を通して、それが固執する必要はありません。
Dockerは、これを可能にする「ライブリストア」と呼ばれるシステムをサポートしています。 Dockerは、デーモンのシャットダウン中にコンテナーを終了する代わりに、コンテナーを実行し続けます。再起動すると、中断したところから再開します。
ライブリストアは手動で有効にする必要があります。 dockerd
を実行すると、1回限りで使用できます。 --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デーモンは常に再起動されます。
Dockerデーモン設定をその場で編集する方法としてLiveRestoreを使用する場合は注意が必要です。ブリッジIPアドレスなどの一部のオプションを変更すると、デーモンの再起動時にコンテナーが正しく復元されなくなります。この場合、影響を受けるすべてのコンテナを手動で停止し、新しいコンテナと交換する必要があります。この状況は、再起動後にオペレーティングシステムが別のネットワーク設定を割り当てた場合にも発生する可能性があります。
Live Restoreは、Dockerの更新および計画外のデーモンの停止中に使用することを目的としています。デーモン設定を編集する必要がある場合は、代わりにダウンタイムを計画してみてください。 systemctl reload docker
を使用することもできます デーモンを完全に再起動せずに構成ファイルをリロードします。
Windowsベースのコンテナ用のLiveRestoreはまだありません。 できます ライブ復元を使用する Linuxベースのコンテナを備えたWindows。 Docker Desktopに組み込まれており、[設定]>[デーモン]>[詳細]から有効になります。
Live Restoreを使用すると、Dockerデーモンがない状態でコンテナーを実行し続けることで、中断を伴うダウンタイムを最小限に抑えることができます。緊急のDockerアップデートをインストールする必要がある場合、または突然のクラッシュが発生した場合は、デーモンが再起動している間、ワークロードは動作し続ける必要があります。
ライブリストアのアクティブ化は、本番環境でDockerを実行する場合のベストプラクティスの手順です。構成分析ツールは、それが有効になっていないインストールにフラグを立てる場合があります。
Live Restoreを使用するだけでなく、コンテナにも適切な再起動ポリシーがあることを確認する必要があります。 restart: always
を使用する OSの再起動後、またはLiveRestoreを使用できなかった他のデーモンの起動後に個々のコンテナが復旧します。