我最初认为 docker stop
相当于 vagrant halt
,docker rm
相当于 vagrant destroy
。
但从根本上讲,Docker 容器是无状态的,除了使用 VOLUME
语句时保存目录内容,即使没有使用 -v
参数,在执行 docker rm
后数据也会被销毁。
那么,两者有什么区别呢?
我最初认为 docker stop
相当于 vagrant halt
,docker rm
相当于 vagrant destroy
。
但从根本上讲,Docker 容器是无状态的,除了使用 VOLUME
语句时保存目录内容,即使没有使用 -v
参数,在执行 docker rm
后数据也会被销毁。
那么,两者有什么区别呢?
docker stop
停止容器并保留在 docker ps -a
列表中(这样就有机会将其提交,如果希望将状态保存到新的映像中)。
它首先发送 SIGTERM 信号,然后在优雅期过后发送 SIGKILL 信号。
docker rm
将从 docker ps -a
列表中删除容器,失去其“状态”(基于镜像文件系统的分层文件系统)。 它无法删除一个正在运行的容器(除非使用 -f
,这种情况下它直接发送 SIGKILL 信号)。
在生命周期方面,您应该首先停止容器,然后再删除容器。 这为容器 PID 1 收集僵尸进程提供了机会。
docker rm
从存储位置(例如debian:/var/lib/docker/containers/)中删除容器镜像,而docker stop
仅停止容器。
docker rm -f container_name
命令前后执行 docker images | grep container_name
,结果得到了相同的一行输出。所以,这只是停止了容器,而没有删除用于运行容器的镜像。或者我理解错了吗? - M.Ionut
docker stop
,然后再运行docker start
,我会丢失容器状态吗?我认为是这样的。 - mkurnikovvagrant
命令。 - mkurnikovdocker rmi <name>
,它可以删除镜像(容器是从该镜像创建的)。 - timhc22--rm
选项启动的容器存在一个错误:https://github.com/containers/podman/issues/11384 - VonC