Skip to content

Docker 命令之 --restart 参数

Docker 的 --restart 参数用于定义容器退出时的自动重启策略,是保障服务持续运行的重要配置。以下是详细说明:

参数可选值及含义

  • no
    • 默认策略,容器退出时不会自动重启。
    • 适用场景:临时测试或无需持久运行的容器。
  • on-failure[:max-retries]
    • 异常退出时重启:仅当容器以非 0 状态码退出时触发重启,可指定最大重试次数(如 on-failure:3 表示最多尝试 3 次)。
    • 适用场景:需排除偶发错误的服务,避免无限重启导致资源浪费。
  • always
    • 无条件自动重启:无论退出状态码如何,容器退出后总会重启(包括 Docker 守护进程启动时)。
    • 自动重启场景:容器崩溃、Docker 重启、手动停止后守护进程重启
    • 手动停止后的行为:会自动重启
    • 适用场景:关键服务(如数据库、Web 服务器)需高可用性保障。
  • unless-stopped
    • 作用:当容器因异常退出(如崩溃、进程终止)或 Docker 守护进程重启时,容器会自动重启。
    • 例外:若容器是被用户手动停止(如 docker stop 命令),则即使 Docker 守护进程重启,容器也不会自动启动
    • 自动重启场景:容器崩溃、Docker 重启
    • 手动停止后的行为:不会自动重启(需手动启动)
    • 适用场景:需长期运行且避免因宿主机重启导致意外启动的容器。

使用示例

创建容器时指定策略

shell
# 始终自动重启
docker run -d --restart=always redis

# 异常退出时最多重启3次
docker run -d --restart=on-failure:3 redis

更新已有容器的策略

shell
docker update --restart=on-failure:3 <容器名或ID>

docker update --restart=unless-stopped <容器名或ID>

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

注意事项

与 --rm 参数冲突:--restart 仅适用于 detached 模式(后台运行),且不可与 --rm(容器退出后自动删除)同时使用。

状态码影响:

  • 退出码为 0 表示正常退出,不会触发 on-failure 重启。
  • 非 0 退出码(如 127 命令不存在)会触发重启。

查看重启状态:

shell
# 查看重启次数
docker inspect -f "{{ .RestartCount }}" <容器>

# 筛选重启中的容器
docker ps -a --filter "status=restarting"

策略选择建议

推荐使用 on-failure:3:业务系统推荐使用 on-failure:3 限制重启次数,防止死循环。

推荐使用 unless-stopped:当需要临时停止容器进行维护或调试时,此策略可确保手动停止后容器保持关闭状态,避免意外重启。

推荐使用 always:适用于必须持续运行的服务(如数据库、核心微服务),即使手动停止也需在 Docker 重启后恢复

生产环境:优先使用 always 或 unless-stopped,确保服务高可用。

调试阶段:使用 no 或 on-failure,避免干扰问题排查。

资源敏感场景:通过 on-failure:max-retries 限制重启次数,防止死循环。

通过合理配置 --restart 参数,可显著提升容器化服务的稳定性和运维效率。