スナップ削除後のDockerコンテナの復元方法

スナップ削除後のDockerコンテナの復元方法

私は で docker を削除しましたsudo snap remove docker。実際は削除したくなかったのですが、 でインストールしたかどうかを確認しただけでしたsnap(後から考えれば を使用すべきでした)。のsnap listようにプロンプ​​トが表示されることを信頼していました。しかし、そのまま先に進み、docker が削除されました。問題ありません。再インストールするのは簡単でした。[Y/n]apt

しかし、コンテナはどこにありますか?! すべてのイメージとコンテナが(docker ps -a)消えてしまいました! アンインストールに長い時間がかかったので、バックアップがあるのか​​、ファイルはまだ保持されていてコンテナを復元できるのか疑問に思っています。イメージは気にせず、コンテナだけをお願いします。ありがとうございます。

確認しました/var/snap/docker/common/var-lib-docker/containersが、元の容器がありませんでした。

答え1

結局、長時間かかっていた操作はバックアップ、つまり彼らの用語で言うところのスナップショットだった。ドキュメンテーション:

スナップショットは、snap save コマンドを使用して手動で生成され、スナップが削除されたときに自動的に生成されます (snapd 2.39 以降が必要)。スナップショットを使用すると、スナップの状態をバックアップしたり、スナップを以前の状態に戻したり、新しい snapd インストールを以前に保存した状態に復元したりできます。

バージョンを確認しましたsnapd:

# snap --version
snap    2.52.1
snapd   2.52.1
series  16
ubuntu  21.04
kernel  5.11.0-40-generic

次に、利用可能なスナップショットを確認しました。

# snap saved
Set  Snap    Age    Version  Rev   Size    Notes
1    docker  2h58m  20.10.8  1125  1.39GB  auto

スナップショットが正常であることを確認しました:

# snap check-snapshot 1
Snapshot #1 verified successfully.

最後に、自動スナップショットを復元しました。

# snap restore 1
Restored snapshot #1.

この時点では、docker ps -a復元したいコンテナではなく、最新のインストール後に作成したコンテナが表示されていました。おそらく、新しいコンテナを作成していなければ、問題なく動作するでしょう。しかし、少なくともコンテナ ファイルは で見つけられるので、復元されたことはわかっています/var/snap/docker/common/var-lib-docker/overlay2/。何もないよりはましです。 には注意してくださいsnap remove

オリジナルコンテナの復元

私がこの状態に陥った経緯を振り返ってみましょう。

  • sudo snap remove docker重要なコンテナを一掃した
  • sudo snap install docker再度dockerをインストールするために実行しました
  • 実行さdocker-compose upれ、2つの新しいコンテナが起動しました
  • snap restore 1自動スナップショットを復元するために実行しました

この時点で、復元されたコンテナ ファイルを見つけることができましたが、docker ps -a実際のコンテナはまだ表示されませんでした。要約すると、完全なコンテナを復元するために行った操作は次のとおりです。

  • 2回目のインストール後、必要なくなったコンテナとイメージをすべて削除しました。
  • 再度 docker を削除しsudo snap remove docker、自動スナップショットが再度実行されていることを確認しました。「自動スナップショット セット #2 にスナップ「docker」のデータを保存します」
  • 最初のスナップショットを再度復元しました:snap restore 1

docker ps -aこれで、すべてのコンテナが停止状態で再び表示されます。ただし、問題が 1 つあります。コンテナの 1 つが起動せず、次のメッセージが表示されますError: response from daemon: OCI runtime create failed: container with id exists:...

これを回避するために私が見つけた最も簡単な方法は、docker commit <container-id>結果のイメージを使用して新しいコンテナーとして起動することでした。問題がないことを確認した後、壊れたものを削除しました。すべて正常に戻りました。

ちなみに、コンテナ内のデータを永続化するにはボリュームを使用するのがよい方法だと考えられています。イメージも保存されたアーカイブへ。

関連情報