Docker镜像重启策略:让服务更稳定的小技巧

什么时候需要设置ref="/tag/285/" style="color:#8B0506;font-weight:bold;">重启策略

你有没有遇到过这样的情况:服务器突然断电,或者程序崩溃后服务直接挂掉,等你反应过来还得手动登录上去重启容器?尤其是一些关键服务,比如数据库、API接口,一旦停了影响一大片。这时候,Docker的重启策略就能派上用场了。

注意,这里说的是“容器”的重启策略,不是镜像本身。镜像是静态的模板,真正运行的是容器。我们通过给容器设置重启策略,让它在异常退出时自动拉起,减少人工干预。

四种重启策略详解

Docker 提供了四种主要的重启策略,通过 restart 参数来设置:

  • no:默认行为,容器退出时不自动重启。
  • on-failure[:max-retries]:只有容器以非0状态码退出时才重启,可以指定最大重试次数。
  • always:无论因何退出,总是尝试重启。
  • unless-stopped:总是重启,除非容器被手动停止。

on-failure:适合有明确失败判断的服务

比如你跑一个数据处理脚本,如果执行失败(返回错误码),希望它能重试几次。可以这样写:

docker run --restart=on-failure:3 my-data-processor

这样最多重试3次,避免无限循环占用资源。

always 和 unless-stopped:常用于长期运行的服务

如果你部署了一个Web应用,希望它一直在线,哪怕宿主机重启后也能自动启动,always 就很合适:

docker run -d --restart=always -p 8080:80 nginx

但要注意,即使你手动执行 docker stopalways 策略也会在Docker守护进程重启后重新拉起容器。如果你不希望这样,就用 unless-stopped,它会尊重你的手动停止操作。

用 Docker Compose 怎么写

在实际项目中,很多人用 docker-compose.yml 来管理服务。重启策略可以直接写在里面:

version: '3'
services:
web:
image: nginx
restart: unless-stopped
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
restart: always

这样在执行 docker-compose up -d 时,策略就会生效。

小贴士:别忘了查看当前策略

已经运行的容器,怎么知道它的重启策略是什么?用这个命令:

docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' <container_id>

比如返回 unless-stopped,就说明设置了对应策略。

合理使用重启策略,能让你的服务更“皮实”,半夜再也不用因为一条告警消息爬起来重启容器了。