“docker stop”和“docker rm”的区别是什么?

60

我最初认为 docker stop 相当于 vagrant haltdocker rm 相当于 vagrant destroy

但从根本上讲,Docker 容器是无状态的,除了使用 VOLUME 语句时保存目录内容,即使没有使用 -v 参数,在执行 docker rm 后数据也会被销毁。

那么,两者有什么区别呢?

2个回答

77

docker stop 停止容器并保留在 docker ps -a 列表中(这样就有机会将其提交,如果希望将状态保存到新的映像中)。

它首先发送 SIGTERM 信号,然后在优雅期过后发送 SIGKILL 信号。

docker rm 将从 docker ps -a 列表中删除容器,失去其“状态”(基于镜像文件系统的分层文件系统)。 它无法删除一个正在运行的容器(除非使用 -f,这种情况下它直接发送 SIGKILL 信号)。

在生命周期方面,您应该首先停止容器,然后再删除容器。 这为容器 PID 1 收集僵尸进程提供了机会


2
如果我运行 docker stop,然后再运行 docker start,我会丢失容器状态吗?我认为是这样的。 - mkurnikov
从https://dev59.com/HmEh5IYBdhLWcg3w3muK#21928864的@mkurnikov,您不会失去您的更改。 - VonC
好的,所以这些命令确实等同于vagrant命令。 - mkurnikov
有些人可能会发现以下命令很有用:docker rmi <name>,它可以删除镜像(容器是从该镜像创建的)。 - timhc22
@ShivamPapat 应该可以,尽管对于以 --rm 选项启动的容器存在一个错误:https://github.com/containers/podman/issues/11384 - VonC
显示剩余3条评论

5

docker rm 从存储位置(例如debian:/var/lib/docker/containers/)中删除容器镜像,而docker stop 仅停止容器。


1
我之前尝试过在运行 docker rm -f container_name 命令前后执行 docker images | grep container_name,结果得到了相同的一行输出。所以,这只是停止了容器,而没有删除用于运行容器的镜像。或者我理解错了吗? - M.Ionut

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