自动启动容器
Docker 提供 重启策略 来控制容器在退出或 Docker 重启时是否自动启动。重启策略会按正确顺序启动关联的容器。 Docker 建议您使用重启策略,避免使用进程管理器来启动容器。
重启策略与 dockerd 命令的 --live-restore 标志不同。使用 --live-restore 可以让您在 Docker 升级期间保持容器运行,尽管网络和用户输入会被中断。
使用重启策略
要为容器配置重启策略,请在使用 docker run 命令时使用 --restart 标志。--restart 标志的值可以是以下任意值:
| Flag | 描述 |
|---|---|
no | 不要自动重启容器。(默认) |
on-failure[:max-retries] | 如果容器因错误(表现为非零退出代码)而退出,则重新启动容器。可以选择使用 :max-retries 选项限制 Docker 守护进程尝试重启容器的次数。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也退出,无论容器的重启策略如何。以下示例说明了这种行为。
创建一个 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根据 Dockerfile 构建镜像。
$ docker build -t startstop .从镜像运行容器,并将其重启策略指定为
always。容器将数字 1..5 打印到标准输出,然后退出。这会导致附加的 CLI 也退出。
$ docker run --restart always startstop Starting... 1 2 3 4 5 Exiting... $运行
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您可以在重启之间将终端重新连接到容器,方法是使用
docker container attach命令。下次容器退出时,它会再次分离。$ docker container attach 081991b35afe 4 5 Exiting... $
使用进程管理器
如果重启策略不适合您的需求,例如当Docker外部的进程依赖于Docker容器时,您可以使用进程管理器,如 systemd 或 supervisor 来代替。
警告
不要将 Docker 重启策略与主机级进程管理器结合使用,因为这会产生冲突。
要使用进程管理器,请将其配置为使用与手动启动容器时相同的 docker start 或 docker service 命令来启动您的容器或服务。有关更多详细信息,请参阅特定进程管理器的文档。
在容器内使用进程管理器
进程管理器也可以在容器内运行,以检查进程是否正在运行,如果没有运行则启动/重启它。
警告
这些不是 Docker 感知的,仅监控容器内的操作系统进程。Docker 不推荐这种方法,因为它是平台相关的,并且可能在不同的 Linux 发行版本之间存在差异。