多个同镜像创建的容器如何访问其他容器内镜像打包的目录?
解决方案
方案1:Overlay本地卷方案(支持读写,满足CoW需求)
Docker 18.06及以上版本内置的local卷驱动原生支持overlay文件系统挂载,无需特权权限即可实现目录共享+写入隔离,公共目录仅存一份,无冗余存储占用:
- 操作步骤:
- 导出镜像内置目标目录到主机只读公共目录(假设镜像内目标路径为
/app/data):
# 临时启动容器导出目录内容 docker run --rm -v /host/path/common-ro:/export <镜像名称> cp -a /app/data/. /export # 配置公共目录只读权限 chmod -R 555 /host/path/common-ro
- 为每个容器创建独立的overlay卷:
# 容器1专属卷 docker volume create \ --driver local \ --opt type=overlay \ --opt o=lowerdir=/host/path/common-ro,upperdir=/host/path/container1/upper,workdir=/host/path/container1/work \ vol-container1 # 容器2专属卷,以此类推 docker volume create \ --driver local \ --opt type=overlay \ --opt o=lowerdir=/host/path/common-ro,upperdir=/host/path/container2/upper,workdir=/host/path/container2/work \ vol-container2
- 启动容器时挂载对应卷到目标路径即可:
docker run -d -v vol-container1:/app/data <镜像名称>
所有容器初始目录内容和镜像内置内容完全一致,每个容器的修改只会写入自身对应的upper目录,不会影响其他容器,也不会产生多份公共目录副本。
方案2:只读访问方案
如果仅需要只读访问其他容器的镜像内置目录,无需修改,可直接共享目标容器的进程命名空间访问:
# 访问目标容器内的/app/data目录内容 docker run --rm --pid=container:<目标容器名称> alpine ls /proc/1/root/app/data
该方式无需额外存储开销,也不需要特权权限。
内容的提问来源于stack exchange,提问作者Gomo
相关产品推荐
相关产品推荐

