1. 简介

在本教程中,我们将学习如何配置 Docker 容器在系统启动时自动运行。首先,我们会介绍 Docker 提供的重启策略(Restart Policies),然后演示如何在不同场景中应用这些策略。

2. 理解 Docker 重启策略

Docker 提供了内置的 重启策略,用于控制容器是否在 Docker 守护进程重启或主机系统重启时自动启动。这些策略可以在创建容器时指定,也可以后续对已有容器进行更新。

使用 docker run 命令时,通过 --restart 参数设置重启策略。Docker 提供了以下四种策略:

策略 描述
no 默认策略,不自动重启容器
on-failure[:max-retries] 容器非正常退出时重启,可指定最大重试次数
always 容器总是自动重启,包括 Docker 守护进程重启时
unless-stopped 类似 always,除非手动停止,否则一直自动重启

注意事项

  • 策略只在容器成功运行至少 10 秒后生效,防止启动失败循环。
  • 如果容器是被手动停止的,只有在守护进程重启后才会再次启动。
  • 要确保容器能开机自启动,Docker 服务本身也必须设置为开机启动,通常通过系统服务管理器配置,如 systemd
sudo systemctl enable docker

3. 创建容器时设置重启策略

创建容器时,使用如下命令格式指定重启策略:

docker run -d --restart=<policy> --name <container-name> <image-name>

其中 -d 表示后台运行,若不加该参数容器会在前台运行并占用当前终端。

示例:创建一个始终重启的 Nginx 容器

docker run -d --restart=always --name restart_always nginx

创建完成后查看容器状态:

docker ps

输出示例:

CONTAINER ID   IMAGE     COMMAND                   CREATED          STATUS          PORTS     NAMES
8eca70915f11   nginx     "/docker-entrypoint..."   13 seconds ago   Up 12 seconds   80/tcp    restart_always

重启 Docker 守护进程验证容器是否自动启动:

sudo systemctl restart docker
docker ps

对比 CREATEDSTATUS 字段,若 STATUS 时间较新,说明容器确实重启了。

4. 为已有容器添加重启策略

对已存在的容器,可以使用 docker update 命令更新其重启策略:

docker update --restart=<policy> <container-name>

示例:为已有容器设置 always 策略

docker run -d --name restart_always nginx
docker inspect -f "{{ .HostConfig.RestartPolicy.Name }}" restart_always
# 输出: no
docker update --restart=always restart_always
docker inspect -f "{{ .HostConfig.RestartPolicy.Name }}" restart_always
# 输出: always

再次重启 Docker 守护进程验证:

sudo systemctl restart docker
docker ps

5. 在 Docker Compose 中配置重启策略

当使用 Docker Compose 部署多个服务时,可以在 docker-compose.yml 文件中为每个服务单独设置重启策略。

示例:定义 Nginx 和 Redis 服务始终重启

services:
  redis:
    image: redis
    ports:
      - '6379:6379'
    restart: always
  web:
    image: nginx
    ports:
      - "80:80"
    restart: always
    depends_on:
      - redis

启动服务:

docker compose up -d

输出示例:

[+] Running 3/3
 ✔ Network restart_always_default    Created    0.1s 
 ✔ Container restart_always-redis-1  Started    0.1s 
 ✔ Container restart_always-web-1    Started    0.0s 

重启 Docker 守护进程后,验证容器是否自动启动:

sudo systemctl restart docker
docker ps

6. 小结 ✅

  • Docker 提供了四种重启策略:noon-failurealwaysunless-stopped
  • 使用 --restart 参数可在创建容器时设置策略
  • 使用 docker update 可为已有容器更新策略
  • 在 Docker Compose 中通过 restart: 字段配置策略
  • 要确保容器能开机自启动,Docker 服务本身也必须设置为开机启动:sudo systemctl enable docker

⚠️ 踩坑提醒:
容器必须运行至少 10 秒后策略才生效;手动停止的容器不会自动重启,除非 Docker 守护进程重启。

合理使用重启策略,可以大大提升服务的可用性和稳定性。


原始标题:Setting Docker Containers to Start Automatically at Boot