4.1 重启策略与实时恢复

系列 - 容器与守护进程运维
摘要
本实验将学习 Docker 的两个重要特性:容器重启策略和实时恢复功能。通过这些特性,我们可以提高容器的可靠性和系统的稳定性,保证服务的持续可用。
  1. 停止并删除所有容器
  2. 下载 harbor.seahi.me/stu/abnormal-exitharbor.seahi.me/stu/normal-exithttpd 镜像
镜像说明
  • harbor.seahi.me/stu/normal-exit 镜像会运行15秒后正常退出(退出码为0)
  • harbor.seahi.me/stu/abnormal-exit 镜像会运行15秒后发生崩溃(异常退出,退出码非0)

这两个镜像专门用于测试 Docker 的不同重启策略行为。

环境准备提示

可以使用以下命令快速清理环境:

bash

# 停止所有正在运行的容器
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 中,重启策略是确保容器可靠运行的重要机制。即使容器发生崩溃或异常退出,合适的重启策略可以帮助我们自动恢复服务,提高系统的可用性。

restart参数详解

Docker 提供了四种重启策略,可通过 --restart 参数设置:

  • no:退出时不重启,这是默认策略
  • always:无论容器是正常退出还是异常退出,都会自动重启(会重启无限次)
  • on-failure[:最大次数]:只在容器异常退出时(退出码非0)才会重启,可以指定最大重启次数
  • unless-stopped:除非容器被明确停止(如执行docker stop命令),否则会一直重启

首先测试默认的 no 策略,该策略下容器退出后不会自动重启:

bash

docker run -d --name e1 harbor.seahi.me/stu/abnormal-exit
docker run -d --name e2 harbor.seahi.me/stu/normal-exit

查看容器日志,观察它们的运行状态:

bash

docker logs -f e1
docker logs -f e2

容器日志显示

15秒后查看两个容器的状态:

bash

docker ps -a

容器退出状态

结果分析

可以看到,两个容器都已经处于 Exited 状态:

  • e2 容器显示 Exited (0),表示正常退出(退出码为0)
  • e1 容器显示 Exited (1),表示异常退出(退出码为1)

在默认的 no 策略下,无论容器是正常退出还是异常退出,Docker 都不会自动重启它们。

接下来测试 always 策略,该策略下容器无论如何退出都会自动重启。

首先删除刚才的两个容器:

bash

docker rm $(docker ps -aq)

再次运行容器,这次使用 always 策略:

bash

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

使用以下命令持续监视两个容器的状态:

bash

watch -n 1 docker ps -a

容器自动重启

结果解读
从输出结果可以看到,两个容器均在1分钟前创建,但分别仅运行了2秒和11秒。这说明它们在退出后被 Docker 自动重启了,无论是正常退出还是异常退出的容器,都会被重新启动。

还可以通过 inspect 子命令查看容器的重启次数:

bash

docker inspect e1 | grep Restart
docker inspect e2 | grep Restart

重启次数统计

下面测试 on-failure 策略,该策略只在容器异常退出时才会重启。

首先删除之前的容器:

bash

docker rm -f $(docker ps -aq)

再次运行容器,使用 on-failure 策略并设置最大重启次数为3次:

bash

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

持续监视容器状态:

bash

watch -n 1 docker ps -a

开始时,异常退出的容器会被自动重启:

异常容器重启

结果说明

可以观察到:

  • 正常退出的容器(e2)一旦退出就不再重启
  • 异常退出的容器(e1)会被自动重启

重启3次后,异常退出的容器也不再重启,变成退出状态:

达到重启次数上限

查看重启次数,可以看到两个容器的重启次数分别是0和3:

重启次数确认

重要结论

通过上述实验,我们可以得出以下结论:

  1. no 策略:容器退出后不会重启(默认行为)
  2. always 策略:容器无论如何退出都会自动重启,没有次数限制
  3. on-failure 策略:只有异常退出的容器才会重启,且可以限制最大重启次数

选择合适的重启策略对于维护容器的稳定运行至关重要:

  • 对于关键服务,可以使用 alwaysunless-stopped 策略
  • 对于需要调试的服务,可以使用 on-failure 并限制重启次数
  • 对于一次性任务,使用默认的 no 策略

实时恢复(Live Restore)是 Docker 的一个高级特性,它允许在 Docker 守护进程(dockerd)重启或崩溃时,保持容器继续运行。这对于提高系统可用性和减少维护时的服务中断非常有价值。

实时恢复的意义
在默认情况下,如果 Docker 守护进程停止,所有运行中的容器也会停止。启用实时恢复功能后,即使 Docker 守护进程重启或崩溃,容器也能继续运行,大大提高了系统的可靠性。

按照以下步骤启用和测试 Docker 的实时恢复功能:

编辑 Docker 的配置文件 /etc/docker/daemon.json

bash

vim /etc/docker/daemon.json

添加如下内容以启用实时恢复功能:

Docker 配置文件

重启 Docker 服务使配置生效:

bash

# 重启 Docker
systemctl restart docker
# 检查是否重启成功
systemctl status docker

Docker 服务状态

启动一个 httpd 容器用于测试:

bash

# 启动容器
docker run --rm -d httpd
# 查看容器状态
docker ps

运行中的容器

重启 Docker 守护进程,模拟守护进程崩溃或维护场景:

bash

systemctl restart docker

检查容器是否继续运行:

bash

docker ps

容器继续运行

结果分析
从输出结果可以看到,容器的创建时间与运行时间一致,这证明容器在 Docker 守护进程重启期间没有停止过。这就是实时恢复功能的效果。

除了正常重启外,我们还可以测试强制终止 Docker 守护进程的情况:

bash

# 查找 Docker 守护进程的进程号
ps -e | grep dockerd
# 强制终止进程
kill -9 <进程号>
注意
在实际操作中,请将命令中的 <进程号> 替换为你系统中 dockerd 进程的实际 PID。 这一步操作模拟了 Docker 守护进程的意外崩溃场景,可以进一步验证实时恢复功能的有效性。
学习要点
  1. 重启策略:Docker 提供了多种重启策略(no、always、on-failure、unless-stopped),可以根据容器的用途和重要性选择合适的策略,提高服务的可靠性。

  2. 实时恢复:通过启用 live-restore 功能,可以在 Docker 守护进程重启或崩溃时保持容器运行,减少服务中断,适用于生产环境中对可用性要求较高的场景。

这两个特性结合使用,可以大大提高 Docker 容器化应用的稳定性和可靠性,是容器运维中的重要技能。

相关内容