docker 图像共享相同的图层吗?
Do docker images share identical layers?
我知道每个容器都是一个镜像,在一堆只读层之上有一个 readable/writeable 层,多个容器可以共享镜像的只读层。从同一基础图像创建的两个图像是否共享相同的图像?
示例:
- 图像 A 有 5 层,大小为 1GB。
- 图像 B 以 A 为基础图像创建,并添加了另一层,重量为 1.1GB。
- Image C 以 A 作为其基础图像创建并添加了另一层并且重量为 1.5GB
总磁盘 space 现在是 3.6GB 还是 1.6GB?
简答:1.6GB
这是一个您可以进行的有趣实验:
拉取虚拟图像:
docker pull alpine
为 子镜像准备一个 Dockerfile alpine
(这里我使用 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
是只读的。
此外,所有这些都可以在主机系统上进行探索。这里是~10MB delta 是我在构建子镜像的时候人为添加的 dd
sudo du -sh "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff"
9.8M /var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff
我知道每个容器都是一个镜像,在一堆只读层之上有一个 readable/writeable 层,多个容器可以共享镜像的只读层。从同一基础图像创建的两个图像是否共享相同的图像?
示例:
- 图像 A 有 5 层,大小为 1GB。
- 图像 B 以 A 为基础图像创建,并添加了另一层,重量为 1.1GB。
- Image C 以 A 作为其基础图像创建并添加了另一层并且重量为 1.5GB
总磁盘 space 现在是 3.6GB 还是 1.6GB?
简答:1.6GB
这是一个您可以进行的有趣实验:
拉取虚拟图像:
docker pull alpine
为 子镜像准备一个 Dockerfile alpine
(这里我使用 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
是只读的。
此外,所有这些都可以在主机系统上进行探索。这里是~10MB delta 是我在构建子镜像的时候人为添加的 dd
sudo du -sh "/var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff"
9.8M /var/lib/docker/overlay2/5ca936630339967105c28d4d8c9669d99f0f449a307c43c09d60f6341cf56271/diff