4.1 重启策略与实时恢复

实验准备
- 停止并删除所有容器
- 下载
harbor.seahi.me/stu/abnormal-exit
和harbor.seahi.me/stu/normal-exit
、httpd
镜像
- harbor.seahi.me/stu/normal-exit 镜像会运行15秒后正常退出(退出码为0)
- harbor.seahi.me/stu/abnormal-exit 镜像会运行15秒后发生崩溃(异常退出,退出码非0)
这两个镜像专门用于测试 Docker 的不同重启策略行为。
可以使用以下命令快速清理环境:
# 停止所有正在运行的容器
docker stop $(docker ps -q)
# 删除所有容器
docker rm $(docker ps -aq)
# 下载所需镜像
docker pull harbor.seahi.me/stu/abnormal-exit
docker pull harbor.seahi.me/stu/normal-exit
docker pull httpd
实验内容
任务一:重启策略
在 Docker 中,重启策略是确保容器可靠运行的重要机制。即使容器发生崩溃或异常退出,合适的重启策略可以帮助我们自动恢复服务,提高系统的可用性。
Docker 提供了四种重启策略,可通过 --restart
参数设置:
no
:退出时不重启,这是默认策略always
:无论容器是正常退出还是异常退出,都会自动重启(会重启无限次)on-failure[:最大次数]
:只在容器异常退出时(退出码非0)才会重启,可以指定最大重启次数unless-stopped
:除非容器被明确停止(如执行docker stop
命令),否则会一直重启
1. no 策略
首先测试默认的 no
策略,该策略下容器退出后不会自动重启:
docker run -d --name e1 harbor.seahi.me/stu/abnormal-exit
docker run -d --name e2 harbor.seahi.me/stu/normal-exit
查看容器日志,观察它们的运行状态:
docker logs -f e1
docker logs -f e2
15秒后查看两个容器的状态:
docker ps -a
可以看到,两个容器都已经处于 Exited 状态:
- e2 容器显示
Exited (0)
,表示正常退出(退出码为0) - e1 容器显示
Exited (1)
,表示异常退出(退出码为1)
在默认的 no
策略下,无论容器是正常退出还是异常退出,Docker 都不会自动重启它们。
2. always 策略
接下来测试 always
策略,该策略下容器无论如何退出都会自动重启。
首先删除刚才的两个容器:
docker rm $(docker ps -aq)
再次运行容器,这次使用 always
策略:
docker run -d --name e1 --restart always harbor.seahi.me/stu/abnormal-exit
docker run -d --name e2 --restart always harbor.seahi.me/stu/normal-exit
使用以下命令持续监视两个容器的状态:
watch -n 1 docker ps -a
还可以通过 inspect 子命令查看容器的重启次数:
docker inspect e1 | grep Restart
docker inspect e2 | grep Restart
3. on-failure 策略
下面测试 on-failure
策略,该策略只在容器异常退出时才会重启。
首先删除之前的容器:
docker rm -f $(docker ps -aq)
再次运行容器,使用 on-failure
策略并设置最大重启次数为3次:
docker run -d --name e1 --restart on-failure:3 harbor.seahi.me/stu/abnormal-exit
docker run -d --name e2 --restart on-failure:3 harbor.seahi.me/stu/normal-exit
持续监视容器状态:
watch -n 1 docker ps -a
开始时,异常退出的容器会被自动重启:
可以观察到:
- 正常退出的容器(e2)一旦退出就不再重启
- 异常退出的容器(e1)会被自动重启
重启3次后,异常退出的容器也不再重启,变成退出状态:
查看重启次数,可以看到两个容器的重启次数分别是0和3:
通过上述实验,我们可以得出以下结论:
no
策略:容器退出后不会重启(默认行为)always
策略:容器无论如何退出都会自动重启,没有次数限制on-failure
策略:只有异常退出的容器才会重启,且可以限制最大重启次数
选择合适的重启策略对于维护容器的稳定运行至关重要:
- 对于关键服务,可以使用
always
或unless-stopped
策略 - 对于需要调试的服务,可以使用
on-failure
并限制重启次数 - 对于一次性任务,使用默认的
no
策略
任务二:实时恢复
实时恢复(Live Restore)是 Docker 的一个高级特性,它允许在 Docker 守护进程(dockerd)重启或崩溃时,保持容器继续运行。这对于提高系统可用性和减少维护时的服务中断非常有价值。
按照以下步骤启用和测试 Docker 的实时恢复功能:
1. 配置实时恢复
编辑 Docker 的配置文件 /etc/docker/daemon.json
:
vim /etc/docker/daemon.json
添加如下内容以启用实时恢复功能:
2. 应用配置
重启 Docker 服务使配置生效:
# 重启 Docker
systemctl restart docker
# 检查是否重启成功
systemctl status docker
3. 创建测试容器
启动一个 httpd 容器用于测试:
# 启动容器
docker run --rm -d httpd
# 查看容器状态
docker ps
4. 测试实时恢复功能
重启 Docker 守护进程,模拟守护进程崩溃或维护场景:
systemctl restart docker
5. 验证容器状态
检查容器是否继续运行:
docker ps
6. 测试强制终止守护进程
除了正常重启外,我们还可以测试强制终止 Docker 守护进程的情况:
# 查找 Docker 守护进程的进程号
ps -e | grep dockerd
# 强制终止进程
kill -9 <进程号>
<进程号>
替换为你系统中 dockerd 进程的实际 PID。
这一步操作模拟了 Docker 守护进程的意外崩溃场景,可以进一步验证实时恢复功能的有效性。总结
-
重启策略:Docker 提供了多种重启策略(no、always、on-failure、unless-stopped),可以根据容器的用途和重要性选择合适的策略,提高服务的可靠性。
-
实时恢复:通过启用 live-restore 功能,可以在 Docker 守护进程重启或崩溃时保持容器运行,减少服务中断,适用于生产环境中对可用性要求较高的场景。
这两个特性结合使用,可以大大提高 Docker 容器化应用的稳定性和可靠性,是容器运维中的重要技能。