什么时候需要设置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 stop,always 策略也会在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,就说明设置了对应策略。
合理使用重启策略,能让你的服务更“皮实”,半夜再也不用因为一条告警消息爬起来重启容器了。