很可能有一个重复,但是,我真的不能在网上找到一个答案,从这个Angular 解决这个问题。
问题
突然,docker
“丢失”了我所有的容器。我到处看了看,发现这是一个比较常见的现象。我记得在过去的几年里,它也征服了我两次或三次,但我不记得当时我是如何解决的。
昨天,运行docker container ls
可以很好地工作,并输出我在过去几年中创建的所有容器的列表。今天早上我醒来时被我的双份浓缩咖啡呛住了,看到所有的容器都不见了。运行docker container ls
将输出一个空列表,就好像我以前从未创建过容器一样,即使/var/lib/docker/containers
目录包含容器的所有(最新)数据(以及/var/lib/docker
中上一级的所有其他数据)。
上下文
- 操作系统:Kali GNU/Linux Rolling
***操作系统版本:**5.19.0-kali 2-amd 64
***Docker版本:**19.03.15
***Docker守护进程版本:**20.10.19+ dfsg 1
我尝试了什么
我尝试重新启动Docker守护进程,结果没有变化。
我还尝试复制/var/lib/docker
目录,删除原始目录并使用副本的内容重新创建它,因为someone has said解决了他们的问题。但对我没用。
我试图通过将data-root
设置为/var/lib/docker
并重新启动守护进程,在/etc/docker/daemon.json
配置文件中显式地声明数据目录的路径,但这也无济于事。
我试着重新安装Docker,运行:
sudo apt-get install --reinstall docker-ce
但这并没有改变什么。
最后,我试着重新启动系统。没有区别。
附:
2条答案
按热度按时间hjzp0vay1#
/var/lib/docker
目录的内容因Docker用于存储的驱动程序而异。当您将回退到
overlay
,overlay2
,btrfs
,devicemapper
或zfs
时,这取决于您的内核支持。在大多数地方,这将是aufs
,RedHat使用devicemapper
。您可以使用
-s
或--storage-driver=
选项手动将存储驱动程序设置为Docker守护程序。/var/lib/docker/{driver-name}
将包含用于图像内容的驱动程序特定存储。/var/lib/docker/graph/<id>
现在只在json和layersize文件中包含关于图像的元数据。在AUFS的情况下:
/var/lib/docker/aufs/diff/<id>
具有图像的文件内容。/var/lib/docker/repositories-aufs
是包含本Map像信息的JSON文件。这可以通过命令docker images来查看。在设备Map程序的情况下:
/var/lib/docker/devicemapper/devicemapper/data
存储映像/var/lib/docker/devicemapper/devicemapper/metadata
元数据请注意,这些文件是精简配置的“稀疏”文件,因此没有看起来那么大。aemubtdh2#
更新
我在网上搜索了一段时间,偶然发现了来自SO的this comment,它建议使用
--all
标志运行docker container ls
:这导致了一个列表,其中填充了我在Docker中创建的每个容器(yippy)。
我遇到的下一个问题是,当我试图启动这些容器中的任何一个时,我会抛出以下错误:
我可以将这个错误追溯到
service docker status
的日志,当我运行dockerd
时:似乎有很多东西都没有被支持...我真的找不出原因,因为几天前一切都很好,我也不记得碰过任何与cgroups或内核级别相关的东西。我决定用
journalctl -xu docker
检查Docker守护进程的日志,在我决定重新启动守护进程之前,我没有发现任何错误的行为(那是我被浓缩咖啡呛到的时候)。无论哪种方式,进一步搜索,我发现this answer给了我一个关于内核和Docker之间可能支持cgroup v1和v2不兼容的线索。使用this answer,我通过运行
mount | grep cgroup
验证了我的内核支持cgroup v1和v2。但是,v2安装到/sys/fs/cgroup
。我运行的Docker版本是19.03.15(
docker version
),根据这些注解,原来在Docker版本20.10.0中添加了对cgroup 2的支持:运行时
因此,我决定根据Debian的文档(因为我在Kali上)将Docker更新到最新版本(我的情况是24.0.0)。顺便说一句,如果你也在Kali上,你应该用
bookworm
替换文档中的$VERSION_CODENAME
,因为that's what Kali is based off of。我更新成功,
Your kernel does not support ...
日志不再出现。我可以通过运行以下示例来验证cgroup是否确实工作:这不再抛出
NanoCPUs can not be set
错误。但是,docker
不再从/var/lib/docker
读取任何数据。运行docker container ls --all
、docker images
和docker volume ls
,我会得到默认的容器、镜像和卷,这些都是你在干净的Docker安装中通常拥有的。尽管/var/lib/docker
* 仍然 * 包含了我以前的所有数据。运行
docker info
时,我注意到这行代码:因此,我不再多说,打开Docker的单元文件
/lib/systemd/system/docker.service
,并将ExecStart
选项改为:对此:
换句话说,我将
--data-root=/var/lib/docker
添加到启动守护进程的命令中。现在,运行
docker container ls --all
、docker images
和docker volume ls
将输出我的所有容器、映像和卷!我甚至可以开始他们。
没有错误。