Docker Compose 自动重启完全指南:告别服务挂死,实现容器自愈

24次阅读
没有评论

Docker部署的小伙伴大概率都遇到过这个问题:服务器意外重启、程序崩溃、内存溢出、端口冲突,容器直接退出,服务彻底挂掉,没人值守就一直断服。

其实不用手动盯守、不用写复杂脚本,Docker Compose 自带的自动重启策略,就能实现容器异常自愈、开机自启、崩溃自动恢复,是生产环境必备的基础配置。

今天一文讲透 Compose 四种重启策略、实战配置、场景选型、避坑要点,新手直接抄作业,运维直接落地生产。


一、为什么一定要配置容器自动重启?

默认情况下,Docker 容器退出后不会自动重启,这会导致诸多问题:

  • 服务器重启后,所有容器全部静默挂停,服务无法自动恢复
  • 程序偶发崩溃、代码报错、OOM 内存溢出,容器退出后无人拉起
  • 临时网络波动、依赖服务未就绪,导致容器启动失败,无法重试

而开启 Compose 自动重启后,能实现核心能力:异常崩溃自动重启、服务器开机自启、短时故障自动恢复,极大提升服务稳定性,减少人工运维成本。


二、Docker Compose 四大重启策略详解

docker-compose.yml 中,通过 restart 字段配置重启策略,一共四种取值,适配所有开发、测试、生产场景,区别和用法一目了然:

1. restart: no(默认策略)

默认配置,容器无论什么原因退出,都不会自动重启

适用场景:本地调试、一次性执行任务、数据迁移脚本、临时测试容器,不需要常驻运行的服务。

2. restart: always(始终重启)

最强重启策略:只要容器停止,就无条件重启,无论程序是正常退出(退出码0)还是异常崩溃(非0退出码)。

同时支持开机自启:Docker 服务重启、服务器重启后,容器会自动拉起。

缺点:如果程序永久报错(如配置错误、端口占用),会陷入无限重启死循环,占用服务器资源。

适用场景:核心常驻服务、必须7×24运行的基础服务。

3. restart: on-failure(异常重启)

精准自愈策略:仅容器异常退出(非0退出码)时重启,正常手动停止、正常退出不重启。

支持配置最大重启次数,避免无限重启,格式:on-failure: 次数,例如 on-failure: 5 代表最多重试5次。

适用场景:API服务、后端程序、定时任务、无状态服务,只需要修复崩溃故障,无需重启正常退出的容器。

4. restart: unless-stopped(生产最优)

生产环境首选策略,兼顾稳定性和可控性。

规则:除了手动执行 docker stop 停止容器之外,其余所有场景全部自动重启。服务器重启、Docker重启、程序崩溃、异常退出,都会自动拉起容器。

核心优势:不用怕无限重启死循环,手动停服务后不会自动复活,运维可控;常驻服务稳定性拉满。

适用场景:线上所有常驻业务服务、数据库、缓存、网关、监控服务等。


三、完整实战配置(直接复制可用)

给大家整理了一份通用生产配置,包含不同场景的重启策略,开箱即用,适配 Compose 3.8+ 所有版本。

version: '3.8'

services:
  # 线上常驻业务服务(生产首选)
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    restart: unless-stopped

  # 后端API服务(异常才重启,限制重试次数)
  api-server:
    image: my-api:latest
    ports:
      - "8080:8080"
    restart: on-failure:5

  # 临时调试/一次性任务服务
  temp-task:
    image: python:3.9
    command: python task.py
    restart: no

  # 核心基础服务(无条件常驻)
  redis:
    image: redis:alpine
    ports:
      - "6379:6379"
    restart: always

四、精细化进阶:自定义重启延迟与重试规则

基础 restart 字段只能简单控制重启逻辑,如果需要精细化管控(重启延迟、最大重试次数、重启条件),可以使用 deploy.restart_policy 配置,适合复杂生产环境。

version: '3.8'

services:
  app:
    image: my-app:latest
    deploy:
      restart_policy:
        condition: on-failure  # 仅异常退出重启
        delay: 3s               # 重启前等待3秒
        max_attempts: 5         # 最大重试5次
        window: 30s             # 30秒内统计重试次数

适用场景:服务启动依赖其他组件、启动较慢、需要规避短时抖动的业务。

注意deploy 配置默认兼容单机 Compose 启动,在 docker compose up 模式下可正常生效,无需开启集群模式。


五、关键避坑指南(90%的人都会踩坑)

1. 慎用 restart: always 生产乱用

如果服务配置文件错误、端口冲突、依赖缺失,always 会无限重启,占用CPU和内存,导致服务器负载飙升,掩盖真实故障。

解决方案:常驻业务优先用 unless-stopped,不稳定服务用 on-failure: 次数 限制重试。

2. 重启策略不代表服务健康

Compose 重启只判断容器进程是否退出,不判断服务是否可用。比如容器启动成功,但程序卡死、接口报错,重启策略不会触发。

进阶优化:搭配 healthcheck 健康检查,实现真正的服务自愈,进程存活但服务异常也能重启。

3. 手动停止容器的区别

unless-stopped 模式下:

  • docker stop 容器名:手动停止,不会自动重启(运维可控)
  • 服务器重启、Docker重启、程序崩溃:自动重启(业务保活)

4. 修改重启策略必须重载生效

修改 docker-compose.yml 的重启配置后,直接重启容器不生效,需要执行:

# 重新加载配置并重启服务
docker compose up -d

六、场景快速选型总结

重启策略 核心规则 最佳使用场景
no 永不重启 本地调试、一次性任务、数据迁移
always 无条件重启 核心基础服务、极简常驻服务
on-failure:N 异常退出重启,限制次数 后端API、定时任务、无状态服务
unless-stopped 仅手动停止不重启 生产所有常驻业务(首选)

七、最终总结

Docker Compose 自动重启是低成本、高收益的运维配置,不用复杂监控、不用自研脚本,就能大幅提升服务可用性:

  1. 开发调试用 restart: no,避免多余重启干扰开发
  2. 业务服务用 restart: on-failure:5,精准自愈、避免死循环
  3. 生产常驻服务统一用 restart: unless-stopped,稳定可控、开箱即用

建议所有线上 Compose 项目必须配置重启策略,从根源避免服务无故挂死,降低运维压力!

正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码