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

156
每个docker run命令,或者Dockerfile中的每个RUN命令都会创建一个容器。如果容器不再运行,可以使用docker ps -a查看。
我需要担心拥有大量未运行的容器列表吗?我应该在不运行的容器上执行docker rm命令吗?
我不确定这些未运行的容器会产生哪些性能或内存/存储惩罚。

1
最近添加了一个 docker exec 命令,请参见 https://docs.docker.com/reference/commandline/cli/#exec - 它将在运行中的容器上执行命令。 - schmunk
如果您想了解如何删除旧容器,请参阅此问题:https://dev59.com/DGQm5IYBdhLWcg3w6ShR#29474367。 - Ryan Walls
1
@schmunk 这个链接已经移动了。https://docs.docker.com/engine/reference/commandline/exec/ - akauppi
5个回答

80

没有运行的容器除了占用磁盘空间之外,不会占用任何系统资源。

通常情况下,自我清理是一个好习惯,但如果有很多容器闲置着,这并不会降低性能。

如果您在运行有大量停止的容器的Docker命令时注意到速度变慢,那可能是Docker的一个错误,您应该提交一个bug报告。


1
RUN 命令的文档现在已移至:http://docs.docker.io/en/latest/reference/builder/#run - aculich

71

docker run文档介绍了如何在容器退出时自动清理容器并删除文件系统:

  --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

5
不是直接回答问题,但是一个有趣的答案将为用户提供一些关于Docker机制背后的见解。谢谢! - thaJeztah
3
-rm已被弃用,将来会被移除,请改用--rm - bain

5
如果您运行带有卷的容器并且不使用 docker rm -v 来删除它,则在删除容器后该卷不会被删除。此外,vfs 存储驱动程序存在 问题。如果您忘记清理,卷将占用您的磁盘空间。

4

我不确定这些未运行的容器会带来什么性能或内存/存储惩罚。

为了评估非运行中的 Docker 容器使用了多少存储空间,您可以运行以下命令:

docker ps --size --filter "status=exited"

等效地,您可以运行:docker container ls --filter "status=exited"

您还可以使用docker system df命令(在Docker 1.13.0中引入,即2017年1月)查看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

2
一个镜像是文件系统和依赖项的快照,或者是特定应用程序/软件的一组目录。所谓快照,指的是该软件运行所需的那些文件(例如mysql、redis等)以及容器环境中的基本配置的副本。
当您使用镜像创建一个容器时,使用命名空间和cgroups从您的系统中隔离了一小部分资源,然后将镜像内的文件复制到这个资源的隔离环境中。
因此,容器只占用磁盘空间。如果有未使用的容器,应将其删除,但不要删除镜像,因为它们始终可重用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接