快照删除docker后如何恢复docker容器

Nag*_*gev 4 docker snap

我用 删除了 docker sudo snap remove docker。我实际上并不想删除它,只是检查我是否安装了它(事后snap应该使用),相信它会提示我类似的操作。但它只是继续删除了 docker。美好的。很快又重新安装了一次。snap list[Y/n]apt

但是,我的容器在哪里?!所有图像和容器都(docker ps -a)消失了!卸载花了很长时间,所以我想知道是否有一些备份或文件仍然保留并且容器可以恢复?不关心图像,只关心容器。谢谢。

检查过,/var/snap/docker/common/var-lib-docker/containers但原来的容器不在那里。

Nag*_*gev 5

事实证明,花费很长时间的操作确实是备份,或者用他们的术语来说,是快照。从文档中:

快照是使用 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
Run Code Online (Sandbox Code Playgroud)

然后查看可用的快照:

# snap saved
Set  Snap    Age    Version  Rev   Size    Notes
1    docker  2h58m  20.10.8  1125  1.39GB  auto
Run Code Online (Sandbox Code Playgroud)

检查快照是否正常:

# snap check-snapshot 1
Snapshot #1 verified successfully.
Run Code Online (Sandbox Code Playgroud)

最后恢复自动快照:

# snap restore 1
Restored snapshot #1.
Run Code Online (Sandbox Code Playgroud)

此时docker ps -a仍然向我显示了我在最新安装后创建的容器,而不是我想要恢复的容器。也许如果我没有创建新的容器,它就会起作用。但我知道至少容器文件已经恢复,因为我可以在/var/snap/docker/common/var-lib-docker/overlay2/. 这总比没有好。小心snap remove

恢复原始容器

让我回顾一下我是如何进入这种状态的:

  • ransudo snap remove docker消灭了重要的容器
  • 再次跑去sudo snap install docker安装docker
  • rundocker-compose up带来了两个新容器
  • 运行snap restore 1恢复自动快照

此时我能够找到恢复的容器文件,但docker ps -a仍然没有显示实际的容器。总之,这就是我为取回完整容器所做的事情:

  • 第二次安装后删除了所有可见的容器和图像,因为我不需要它们
  • 再次删除 docker,并sudo snap remove docker注意到自动快照再次发生:“在自动快照集 #2 中保存快照“docker”的数据”
  • 再次恢复第一个快照:snap restore 1

现在,如果我这样做docker ps -a,我可以再次看到所有容器处于停止状态!但有一个问题,其中一个无法启动,并显示以下消息:Error: response from daemon: OCI runtime create failed: container with id exists:...

为了解决这个问题,我发现的最简单的方法是docker commit <container-id>使用生成的图像将其作为新容器启动。我一看没问题,就把坏掉的扔掉了。一切恢复正常!

顺便说一句,使用卷将数据保存在容器中被认为是很好的做法。图像也可以保存到存档中。