自动启动容器

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

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

使用重启策略

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

旗帜描述
no不要自动重启容器。 (默认)
on-failure[:max-retries]如果容器因错误而退出(表现为非零退出代码),请重新启动容器。 (可选)使用该选项限制 Docker 守护进程尝试重新启动容器的次数:max-retries。该on-failure策略仅在容器因失败退出时提示重新启动。如果守护进程重新启动,它不会重新启动容器。
always如果容器停止,请务必重新启动容器。如果手动停止,则只有当 Docker 守护进程重新启动或手动重新启动容器本身时,它才会重新启动。 (请参阅重启政策详细信息中列出的第二个项目符号 )
unless-stopped与 类似always,只不过当容器停止(手动或其他方式)时,即使 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 打印到 stdout,然后退出。这也会导致附加的 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 start启动容器或服务。docker service有关更多详细信息,请参阅特定流程管理器的文档。

在容器内使用进程管理器

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

警告

它们不支持 Docker,并且仅监视容器内的操作系统进程。 Docker 不推荐这种方法,因为它依赖于平台,并且给定 Linux 发行版的版本之间可能有所不同。