gpt4 book ai didi

Docker镜像和容器: size on-disk,虚拟大小,运行大小困惑

转载 作者:行者123 更新时间:2023-12-05 06:03:53 25 4
gpt4 key购买 nike

有人可以解释或链接一篇解释 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 命令(到私有(private)仓库)有什么影响吗?对 docker pull 命令有什么影响吗?
  4. 在容器内我写了很多日志(数 GB 的日志)。它不是虚拟的——它也应该占用我的物理硬盘空间? (我知道容器停止后它会被删除,但关于 running 状态的问题)- 有没有我可以看到这个大小的地方/命令?我可以限制 Windows 图像的这个大小吗?
  5. 有没有关于使用我忘记的物理磁盘空间的陷阱?停止使用容器/存放空间?
  6. 关于正在运行的容器的内存的一些解释:它不是在容器之间共享的(?)所以假设运行 100 个内存饥饿的容器将有效地吃掉我计算机上的所有物理内存,然后呢?运行新容器将被拒绝?一切都会卡住?有什么工具可以防止这种情况发生?

最佳答案

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

关于Docker镜像和容器: size on-disk,虚拟大小,运行大小困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66543698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com