docker stop
再 docker start
的过程
这个组合操作的本质是:停止容器内的进程,但保留容器的文件系统层,然后重新启动一个新的进程。
-
docker stop <container_name>
- Docker 向容器内的主进程(PID 1)发送一个
SIGTERM
信号。 - 这给了容器内应用程序一个"优雅关闭"(Graceful Shutdown)的机会,比如保存当前状态、关闭数据库连接、完成正在处理的网络请求等。
- Docker会等待一个默认的宽限期(通常是10秒)。
- 如果在宽限期后进程还未退出,Docker 会发送一个
SIGKILL
信号,强制杀死进程。 - 结果 :容器内所有进程停止运行,容器进入
Exited
(已退出) 状态。但是,容器的所有配置和文件系统层都被完整保留了下来。你在容器里创建的文件、修改的配置等,都还在。
- Docker 向容器内的主进程(PID 1)发送一个
-
关于
mount
的问题- 不会重新
mount
。 - 卷(Volumes)和绑定挂载(Bind Mounts)是在你首次使用
docker run
或docker create
创建容器时配置和挂载的。 - 当你执行
docker start
时,它只是将一个已存在的、已停止的容器重新启动。它会**重新连接(re-attaches)**到已经配置好的卷和挂载点上,而不是执行新的挂载操作。你在卷里写入的数据会保持不变。
- 不会重新
-
docker start <container_name>
- 它获取
Exited
状态的容器。 - 使用该容器保留的文件系统层。
- 重新执行容器启动时定义的命令 (
CMD
或ENTRYPOINT
)。 - 容器内的进程重新开始运行,容器状态变为
Up
(运行中)。
- 它获取
总结一下 stop
-> start
流程: 这是一个有状态的重启。容器的文件系统(包括你上次运行时写入的数据)和所有挂载卷都保持不变,只是进程被停止然后重新启动。内存中的状态会丢失。
docker start
和 docker restart
的功能区别
docker restart
本质上是一个方便用户的快捷命令,它捆绑了 stop
和 start
的逻辑。
特性 | docker start |
docker restart |
---|---|---|
目标容器状态 | 只能用于 已停止 (Exited) 的容器。 | 可以用于 运行中 (Up) 或 已停止 (Exited) 的容器。 |
对运行中容器的操作 | 无任何效果。 | 先停止 (stop),再启动 (start)。 |
对已停止容器的操作 | 启动容器。 | 启动容器(效果同 start )。 |
主要用途 | 手动启动一个之前已停止的容器。 | 快速"重启"或"重置"一个容器,无论它当前是何状态。 |
详细解释:
-
docker start
:是一个单一目的的命令。它的工作就是"启动一个已停止的容器"。如果你对一个正在运行的容器执行docker start
,它什么也不会做。 -
docker restart
:是一个复合命令,更智能。- 如果容器正在运行,它会先执行
stop
操作(同样有10秒的优雅关闭宽限期),然后再执行start
操作。 - 如果容器已经停止,它的行为就和
docker start
完全一样。
- 如果容器正在运行,它会先执行
什么时候用哪个?
-
使用
docker restart
:- 最常见的场景。当你的应用程序无响应、内存泄漏,或者你更新了挂载到容器内的配置文件,需要应用程序重新加载时,直接用
restart
就好。它很方便,不需要你先去判断容器当前的状态。
- 最常见的场景。当你的应用程序无响应、内存泄漏,或者你更新了挂载到容器内的配置文件,需要应用程序重新加载时,直接用
-
使用
docker stop
/docker start
:- 当你需要在停止和启动之间执行某些维护操作时。例如:
- 你需要停止容器,然后对它挂载的卷进行一次安全的备份,确认备份完成后再启动容器。
- 你需要修改某些 Docker 守护进程的配置,然后想用旧容器来验证新配置。
- 当你需要在停止和启动之间执行某些维护操作时。例如: