Docker 镜像和容器:磁盘大小、虚拟大小、运行大小混淆

时间:2021-03-09 08:57:15

标签: docker

有人可以解释或链接一篇解释 Docker“大小”的文章吗?

例如 - 我提取了一些基于 Windows 的容器:

docker system df --verbose
Images space usage:

REPOSITORY                                                                                 TAG                                    IMAGE ID       CREATED        SIZE      SHARED SIZE   UNIQUE SIZE   CONTAINERS
mcr.microsoft.com/windows/servercore                                                       1909-amd64                             8116ea20e860   3 weeks ago    5.509GB   5.509GB       0B            0
mcr.microsoft.com/dotnet/framework/aspnet                                                  4.8-windowsservercore-1909             eff771fe260f   3 weeks ago    7.523GB   7.523GB       0B            0
mcr.microsoft.com/windows/servercore                                                       ltsc2019                               31902e4b25a6   4 weeks ago    5.212GB   0B            5.212GB       0
mcr.microsoft.com/powershell                                                               lts-windowsservercore-2004             7c3eedbd9958   6 weeks ago    4.84GB    0B            4.84GB        0
mcr.microsoft.com/dotnet/framework/sdk                                                     4.8                                    27c31113cb5e   3 months ago   8.667GB   0B            8.667GB       0
microsoft/mssql-server-windows-developer                                                   2017-GA                                454b8faa6c43   3 years ago    11.55GB   0B            11.55GB       0

Containers space usage:

CONTAINER ID   IMAGE                          COMMAND   LOCAL VOLUMES   SIZE      CREATED         STATUS                    NAMES
db7868c7480c   mcr.microsoft.com/powershell   "cmd"     0               0B        4 seconds ago   Exited (0) 1 second ago   happy_agnesi

Local Volumes space usage:

VOLUME NAME                                                        LINKS     SIZE
721e8ed501b31c35f3d847b09189ce21a1c33c32b0daff48fa2a17e57c92afda   0         0B
73f678eec23d645575b96df63d48c9b3c7b3c379bd11f01d12d6fc0a7180fa2d   0         0B
e1e165e9776dda6afb73ba8af79e337f6ef19268935fdf485aead0942bb5934d   0         0B
3210cffd7ef3a592487b69695338448cb9aa31917c2dc2c25e628e866a71ba6a   0         0B

Build cache usage: 0B

CACHE ID   CACHE TYPE   SIZE      CREATED   LAST USED   USAGE     SHARED

我从上面的 Docker 镜像 mcr.microsoft.com/windows/servercore 数据中了解到:

  1. 我的物理硬盘需要大约 5.509GB 吗?
  2. 一旦我开始图像 docker run -d ..... 这个尺寸会堆积起来吗?因此,上面图像的 2 个正在运行的容器将在我的物理硬盘上占用 5.509 Gb + 5.509 Gb = 11.018 Gb 左右?
  3. mcr.microsoft.com/dotnet/framework/aspnet 的大部分层都基于 mcr.microsoft.com/windows/servercore 镜像的层 - 那么它对 docker push 命令(到私有仓库)有任何影响吗?对 docker pull 命令有任何影响吗?
  4. 在容器内我写了很多日志(千兆字节的日志)。它不是虚拟的东西——它也应该占用我的物理硬盘空间? (我知道它会在容器停止后被删除,但关于 running 状态的问题) - 是否有任何地方/命令可以看到这个大小?我可以在 Windows 图像上限制这个大小吗?
  5. 关于使用我忘记的物理磁盘空间的任何问题?停止容器使用/保留空间?
  6. 关于运行容器的 memory 的一点解释:它不在容器之间共享(?)所以假设运行 100 个内存饥饿的容器将有效地吃掉我计算机上的所有物理内存,然后呢?运行新容器会被拒绝吗?一切都会冻结?有什么工具可以防止这种情况发生?

1 个答案:

答案 0 :(得分:1)

  1. 如果图片是 5GB,您需要 5GB。如果您已经有几层,则只需要为没有的层留出空间。 例如:
# You already have an Image that consists of these layers
3333
2222
1111

# You pull an image that consists of these layers:
AAAAA   <-- You only need to pull (and need additional space) for this layer
22222
11111

如果您删除第一个图像,则只会删除图层 3333,但其他 2 个图层仍被其他图像使用且无法删除。

  1. 无论您启动多少容器,您都只需要一次空间用于层。正在运行的容器不占用镜像空间。它在图像顶部创建一个 DIFF 层,与图像相比只需要空间来进行更改。例如,如果您启动一个 debian 容器并创建一个文件 /opt/helloworld.txt,该容器不需要 debian 映像的空间,因为所有层都是共享空间。您只需要文件 /opt/helloworld.txt
  2. 的空间
  3. 这同样适用于您的私有仓库,只有不存在的层才会被推送。如果您的所有图像都基于 mcr.microsoft.com/windows/servercore,则您只需要为您自己的附加层提供空间。
  4. 您不应该在容器中写入。将它们写入标准输出或卷。如果您将它们写入标准输出,您可以使用 logrotate 和 max-size 规则,它将位于 /var/lib/docker/containers/<container>/<container>-json.log (您的 docker 路径可能会有所不同)。是的,它占用了硬盘驱动器上的空间。您正在运行的容器在 /var/lib/docker/containers/overlay2/ 中有一个条目,与您的图像相比,容器文件系统上的所有更改(例如,如果您编写的日志在它位于那里之前并不存在)。如果目录只包含日志文件,您可以为该目录创建一个卷并从主机使用 logrotate。否则你会被它困住,它会占用空间。
  5. 容器不会占用您磁盘上的任何重要空间(只有几 kb + stdout + 文件系统更改),除非您向 stdout 写入大量内容并且不旋转日志文件(参见 4.)并且空间被释放只有当它们被移除时。卷不会自动删除,因此在删除容器后它们会占用空间。不过,它们应该在容器重新启动之间保持不变。
  6. 如果您的内存不足,主机将缓慢冻结并且没有响应,或者您的主机将开始随机删除内容。 docker afaik 没什么特别的。如果您使用诸如 docker-swarm 或 Kubernetes 之类的工具,并且现在显然还使用 vanilla docker,则可以进行内存限制,但我没有阅读。