Docker 容器重启策略:原理、选型与排障全指南

Docker 容器重启策略:原理、选型与排障全指南

Docker容器OOM挂了就挂了,虚拟机重启了容器也没自动恢复,很苦恼吧!!

来这里了解一波Docker容器重启策略,并配置最适合你的需求

==============================================

在生产环境里,容器可能因为进程崩溃、宿主机重启、OOM 等多种原因退出。合理配置重启策略(Restart Policy)能在“自愈”与“避免雪崩”之间取得平衡。本文用一条命令、一张思维导图和若干实战案例,帮你彻底搞懂 Docker 的四种重启策略。

-———————————————–

一、重启策略是什么

-———————————————–

Docker 在 容器级别 提供四种重启策略,由 --restart 参数控制:

策略 含义 常见场景 典型命令
no 默认,不自动重启 一次性脚本、调试任务 docker run –restart=no …
on-failure[:N] 仅当退出码≠0 时重启,最多 N 次 偶发崩溃、CI 测试 docker run –restart=on-failure:3 …
always 无论退出码均重启,直到地球停转 7×24 服务(API、数据库) docker run –restart=always …
unless-stopped 同 always,但管理员手动****docker stop后不再重启 开发、测试环境 docker run –restart=unless-stopped …

图片

-———————————————–

二、快速选型:30 秒思维导图

-———————————————–

1
2
3
4
5
6
7
┌─ 一次性任务? ── yes ──▶ no

no├─ 偶发崩溃可接受? ── yes ──▶ on-failure:N

no├─ 永远需要高可用? ── yes ──▶ always

└─ 需要留手动停止余地? ── yes ──▶ unless-stopped

口诀:

跑完就下班选 no,真崩才救选 on-failure,死也拉起来选 always,你喊停我才停选 unless-stopped。

-———————————————–

三、修改已有容器的重启策略

-———————————————–

无需重建容器,一条命令即可:

1
2
3
4
5
6
7
# 把正在运行的容器改成 always
docker update --restart=always <container_id_or_name>

# 验证
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}'<container>

docker inspect <container>|grep -A 3 RestartPolicy

示例:

no:默认,不自动重启

图片

图片

always:无论退出码均重启

图片

-———————————————–

四、高频问题 & 最佳实践

-———————————————–

  1. 容器因 OOM 频繁重启

• 先治标:--restart=on-failure:3 防止雪崩。

• 再治本:

1
2
3
4
# 调整内存上限
docker update --memory 2g --memory-swap 2g <container>
# 或重新 run
docker run --memory=2g --restart=unless-stopped myapp

• 用 docker statspmapVisualVM/tracemalloc 等工具排查内存泄漏(详见文末附录)。

  1. Swarm / Compose 用户

• Compose 文件:

1
2
3
4
     services:
web:
image: nginx
restart: unless-stopped

• Swarm 服务:

1
docker service update --restart-condition on-failure --restart-max-attempts 3 myservice
  1. 宿主机重启后的行为差异

no:容器保持停止。

always / unless-stopped:Docker daemon 启动时会重新拉起容器。

• 若使用 systemd 管理 Docker,确保 systemctl enable docker

图片

-———————————————–

五、实战案例

-———————————————–

案例 1:生产 API 服务

1
2
3
4
5
docker run -d --name api \
--restart=always \
--memory=1g \
-p 8080:8080 \
mycorp/api:v1.2

• 7×24 高可用,宿主机重启后自动上线。

• 内存上限 1 GB,防止泄漏拖垮节点。

案例 2:每天凌晨跑批任务

1
docker run --rm --restart=no mycorp/etl:latest

--rm 跑完即删,无需重启策略。

案例 3:开发环境数据库

1
2
3
4
5
6
7
# docker-compose.yml
services:
postgres:
image: postgres:15
restart: unless-stopped
environment:
POSTGRES_PASSWORD: dev

• 开发者可随时 docker-compose stop postgres 调试,重启 Docker 后自动拉起。

-———————————————–

六、附录:内存泄漏排查 3 步曲

-———————————————–

  1. 现象确认
1
2
docker stats --no-stream <container>
docker inspect <container>| jq '.[0].State.OOMKilled'
  1. 根因定位

● Java:jmap -dump:format=b,file=/tmp/heap.hprof <PID> + MAT

● Python:tracemalloc / memory_profiler

● Node:--inspect + Chrome DevTools

  1. 修复验证

● 本地压测:docker run --memory=512m

● 回归监控:Prometheus 规则 container_memory_working_set_bytes 1 h 上涨 >30 % 报警。

-———————————————–

结语

-———————————————–

重启策略不是“万金油”,而是 “止损 + 自愈” 的第一道闸门。

牢记:先限资源、再排故障、最后选策略,让你的容器既“不死机”也“不捣蛋”。

小小考核下

如果你的Docker容器,一开始没有配置重启策略,要怎么把– restart的配置,加入到该容器呢??

【腾讯文档】Docker 容器重启策略:原理、选型与排障全指南

https://docs.qq.com/doc/DT2xxblBQUHd0VGxj

– END–

https://mp.weixin.qq.com/s/nGjZqoQJcKq4ORRFCA_uvA