我应该担心过多的、非运行的 Docker 容器吗?

Posted

技术标签:

【中文标题】我应该担心过多的、非运行的 Docker 容器吗?【英文标题】:Should I be concerned about excess, non-running, Docker containers? 【发布时间】:2013-06-05 12:59:09 【问题描述】:

Dockerfile 中的每个docker run 命令或每个RUN 命令都会创建一个容器。如果容器不再运行,它仍然可以通过docker ps -a 看到。

我是否应该担心有大量未运行的容器?我应该在非运行容器上发出docker rm 吗?

我不确定这些未运行的容器会招致什么性能或内存/存储损失。

【问题讨论】:

一个docker exec 命令已在不久前添加,请参阅docs.docker.com/reference/commandline/cli/#exec - 它会从正在运行的容器中执行命令。 仅供参考,如果您想了解如何删除旧容器,请参阅以下问题:***.com/questions/17236796/… @schmunk 链接已移动。 docs.docker.com/engine/reference/commandline/exec 【参考方案1】:

未运行的容器除了磁盘空间外不占用任何系统资源。

自己清理通常是件好事,但如果您周围有很多人,则根本不会降低性能。

如果您在运行包含大量停止容器的 docker 命令时发现速度变慢,则可能是 docker 中的一个错误,您应该提交一个错误。

【讨论】:

RUN 命令的文档现已移至:docs.docker.io/en/latest/reference/builder/#run【参考方案2】:

docker run documentation 描述了如何在容器退出时自动清理容器并移除文件系统:

  --rm=false: Automatically remove the container when it exits (incompatible with -d)

上面显示默认情况下不会删除容器,但添加 --rm=true 或只是简写 --rm 会像这样工作:

sudo docker run -i -t --rm ubuntu /bin/bash

当你从容器中退出时,它会被自动移除。

您可以通过在一个终端窗口中列出您的 docker 容器来测试这一点:

watch -n1 'sudo ls -c /var/lib/docker/containers'

然后在另一个窗口中运行这个命令来运行多个 docker 容器,这些容器会在休眠最多 10 秒后自动退出。

for i in 1..10; do sudo docker run --rm ubuntu /bin/sleep $i & done

【讨论】:

不是对问题的直接回答,而是一个有趣的回答,可以让用户深入了解 docker 背后的机制。谢谢! -rm 已弃用,将在某个时候删除,请改用--rm【参考方案3】:

如果您运行带有卷的容器并且不使用 docker rm -v 将其删除,则删除容器后不会删除该卷。还有一个带有 vfs 存储驱动程序的 issue。如果您忘记清理,卷将占用您的磁盘空间。

【讨论】:

【参考方案4】:

我不确定这些未运行的容器会招致什么性能或内存/存储损失。

为了评估未运行的 Docker 容器正在使用多少存储空间,您可以运行:

docker ps --size --filter "status=exited"
--size:显示总文件大小(仅供参考:Explain the SIZE column in "docker ps -s" and what "virtual" keyword means #1520)。 --filter "status=exited": list only stopped containers.

Equivalently,你可以运行:docker container ls --filter "status=exited"

您也可以使用命令docker system df(2017 年 1 月在 Docker 1.13.0 中引入)查看 docker 磁盘使用情况,例如:

username@server:~$ docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              44                  28                  114.7GB             84.84GB (73%)
Containers          86                  7                   62.43GB             41.67GB (66%)
Local Volumes       2                   1                   0B                  0B
Build Cache                                                 0B                  0B

【讨论】:

【参考方案5】:

映像是文件系统和依赖项或特定应用程序/软件的一组特定目录的快照。快照是指在容器环境中运行具有基本配置的软件(例如 mysql、redis 等)所需的文件的副本。

当您使用图像创建容器时,系统中的一小部分资源在 namespacingcgroups 的帮助下被隔离,然后是图像被复制到这个孤立的资源环境中。

因此,容器只占用磁盘空间。如果有未使用的容器,您应该删除它们,但不要删除图像,因为它们总是可以重复使用的。

【讨论】:

以上是关于我应该担心过多的、非运行的 Docker 容器吗?的主要内容,如果未能解决你的问题,请参考以下文章

Docker 容器的 HTTPS

2 个 docker 容器可以(或应该)通过 localhost 相互交互吗?

从 docker 内部运行 docker 可以吗?

为啥不需要在 Docker 容器中运行 sshd

我应该在(Docker)容器中使用 forever/pm2 吗?

如何使用非默认运行参数在 AWS Elastic Beanstalk 中运行 Docker 容器?