码头工人图像共享相同的图层吗?

时间:2020-07-23 15:14:42

标签: docker dockerfile docker-image

我知道每个容器都是一幅图像,在一堆只读层之上有一个可读/可写层,并且多个容器可以共享该图像的只读层。从同一基本图像创建的两个图像共享相同的图像吗?

示例:

  • 图像A有5层,重1GB。
  • 图像B是使用A作为其基础图像创建的,并添加了另一层并重达1.1GB。
  • 创建映像C时以A为基础映像,并添加了另一层并重达1.5GB

磁盘总容量现在是3.6GB还是1.6GB?

1 个答案:

答案 0 :(得分:2)

简短回答:1.6GB

这是您可以执行的有趣实验:


拉虚拟图像:

docker pull alpine

子映像 alpine准备Dockerfile(这里我使用dd在映像中创建了10MB的文件)

FROM alpine
RUN dd if=/dev/zero of=file.txt count=10000 bs=1024

建立子图像

docker build -t alpine-plus-ten-mb .

然后检查两个图像并查看图层。

  • 下级目录可以是只读目录,也可以是覆盖目录。
  • 上层目录通常是可写的。
  • 合并目录是上下目录的统一视图
  • 工作目录用于在各层之间切换文件时准备文件。
docker image inspect --format='{{json .GraphDriver.Data}}' alpine
{
    "MergedDir": "/var/lib/docker/overlay2/0654e44ddf13ebd2a0feb2ac6261e62f6c83a8be1937a71c544f69eb6208d93b/merged",
    "UpperDir": "/var/lib/docker/overlay2/0654e44ddf13ebd2a0feb2ac6261e62f6c83a8be1937a71c544f69eb6208d93b/diff",
    "WorkDir": "/var/lib/docker/overlay2/0654e44ddf13ebd2a0feb2ac6261e62f6c83a8be1937a71c544f69eb6208d93b/work"
}

docker image inspect --format='{{json .GraphDriver.Data}}' alpine-plus-ten-mb
{
    "LowerDir": "/var/lib/docker/overlay2/0654e44ddf13ebd2a0feb2ac6261e62f6c83a8be1937a71c544f69eb6208d93b/diff",
    "MergedDir": "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/merged",
    "UpperDir": "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff",
    "WorkDir": "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/work"
}

d93b/diff层对于我们的子图像alpine-plus-ten-mb是只读的。
而且,所有这些都可以在主机系统上进行探索。这是在构建子映像时,我用dd人工添加的〜10MB delta

sudo du -sh "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff"
9.8M    /var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff