每个docker run
命令,或RUN
Dockerfile 中的每个命令,都会创建一个容器。如果容器不再运行,它仍然可以通过docker ps -a
.
我是否应该担心拥有大量未运行的容器?我应该docker rm
在非运行容器上发布吗?
我不确定这些非运行容器会产生什么性能或内存/存储损失。
每个docker run
命令,或RUN
Dockerfile 中的每个命令,都会创建一个容器。如果容器不再运行,它仍然可以通过docker ps -a
.
我是否应该担心拥有大量未运行的容器?我应该docker rm
在非运行容器上发布吗?
我不确定这些非运行容器会产生什么性能或内存/存储损失。
未运行的容器除了磁盘空间外不占用任何系统资源。
自己清理通常很好,但如果你有很多人坐在周围,它根本不应该减慢性能。
如果您在运行包含大量停止容器的 docker 命令时确实注意到速度变慢,则可能是 docker 中的一个错误,您应该提交一个错误。
该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
如果您运行带有卷的容器并且不使用docker rm -v删除它,则在删除容器后不会删除该卷。vfs 存储驱动程序也存在问题。如果您忘记清理,卷将占用您的磁盘空间。
我不确定这些非运行容器会产生什么性能或内存/存储损失。
为了评估未运行的 Docker 容器使用了多少存储空间,您可以运行:
docker ps --size --filter "status=exited"
--size
:显示总文件大小(仅供参考:解释“docker ps -s”中的 SIZE 列以及“virtual”关键字的含义 #1520)。--filter "status=exited"
:只列出停止的容器。等效地,您可以运行: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
映像是文件系统和依赖项或特定应用程序/软件的一组特定目录的快照。快照是指在容器环境中运行具有基本配置的软件(例如 mysql、redis 等)所需的那些文件的副本。
当您使用镜像创建容器时,系统中的一小部分资源在命名空间和cgroups的帮助下被隔离,然后镜像中的文件被复制到这个隔离的资源环境中。
因此,容器只占用磁盘空间。如果有未使用的容器,您应该删除它们,但不要删除图像,因为它们总是可以重复使用的。