1. 背景
在生产环境中,Docker 容器运行的服务可能因各种原因出现异常退出或频繁重启,例如:
- 应用内部错误(代码异常、内存溢出)
- 容器资源不足(CPU、内存、磁盘 I/O)
- 宿主机网络或存储异常
- 镜像构建缺陷或依赖服务不可用
为了保障业务连续性,需要设计 自启动机制、异常检测 和 稳定性增强方案。
2. Docker 容器异常重启的常见原因
| 类别 | 说明 | 排查方法 |
|---|---|---|
| 应用错误 | 程序未捕获异常直接退出 | docker logs <容器> 查看日志 |
| 配置缺失 | 容器启动缺少环境变量或配置文件 | 检查 docker run 或 Compose 配置 |
| 资源限制 | OOM(内存不足)、CPU 过载 | docker stats 或宿主机 dmesg |
| 依赖异常 | 数据库、缓存等服务不可用导致退出 | 应用内增加重试机制 |
| 镜像问题 | 镜像构建脚本错误、依赖缺失 | 重新构建并测试 |
3. 确保 Docker 部署服务的自启动
3.1 使用 --restart 策略
在 docker run 时添加:
docker run -d \
--name myapp \
--restart=always \
myimage:latest
常用策略:
no(默认)—— 容器退出不重启always—— 无论退出原因都会重启unless-stopped—— 除非手动停止,否则重启on-failure[:max-retries]—— 仅在非 0 退出码时重启
建议生产环境使用:--restart=unless-stopped
这样避免在手动维护时被自动拉起。
3.2 Docker Compose 配置
在 docker-compose.yml 中:
version: '3.8'
services:
web:
image: myimage:latest
restart: unless-stopped
ports:
- "80:80"
3.3 配合 systemd 管理 Docker 服务
让 Docker 随宿主机开机自启动:
sudo systemctl enable docker
sudo systemctl start docker
4. 异常检测与监控
4.1 容器健康检查(HEALTHCHECK)
在 Dockerfile 中加入:
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
- Docker 会在
docker ps中显示健康状态(healthy / unhealthy) - 可用于自动检测异常并触发重启(结合
--restart)
4.2 外部监控(Prometheus + cAdvisor)
- cAdvisor:采集容器 CPU、内存、网络、存储等指标
- Prometheus:存储和报警
- Alertmanager:异常时通过邮件/钉钉/企业微信通知
示例报警规则(Prometheus):
- alert: ContainerMemoryUsageHigh
expr: container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.9
for: 2m
labels:
severity: warning
annotations:
summary: "容器内存使用率高"
4.3 日志采集与分析
- Docker logs:临时查看
- ELK/EFK:集中收集分析容器日志
- 可设置日志异常关键字报警(如 "error"、"failed")
5. 增强稳定性的手段
5.1 容器层面
-
使用精简稳定的基础镜像(如
alpine,debian:stable) -
设置资源限制防止单容器拖垮宿主机
deploy: resources: limits: memory: 512M cpus: "0.5" -
加入健康检查避免僵尸进程
-
在容器启动脚本中增加重试逻辑,避免依赖未就绪直接退出
5.2 宿主机层面
- 磁盘监控:防止日志暴涨导致磁盘满
- 系统内核参数优化(如
vm.overcommit_memory、fs.file-max) - Docker 数据目录单独挂载,避免系统盘被写满
5.3 部署架构层面
- 多实例冗余:多个容器实例,使用 Nginx/HAProxy 做负载均衡
- 滚动更新:避免升级导致整体服务中断
- 蓝绿部署:保证新版本可回退
6. 总结
- 自启动:
--restart策略 或 Compose 配置 - 检测:
HEALTHCHECK+ 外部监控 - 稳定性增强:资源限制、健康检查、依赖重试、日志监控
- 架构保障:多实例、负载均衡、滚动更新