自动启动容器

Docker 提供了重启策略,用于控制您的容器在退出或 Docker 重启时是否自动启动。重启策略会按正确的顺序启动链接的容器。Docker 建议您使用重启策略,并避免使用进程管理器来启动容器。

重启策略与 dockerd 命令的 --live-restore 标志不同。使用 --live-restore 可以在 Docker 升级期间保持容器运行,尽管网络和用户输入会中断。

使用重启策略

要为容器配置重启策略,请在使用 docker run 命令时使用 --restart 标志。--restart 标志的值可以是以下任何一种

标志描述
no不自动重启容器。(默认)
on-failure[:max-retries]如果容器因错误退出(表现为非零退出代码),则重启容器。可选地,使用 :max-retries 选项限制 Docker 守护进程尝试重启容器的次数。on-failure 策略仅在容器因失败退出时才会触发重启。如果守护进程重启,它不会重启容器。
always如果容器停止,则始终重启容器。如果它是手动停止的,则仅在 Docker 守护进程重启或容器本身被手动重启时才会重启。(请参阅重启策略详情中列出的第二点)
unless-stoppedalways 类似,不同之处在于,当容器停止时(手动或其他方式),即使在 Docker 守护进程重启后也不会重启它。

以下命令启动一个 Redis 容器,并将其配置为始终重启,除非容器被明确停止或守护进程重启。

$ docker run -d --restart unless-stopped redis

以下命令更改一个名为 redis 的已运行容器的重启策略。

$ docker update --restart unless-stopped redis

以下命令确保所有正在运行的容器都重新启动。

$ docker update --restart unless-stopped $(docker ps -q)

重启策略详情

在使用重启策略时,请记住以下几点

  • 重启策略仅在容器成功启动后生效。在这种情况下,成功启动意味着容器已运行至少 10 秒,并且 Docker 已开始监控它。这可以防止一个根本无法启动的容器进入重启循环。

  • 如果您手动停止一个容器,重启策略将被忽略,直到 Docker 守护进程重启或容器被手动重启。这可以防止重启循环。

  • 重启策略仅适用于容器。要为 Swarm 服务配置重启策略,请参阅与服务重启相关的标志

重启前台容器

当您在前台运行容器时,停止容器也会导致附加的 CLI 退出,无论容器的重启策略如何。以下示例说明了此行为。

  1. 创建一个 Dockerfile,打印数字 1 到 5 然后退出。

    FROM busybox:latest
    COPY --chmod=755 <<"EOF" /start.sh
    echo "Starting..."
    for i in $(seq 1 5); do
      echo "$i"
      sleep 1
    done
    echo "Exiting..."
    exit 1
    EOF
    ENTRYPOINT /start.sh
  2. 从 Dockerfile 构建一个镜像。

    $ docker build -t startstop .
    
  3. 从该镜像运行一个容器,并为其重启策略指定为 always

    容器将数字 1..5 打印到标准输出,然后退出。这也会导致附加的 CLI 退出。

    $ docker run --restart always startstop
    Starting...
    1
    2
    3
    4
    5
    Exiting...
    $
    
  4. 运行 docker ps 显示它仍在运行或重新启动,这要归功于重启策略。然而,CLI 会话已经退出。它在容器初次退出后不会继续存在。

    $ docker ps
    CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS     NAMES
    081991b35afe   startstop   "/bin/sh -c /start.sh"   9 seconds ago   Up 4 seconds             gallant_easley
    
  5. 您可以在重启之间使用 docker container attach 命令将您的终端重新附加到容器。在容器下一次退出时,它会再次被分离。

    $ docker container attach 081991b35afe
    4
    5
    Exiting...
    $
    

使用进程管理器

如果重启策略不符合您的需求,例如当 Docker 之外的进程依赖于 Docker 容器时,您可以使用诸如 systemdsupervisor 之类的进程管理器来替代。

警告

不要将 Docker 重启策略与主机级别的进程管理器结合使用,因为这会产生冲突。

要使用进程管理器,请将其配置为使用您通常用于手动启动容器的相同 docker startdocker service 命令来启动您的容器或服务。有关更多详细信息,请查阅特定进程管理器的文档。

在容器内使用进程管理器

进程管理器也可以在容器内运行,以检查进程是否正在运行,如果不在运行则启动/重启它。

警告

这些不是 Docker 感知的,并且仅监控容器内的操作系统进程。Docker 不推荐这种方法,因为它是平台相关的,并且在不同版本的 Linux 发行版之间可能会有所不同。

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.