容器生命周期本身不直接实现平滑重启,但通过嵌入健康检查、滚动更新、状态外置及编排平台协同,可达成零中断:就绪探针控制流量切换,prestop钩子保障优雅终止,共享存储与配置中心支撑无状态运行。

容器生命周期本身不直接实现平滑重启,但它为平滑重启提供了可控制的执行基础。关键在于把重启动作嵌入到生命周期各阶段中,并配合编排系统、健康检查和服务发现机制协同工作,才能真正达成零业务中断。
利用健康检查控制流量切换时机
容器启动后,不能立刻接收流量。必须等它通过就绪探针(Readiness Probe)验证——比如HTTP端点返回200、数据库连接成功、缓存预热完成。只有这时,服务注册中心或负载均衡器才会将请求路由过去。同样,停止前需先让就绪探针失败,使流量逐步摘除。
- 就绪探针失败后,Kubernetes会从Endpoint中移除该Pod,但不会立即终止容器
- 存活探针(Liveness Probe)只负责异常时重启容器,不参与流量调度
- Docker Compose中可通过healthcheck定义类似逻辑,配合start-first更新策略
滚动更新:新旧实例并行运行
滚动更新不是“停旧启新”,而是“先启新、再停旧”。整个过程保持副本总数不变,确保始终有健康实例在线处理请求。
- 以3副本为例:每次只更新1个,新容器启动并通过健康检查后,才优雅终止1个旧容器
- 更新期间,旧容器继续处理未完成请求(如设置shutdown timeout等待30秒)
- 应用层需支持优雅关闭(如Spring Boot的server.shutdown.graceful=true)
状态外置与会话保持
容器本质是无状态的,平滑重启的前提是业务状态不依赖单个容器内存。
- 用户会话存到Redis或数据库,而非容器本地Session
- 临时文件、上传数据走共享存储(如NFS、S3),避免重启丢失
- 配置通过ConfigMap/Secret挂载,或由配置中心动态推送,无需重启生效
编排平台驱动生命周期协调
单靠Docker命令无法实现自动平滑重启,必须依赖Kubernetes或Docker Swarm这类编排系统来统一管理多容器生命周期。
- Kubernetes通过Deployment控制器持续比对期望状态与实际状态,自动触发滚动更新
- Endpoints对象动态绑定Pod IP,服务发现实时生效,无需人工干预
- Pod终止前触发preStop钩子,可执行清理脚本(如通知上游下线、释放锁、保存进度)











