Docker:已停止容器与运行中容器的概念、数据及实现差异
这个问题问到点子上了!很多刚摸容器的朋友都会搞不清这两种状态的区别,我从三个核心维度给你掰扯明白:
1. 概念定义差异
- 运行中容器:就是正在执行你指定启动命令(比如
nginx -g 'daemon off;')的“活”实例——它有自己独立的进程空间、网络栈,能和宿主机或其他容器交互,相当于一个正在干活的轻量级虚拟环境。 - 已停止容器:指运行中的容器因为命令执行完毕、你手动敲
docker stop,或者异常崩溃后进入的“休眠”状态。它不再有活跃的进程在跑,但所有曾经的配置、运行痕迹都完整保留着,就像你下班关了电脑但桌面文件都没删一样。
2. 数据保留机制差异
这部分得结合容器的“镜像+可写层”结构来讲:
- 运行中容器:
- 它的可写层处于活跃状态,所有对容器内文件系统的修改(比如新建配置文件、临时生成的日志)都会实时写到这个可写层里。
- 如果挂载了数据卷(Volume)或绑定挂载(Bind Mount),这些外部存储的读写也是实时生效的,容器进程能直接操作这些独立于容器的数据。
- 已停止容器:
- 可写层的内容会完整保留,不会因为容器停了就消失——除非你手动执行
docker rm删掉容器,否则这个可写层会一直躺在宿主机的存储驱动(比如overlay2)里。 - 数据卷和绑定挂载里的数据更是完全不受影响,因为它们的生命周期本来就和容器无关,容器停了,数据还在那儿。
- 小提醒:如果容器是异常崩溃停止的,可能会有一些未完成的写操作,但只要文件系统没损坏,这些半完成的数据依然会保存在可写层里。
- 可写层的内容会完整保留,不会因为容器停了就消失——除非你手动执行
3. 高层实现逻辑差异
从Docker daemon的角度看,两种状态的处理逻辑完全不同:
- 运行中容器:
- Docker daemon会实时跟踪容器的进程ID(PID),监控它的CPU、内存使用率,还会处理容器的网络请求、实时日志输出(比如你敲
docker logs -f能实时看日志)。 - 容器的隔离资源(PID、NET、IPC等namespace)处于激活状态,严格隔离容器和宿主机、其他容器的资源访问。
- 资源限制配置(cgroups)也在生效,确保容器不会占用过多宿主机资源。
- Docker daemon会实时跟踪容器的进程ID(PID),监控它的CPU、内存使用率,还会处理容器的网络请求、实时日志输出(比如你敲
- 已停止容器:
- Docker daemon会释放容器占用的namespace和cgroups资源——也就是说,容器的进程空间、网络栈这些隔离环境都被销毁了,不再占用宿主机的进程和资源配额。
- 但Docker会牢牢记住容器的元数据(比如容器ID、启动命令、端口映射规则)和可写层数据,你可以用
docker inspect查看这些元数据,或者用docker start一键重启容器,重启后会重新创建隔离环境、加载之前的配置,就像容器从来没停过一样。 - 此时你依然能用
docker logs查看容器停止前的日志,但再也收不到新的日志输出了。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

