如何同时将单个卷挂载到多个/var/lib/docker?

2024-04-27

可以将单个 docker 卷共享给多个 docker 容器/var/lib/docker目的地?

一个最小的可重现示例如下:

$ docker volume create --name lib
$ docker run --privileged -v lib:/var/lib/docker --name c1 -d docker:dind
$ docker run --privileged -v lib:/var/lib/docker --name c2 -d docker:dind

我想与docker inside c1 and c2同时容器。但如果你等一下,你会发现这是不可能的,第二个容器(c2)停止。我检查了错误日志:

$ docker logs -f c2
.
.
.
failed to start containerd: timeout waiting for containerd to start

而且,我无法制作多卷;由于存储空间有限且图像体积较大。

UPDATE:也许我正面临着 XY 问题!其实我想分享我的图像。我希望我的主机中的所有 Docker 镜像都进入所有 DinD 容器,而且容器应该能够创建新的 Docker 镜像,并且这个新镜像应该可以同时从其他容器访问。


关于问题的标题,是的,多个容器可以挂载同一卷。但是,您的容器每个都是 docker 引擎,而第二个引擎无法启动,因为容器上已经有一个正在运行的 docker 引擎。/var/lib/docker目录。这与其说是卷安装问题,不如说是 Docker 引擎设计挑战。

根据您的要求,来自主机引擎的容器映像数据库与各种 DinD 实例共享,同时不共享主机本身的 docker 引擎(通过docker.sock或 mTLS),我不认为有一个好的答案。你有两个选择:

  1. 运行您自己的本地注册表服务器。这可以防止层被发送到网络之外,甚至可以位于同一主机上。但是,将为每个引擎复制这些层,并且您需要管理该注册表上的 GC 策略。这为您提供了所需的隔离,而无需对图像层进行所需的重复数据删除。

  2. 分享docker.sock主机和受信任容器之间。然后,容器可以直接访问主机引擎,有效地在主机上 root(除非您将引擎设置为无根),因此仅在您信任的环境中执行此操作。这将为您提供层重复数据删除,但没有隔离。

困难的原因是 docker 被设计来管理它自己的副本/var/lib/docker,因此可以在内存中跟踪所有状态,并定期将其作为 json 元数据文件推送到磁盘上以处理重新启动。互斥体位于一个进程内,不需要担心多个写入者修改层,或者在写入者仍在创建层时读取器正在运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何同时将单个卷挂载到多个/var/lib/docker? 的相关文章

随机推荐