linux 如何让Docker正确读取`/var/lib/docker`?

of1yzvn4  于 2023-05-22  发布在  Linux
关注(0)|答案(2)|浏览(184)

很可能有一个重复,但是,我真的不能在网上找到一个答案,从这个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

但这并没有改变什么。
最后,我试着重新启动系统。没有区别。
附:

hjzp0vay

hjzp0vay1#

/var/lib/docker目录的内容因Docker用于存储的驱动程序而异。
当您将回退到overlayoverlay2btrfsdevicemapperzfs时,这取决于您的内核支持。在大多数地方,这将是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元数据请注意,这些文件是精简配置的“稀疏”文件,因此没有看起来那么大。

aemubtdh

aemubtdh2#

更新

我在网上搜索了一段时间,偶然发现了来自SO的this comment,它建议使用--all标志运行docker container ls

docker container ls --all

这导致了一个列表,其中填充了我在Docker中创建的每个容器(yippy)。
我遇到的下一个问题是,当我试图启动这些容器中的任何一个时,我会抛出以下错误:

Error response from daemon: NanoCPUs can not be set, as your kernel does not support CPU cfs period/quota or the cgroup is not mounted
Error: failed to start containers: <...>

我可以将这个错误追溯到service docker status的日志,当我运行dockerd时:

Your kernel does not support swap memory limit
Your kernel does not support memory reservation
Your kernel does not support oom control
Your kernel does not support memory swappiness
Your kernel does not support kernel memory limit
Your kernel does not support kernel memory TCP limit
Your kernel does not support cgroup cpu shares
Your kernel does not support cgroup cfs period
Your kernel does not support cgroup cfs quotas
Your kernel does not support cgroup rt period
Your kernel does not support cgroup rt runtime
Unable to find blkio cgroup in mounts

似乎有很多东西都没有被支持...我真的找不出原因,因为几天前一切都很好,我也不记得碰过任何与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是否确实工作:

docker run --cpus 1 hello-world

这不再抛出NanoCPUs can not be set错误。但是,docker不再从/var/lib/docker读取任何数据。运行docker container ls --alldocker imagesdocker volume ls,我会得到默认的容器、镜像和卷,这些都是你在干净的Docker安装中通常拥有的。尽管/var/lib/docker * 仍然 * 包含了我以前的所有数据。
运行docker info时,我注意到这行代码:

Docker Root Dir: /var/snap/docker/common/var-lib-docker

因此,我不再多说,打开Docker的单元文件/lib/systemd/system/docker.service,并将ExecStart选项改为:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

对此:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/var/lib/docker

换句话说,我将--data-root=/var/lib/docker添加到启动守护进程的命令中。
现在,运行docker container ls --alldocker imagesdocker volume ls将输出我的所有容器、映像和卷!
我甚至可以开始他们。
没有错误。

相关问题