docker restart 不是平滑重启,因它强制终止容器再启动新实例,导致连接中断;需应用支持优雅关闭、负载均衡器 draining 及外部状态分离才能实现真正平滑重启。
docker restart 本身不提供“平滑重启”能力——它会强制终止容器进程再启动新实例,连接会中断。真正的平滑重启(如零停机、连接优雅关闭)需配合应用层支持与额外配置,而非单纯依赖 docker restart 命令。
执行 docker restart 时,Docker 实际执行的是:
--stop-timeout 调整)整个过程无状态保留、无连接迁移,客户端 TCP 连接会被重置(RST),长连接(如 WebSocket、数据库连接池)直接断开,无法满足“平滑”要求。
要让服务在容器重启期间保持可用,必须满足以下至少两项:
以 Web 服务为例,不依赖 docker restart,而是采用滚动更新或就地优雅切换:
docker-compose up --force-recreate --no-deps -d service_name 启动新实例,并配合 healthcheck 和 deploy.restart_policy
services: web: image: myapp:latest healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 10s timeout: 5s retries: 3 start_period: 40s deploy: update_config: parallelism: 1 delay: 10s failure_action: rollback order: stop-first # 先停旧容器,等新容器健康后再删旧实例
curl -X POST http://localhost/shutdown)ss -tn sport = :80 | wc -l)docker stop container_name(依赖应用响应 SIGTERM)docker start container_name 或 docker run 新实例容器重启后,旧连接残留可能引发 TIME_WAIT 占用或客户端重试风暴。需协同处理:
Connection: close 响应头;对数据库连接池配置最大空闲时间与验证查询