生产环境 Docker 容器重启策略 always 怎么配置?

文章导读
在生产环境配置 Docker 容器 always 重启策略,需在启动时添加`--restart`=always参数或对已有容器执行docker update,并确保 Docker 服务本身已设置开机自启。该策略适用于 Web 服务器、数据库等需长期运行的服务,但需注意若应用启动即崩溃可能导致无限重启循环。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在生产环境配置 Docker 容器 always 重启策略,需在启动时添加`--restart`=always参数或对已有容器执行docker update,并确保 Docker 服务本身已设置开机自启。该策略适用于 Web 服务器、数据库等需长期运行的服务,但需注意若应用启动即崩溃可能导致无限重启循环。

先说结论:always 策略能实现容器退出或宿主机重启后自动恢复,但依赖 Docker 守护进程存活且配置正确。

  • 适合:生产环境长期运行的核心服务,如 Nginx、MySQL、业务后端。
  • 先准备:确认 Docker 服务已设为开机自启(systemctl enable docker),避免容器策略生效但守护进程未运行。
  • 验收:使用docker inspect查看 RestartPolicy 字段,并重启宿主机验证容器是否自动拉起。

命令速用版

创建新容器时直接指定策略:

docker run -d `--name` my-service `--restart`=always -p 80:80 nginx:alpine

为已运行的容器补充策略:

docker update `--restart`=always <容器名或 ID>

docker-compose 文件中配置:

生产环境 Docker 容器重启策略 always 怎么配置?
services:
  web:
    image: nginx:latest
    restart: always

为什么会这样

always 策略生效的核心在于 Docker 守护进程的状态监控机制。当容器配置为 always 后,Docker 守护进程会持久化记录该策略,一旦检测到容器状态变为 stopped(无论退出码是 0 还是非 0),或守护进程自身重新启动(如宿主机重启后),都会立即触发容器重启流程。这一机制不依赖容器内应用的健康状态,仅关注进程存活,因此能保障基础可用性,但无法解决应用内部死锁问题。

分步处理

步骤 1:确保 Docker 服务开机自启
容器重启策略依赖 Docker 守护进程运行。在 Linux 系统中执行以下命令确保 Docker 服务随系统启动:

sudo systemctl enable docker.service

步骤 2:配置容器重启策略
若是新容器,在docker run时加入`--restart`=always。若是已有容器,使用docker update命令修改,无需重建容器:

docker update `--restart`=always <容器名>

步骤 3:处理特殊情况
若希望容器被手动停止(docker stop)后不再自动重启,可改用unless-stopped策略,避免运维操作后容器意外拉起。

生产环境 Docker 容器重启策略 always 怎么配置?

怎么验证是否生效

检查配置字段
使用 inspect 命令查看容器宿主配置,确认 RestartPolicy 名称为 always:

docker inspect `--format`='{{.HostConfig.RestartPolicy.Name}}' <容器名>

输出always即表示配置成功。物理验证:重启宿主机服务器,观察容器是否自动进入 Up 状态:

docker ps -a

若容器状态为 Up 且重启次数(RESTARTS)合理,说明策略生效。

生产环境 Docker 容器重启策略 always 怎么配置?

常见坑

无限重启循环:若应用代码存在启动即崩溃的 bug,always 策略会导致容器反复重启,占用系统资源。建议配合HEALTHCHECK或日志监控排查。Docker 服务未自启:仅配置容器策略而忽略 Docker 服务本身的开机自启,宿主机重启后容器无法恢复。手动停止失效:always 策略下,即使执行docker stop,当 Docker 服务重启时容器仍会被拉起。若需保留手动控制权,应使用unless-stopped

常见问题

already running 容器如何添加重启策略?

无需停止容器,直接使用docker update `--restart`=always <容器名>即可实时生效,配置会持久化保存。

always 和 unless-stopped 有什么区别?

always 在任何停止后都会重启,包括手动停止;unless-stopped 仅在容器未被手动停止的情况下自动重启,更适合需要人工干预场景。

重启策略能替代健康检查吗?

不能。重启策略仅监控进程存活,无法检测服务是否响应请求。生产环境建议同时配置HEALTHCHECK或外部监控。

参考来源

  • Docker 生产环境必备技能
  • 如何在 Docker 中利用 Restart-Policy 配置容器崩溃后的自动拉起机制
  • always 重启策略失效?90% 开发者忽略的 3 个关键配置细节
  • 如何正确使用 Docker 的`--restart`=always?这 4 种典型误用你中招了吗?
  • docker 容器运行时忘了加自动重启命令了,之后如何添加自动重启命令,使其随开机自动重启
  • docker-compose restart 介绍使用
  • Docker 服务及容器开机自动启动设置指南