コンテナの再作成とデータ・ログの保持
イメージ、動いている実体、ファイルとログの保存場所を対応付けて確認します。
説明
ワークロードを停止・再作成すると、古い実体にしかない一時データが失われる場合があります。同じイメージや同じ名前で作り直しても、元の実体と同一ではありません。
一時領域に公開ファイルを作り、終了前のログを取得します。その後同じイメージから再作成し、識別子、ファイル、起動ログを比較します。
イメージ、動いている実体、ファイルとログの保存場所を対応付けて確認します。
1最初のコンテナを作成する
新しいコンテナIDを履歴へ残します。
docker run最初のコンテナを作成する -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'このIDを後で再作成したIDと比較します。同じ名前を使うだけでは実体の連続性を保証できません。
2一時領域に内容を保存する
6バイトの公開文字列を作り、ハッシュを取得します。
docker exec lbox-workload-sample sh -c 'printf public > /tmp/lesson-public; sha256sum一時領域に内容を保存する /tmp/lesson-public'ファイルはこのコンテナのtmpfs上にあります。イメージ自体へ書き戻されたものではありません。
3終了前に起動ログを取得する
PID 1の標準出力に残った記録を開きます。
docker logs終了前に起動ログを取得する lbox-workload-samplepublic-startです。前段のdocker execで表示した全コマンド出力が、PID 1のログへ自動で集約されるわけではありません。
4元のコンテナを停止して削除する
検証用コンテナだけを終了・削除します。
docker stop -t 1 lbox-workload-sample
docker rm元のコンテナを停止して削除する lbox-workload-sample元の実体のtmpfsは保持対象から外れます。調査で必要なファイルやログは、この操作より前に保存する必要があります。
5同じイメージから作り直す
名前とイメージ指定は最初と同じです。
docker run同じイメージから作り直す -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'返るIDは最初と異なります。オーケストレーターによる置換でも、新しい実体を古いプロセスと取り違えないよう識別子を確認します。
6古い一時ファイルの有無を調べる
再作成したコンテナで同じパスを検索します。
docker exec lbox-workload-sample sh -c 'if test -e古い一時ファイルの有無を調べる /tmp/lesson-public; then echo present; else echo absent; fi'absentです。一時領域の内容は引き継がれていません。永続ボリュームを使う構成では、別に保存範囲を確認します。
7同じイメージと新しい起動記録を照合する
イメージIDと新しい実体のログを開きます。
docker inspect --format '{{.Image}}同じイメージと新しい起動記録を照合する' lbox-workload-sample
docker logs lbox-workload-sampleイメージは同じでも起動処理は再び実行されています。復旧を確認するときは、元の脅威要因がイメージや外部ボリュームに残っていないかも調べます。
まとめ
名前やイメージが同じでも再作成後は別の実体です。
終了前に必要な証跡を保存します。
一時領域と永続領域を分けて復旧を確認します。
操作履歴と解説を振り返れます。
Docker / Alpine 3.22 / ネットワークなし・読取り専用コンテナ
docker run -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'2961bcfd1a7e58480461a966bf377381be391f206867d4695407d5af8885406a
docker exec lbox-workload-sample sh -c 'printf public > /tmp/lesson-public; sha256sum /tmp/lesson-public'efa1f375d76194fa51a3556a97e641e61685f914d446979da50a551a4333ffd7 /tmp/lesson-public
docker logs lbox-workload-samplepublic-start
docker stop -t 1 lbox-workload-sample
docker rm lbox-workload-samplelbox-workload-sample lbox-workload-sample
docker run -d --name lbox-workload-sample --network none --read-only --tmpfs /tmp:rw,noexec,nosuid,size=1m sha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 sh -c 'echo public-start; sleep 600'db6efce5bf6b5c846167e1692edd96250f9f019db173177925a480edb84355b0
docker exec lbox-workload-sample sh -c 'if test -e /tmp/lesson-public; then echo present; else echo absent; fi'absent
docker inspect --format '{{.Image}}' lbox-workload-sample
docker logs lbox-workload-samplesha256:5291449c3df73caf6ed85e649dec1b9e818b39a5d8c871e97afc13e9cd5e8fa8 public-start
演習完了