我用 删除了 docker sudo snap remove docker
。我其实并不想删除它,只是想检查我是否用 安装了它snap
(事后看来应该用snap list
),相信它会[Y/n]
像 一样提示我apt
。但它只是继续删除了 docker。很好。很快就重新安装了它。
但是,我的容器在哪里?!所有图像和容器(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
后出现了两个新容器 - 运行
snap restore 1
以恢复自动快照
此时,我能够找到恢复的容器文件,但docker ps -a
仍然没有显示实际的容器。总之,这是我为恢复完整容器所做的事情:
- 在第二次安装后删除了所有可见的容器和图像,因为我不需要它们
- 再次删除docker
sudo snap remove docker
并发现自动快照再次发生:“将快照“docker”的数据保存在自动快照集#2中”。 - 再次恢复第一个快照:
snap restore 1
现在,如果我这样做,docker ps -a
我可以再次看到所有容器都处于停止状态!但是有一个问题,其中一个容器无法启动,并显示以下消息:Error: response from daemon: OCI runtime create failed: container with id exists:...
。
为了解决这个问题,我发现最简单的方法是docker commit <container-id>
使用生成的图像将其作为新容器启动。在看到它没问题之后,我摆脱了损坏的那个。一切恢复正常!
顺便说一句,使用卷来保存容器中的数据是一种很好的做法。图像也可以已保存到档案馆。