1. 概述

在本教程中,我们将学习如何在 Docker Compose 中使用 重启策略(restart policy) 来管理容器的生命周期。

我们会先介绍 Docker 原生的重启策略配置方式,然后重点讲解在 Docker Compose 中如何配置重启策略,包括:

  • 普通模式(normal mode)
  • 群集模式(swarm mode)

2. Docker 原生重启策略

重启策略是 Docker 提供的自动重启容器的机制,用于应对容器异常退出或服务崩溃的情况。

需要注意以下几点:

  • 容器首次启动后至少运行 10 秒以上,重启策略才会生效,防止容器刚启动就失败导致无限重启。
  • 如果你手动停止容器,重启策略不会生效。只有当容器异常退出,或 Docker 守护进程重启时,策略才会触发。

Docker 提供了以下几种重启策略:

策略 描述
no 默认策略,不会自动重启容器 ❌
on-failure[:max-retries] 容器退出码非 0 时重启,可选最大重试次数 ✅
always 总是重启容器,无论退出状态 ✅
unless-stopped 总是重启容器,除非你手动停止它 ✅

示例:CLI 设置重启策略

docker run --restart always my-service

上述命令表示容器 my-service 会在退出后自动重启。但如果你手动执行 docker stop 停止容器,除非 Docker 守护进程重启,否则不会触发重启。

3. 环境准备

为了演示 Docker Compose 中的重启策略,我们将使用一个 Spring Boot 项目:spring-cloud-docker,该项目包含两个服务:

  • message-server(监听端口 8888)
  • product-server(监听端口 9999)

✅ 启动服务:

docker-compose up --detach --build

✅ 查看运行状态:

docker ps

输出示例:

     Name                   Command              State            Ports         
--------------------------------------------------------------------------------
message-server   java -jar /message-server.jar   Up      0.0.0.0:18888->8888/tcp
product-server   java -jar /product-server.jar   Up      0.0.0.0:19999->9999/tcp

你也可以访问 http://localhost:18888http://localhost:19999 来验证服务是否正常。

4. Docker Compose 普通模式下的重启策略

在普通模式(非 swarm)下,Docker Compose 支持通过 restart 属性配置重启策略,语法与 Docker CLI 完全一致。

示例:docker-compose.yml 配置

message-server:
    container_name: message-server
    build:
        context: docker-message-server
        dockerfile: Dockerfile
    image: message-server:latest
    ports:
        - 18888:8888
    networks:
        - spring-cloud-network
    restart: no

product-server:
    container_name: product-server
    build:
        context: docker-product-server
        dockerfile: Dockerfile
    image: product-server:latest
    ports:
        - 19999:9999
    networks:
        - spring-cloud-network
    restart: on-failure

说明:

  • message-server 不会自动重启 ❌
  • product-server 只有在非 0 退出码时才会重启 ✅

⚠️ 注意:restart 属性直接放在服务级别,不是嵌套在 deploy 下。

5. Docker Compose 群集模式下的重启策略

在 swarm 模式下,Docker Compose 支持更丰富的重启策略配置,通过 restart_policy 属性定义,支持如下参数:

参数 说明
condition 重启条件:noneon-failureany
delay 重启间隔时间
max_attempts 最大重试次数
window 判定重启是否成功的窗口时间

示例:swarm 模式配置

首先确认使用 Docker Compose v3:

version: '3'

然后配置重启策略:

message-server:
    container_name: message-server
    build:
        context: docker-message-server
        dockerfile: Dockerfile
    image: message-server:latest
    ports:
        - 18888:8888
    networks:
        - spring-cloud-network
    deploy:
        restart_policy:
            condition: any
            delay: 5s
            max_attempts: 3
            window: 120s
product-server:
    container_name: product-server
    build:
        context: docker-product-server
        dockerfile: Dockerfile
    image: product-server:latest
    ports:
        - 19999:9999
    networks:
        - spring-cloud-network
    deploy:
        restart_policy:
            condition: on-failure
            delay: 3s
            max_attempts: 5
            window: 60s

⚠️ 注意:restart_policy 必须写在 deploy 属性下,仅适用于 swarm 模式。

6. 总结

本文介绍了 Docker Compose 中的重启策略配置方式,分为:

模式 属性名 支持参数
普通模式 restart no, on-failure, always, unless-stopped
群集模式 restart_policy condition, delay, max_attempts, window

✅ 使用建议:

  • 如果你只是本地开发或单机部署,使用普通模式即可。
  • 如果你部署在集群环境(swarm mode),建议使用 restart_policy 配置更精细的重启策略。

所有示例代码已整理在 GitHub 上:spring-cloud-docker


原始标题:Docker Compose Restart Policies