自动启动容器
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-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 打印到 stdout,然后退出。这也会导致附加的 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 发行版的不同版本之间可能会有所不同。