Docker重启流程解析

docker stop 再 docker start 的过程

这个组合操作的本质是:停止容器内的进程,但保留容器的文件系统层,然后重新启动一个新的进程。

  1. docker stop <container_name>

    • Docker 向容器内的主进程(PID 1)发送一个 SIGTERM 信号。
    • 这给了容器内应用程序一个"优雅关闭"(Graceful Shutdown)的机会,比如保存当前状态、关闭数据库连接、完成正在处理的网络请求等。
    • Docker会等待一个默认的宽限期(通常是10秒)。
    • 如果在宽限期后进程还未退出,Docker 会发送一个 SIGKILL 信号,强制杀死进程。
    • 结果 :容器内所有进程停止运行,容器进入 Exited (已退出) 状态。但是,容器的所有配置和文件系统层都被完整保留了下来。你在容器里创建的文件、修改的配置等,都还在。
  2. 关于 mount 的问题

    • 不会重新 mount。
    • 卷(Volumes)和绑定挂载(Bind Mounts)是在你首次使用 docker run 或 docker create 创建容器时配置和挂载的。
    • 当你执行 docker start 时,它只是将一个已存在的、已停止的容器重新启动。它会**重新连接(re-attaches)**到已经配置好的卷和挂载点上,而不是执行新的挂载操作。你在卷里写入的数据会保持不变。
  3. 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 守护进程的配置,然后想用旧容器来验证新配置。
相关推荐
无人生还别怕6 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos
YYYing.21 小时前
【K8s系列 (一) 】Docker与容器(上篇)
docker·云原生·容器·kubernetes
csdn_aspnet1 天前
使用 Docker 和 RedisInsight 设置 Redis 以进行本地开发
redis·docker·容器·redisinsight
余槐i1 天前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化
csdn_aspnet1 天前
如何在本地 Docker 容器中运行 Redis,并使用 Redis Insight 和 Redis CLI 进行管理
redis·docker·容器
且从容.1 天前
Ubuntu 安装 Docker
linux·ubuntu·docker
todoitbo1 天前
我在 Mac 上用 Docker 部署 Nexent:从拉取镜像到接入模型
macos·docker·大模型·ai智能体·nexent·快速入门与环境准备
Goboy1 天前
夯爆了,我被一个一句话接入的免费可观测平台策反了,那一刻我决定放弃用了3年的Prometheus
后端·docker·kubernetes
吴声子夜歌1 天前
Kubernetes权威指南——深入掌握Service(一)
云原生·容器·kubernetes
java_logo2 天前
Docker 部署 Liquibase:轻松搭建数据库变更管理
数据库·docker·容器·数据库管理·liquibase·轩辕镜像·数据库变更