Docker重启流程解析

docker stopdocker start 的过程

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

  1. docker stop <container_name>

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

    • 不会重新 mount
    • 卷(Volumes)和绑定挂载(Bind Mounts)是在你首次使用 docker rundocker create 创建容器时配置和挂载的。
    • 当你执行 docker start 时,它只是将一个已存在的、已停止的容器重新启动。它会**重新连接(re-attaches)**到已经配置好的卷和挂载点上,而不是执行新的挂载操作。你在卷里写入的数据会保持不变。
  3. docker start <container_name>

    • 它获取 Exited 状态的容器。
    • 使用该容器保留的文件系统层
    • 重新执行容器启动时定义的命令 (CMDENTRYPOINT)。
    • 容器内的进程重新开始运行,容器状态变为 Up (运行中)。

总结一下 stop -> start 流程: 这是一个有状态的重启。容器的文件系统(包括你上次运行时写入的数据)和所有挂载卷都保持不变,只是进程被停止然后重新启动。内存中的状态会丢失。


docker startdocker restart 的功能区别

docker restart 本质上是一个方便用户的快捷命令,它捆绑了 stopstart 的逻辑。

特性 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 守护进程的配置,然后想用旧容器来验证新配置。
相关推荐
递归尽头是星辰12 小时前
Docker容器化核心知识体系:从入门到实践
docker·云原生·devops·容器化·镜像构建
鸠摩智首席音效师13 小时前
如何检查本地是否存在 Docker 镜像 ?
docker·容器
鸠摩智首席音效师13 小时前
如何在 Docker 中设置环境变量 ?
docker·容器
hkNaruto15 小时前
【DevOps】基于Nexus3部署Docker内网私有代理仓库docker proxy
docker·devops·nexus3
不 再 熬 夜15 小时前
Docker搭建Jenkins
docker·jenkins
舰长1151 天前
k8s 持久化存储方案-PVC
云原生·容器·kubernetes
南方以南_1 天前
对比k8s的service和kube-proxy
云原生·容器·kubernetes
爱宇阳1 天前
从零开始部署 GitLab CE 18.4.2:Docker Compose 新手教程
docker·容器·gitlab
斯普信专业组1 天前
基于k8s环境的mongodb多副本高可用方案
mongodb·容器·kubernetes
tryCbest1 天前
Linux使用Docker部署Node.js+Express+SQLite项目
docker·centos·node.js