自动启动容器

Docker 提供重启策略来控制容器是在退出时自动启动,还是在退出时自动启动 Docker 重启。重启策略以正确的顺序启动链接容器。 Docker 建议您使用重启策略,并避免使用 process managers 启动容器。

重启策略与命令的标志不同。使用 可让您在 Docker 升级,但网络和用户输入中断。--live-restoredockerd--live-restore

使用重启策略

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

描述
no不要自动重启容器。(默认)
on-failure[:max-retries]如果容器由于错误而退出,请重新启动容器,该错误表现为非零退出代码。(可选)使用该选项限制 Docker 守护程序尝试重新启动容器的次数。该策略仅在容器退出失败时提示重启。如果守护程序重新启动,它不会重新启动容器。:max-retrieson-failure
always如果容器停止,请始终重新启动容器。如果手动停止,则仅当 Docker 守护程序重新启动或手动重新启动容器本身时,才会重新启动。(请参阅重新启动策略详细信息中列出的第二个项目符号)
unless-stopped与 类似,不同之处在于,当容器停止(手动或其他方式)时,即使在 Docker 守护程序重新启动后也不会重新启动。always

以下命令启动 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 服务,请参阅 与 service restart 相关的标志

重启前台容器

当您在前台运行容器时,停止容器会导致 attach 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. Running 显示仍在运行或正在重新启动,这要归功于 restart 策略。但是,CLI 会话已退出。它没有 在初始容器退出后继续存在。docker ps

    $ 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 重启策略与主机级进程管理器结合使用, 因为这会产生冲突。

要使用进程管理器,请将其配置为使用 您通常使用的相同 OR 命令 手动启动容器。有关特定 进程管理器了解更多详细信息。docker startdocker service

在容器内使用进程管理器

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

警告

这些不是 Docker 感知的,并且仅监控 容器。Docker 不推荐这种方法,因为它是 取决于平台,并且可能因给定 Linux 的版本而异 分配。