docker容器默认不会自动重启,但可通过设置restart策略实现自愈。常用的策略包括no(默认不重启)、on-failure(出错时重启并可设最大重试次数)、always(无论原因都重启)和unless-stopped(类似always但不受守护进程重启影响)。设置方法有两种:1.运行容器时使用–restart参数,如docker run -d –restart always my-image;2.在docker-compose.yml中配置restart属性。使用时需注意避免因依赖服务未就绪导致的重启死循环,并合理选择策略以适应不同场景。
Docker 容器默认不会在宿主机重启或自身异常退出后自动恢复。但你可以通过设置 restart 策略,让容器具备一定的“自愈”能力。这个功能其实很简单,但用对了能省不少心。
一、什么是 restart 策略?
restart 策略是 Docker 提供的一个选项,用于控制容器在退出时是否自动重启。它不是“永远运行”,而是根据设定的条件来决定要不要重新启动容器。
比如你跑一个 web 服务,如果程序崩溃退出了,默认是不会重启的。但如果你设置了 –restart=always,那不管因为什么原因退出,Docker 都会尝试把它拉起来。
二、常用的 restart 策略有哪些?
Docker 支持以下几种常见的 restart 策略:
- no:默认值,不自动重启。
- on-failure[:max-retries]:只有在容器退出状态码非0(出错)时才重启,可以加个最大重试次数。
- always:只要容器停止,不管是不是正常退出,都会重启。
- unless-stopped:和 always 类似,但它不会因为 Docker 守护进程重启而自动重启,除非手动停止过。
举个例子:
docker run -d --restart unless-stopped my-web-app
这条命令会让容器一直保持运行状态,即使服务器重启了,也会自动拉起。
三、怎么设置 restart 策略?
设置方式有两种:创建容器时指定,或者在 compose 文件里写好。
1. 使用命令行参数
在运行容器的时候加上 –restart 参数即可:
docker run -d --restart always my-image
2. 在 docker-compose.yml 中配置
如果是用 docker-compose,可以在服务定义里加一行:
services: web: image: my-web restart: unless-stopped
这样管理多个容器的时候更方便,也更容易维护。
四、使用中要注意什么?
虽然 restart 很实用,但也不是随便乱设。
-
如果你的容器依赖外部服务(比如数据库),频繁重启可能会导致死循环,卡在不断重启的状态。
-
on-failure 可以加重试次数限制,避免无限重启。例如:
docker run -d --restart on-failure:5 my-image
表示最多尝试重启 5 次,失败就放弃。
-
如果你不希望容器随着系统重启自动拉起,那就别用 always 或 unless-stopped。
基本上就这些。设置容器的自动重启不算复杂,但在生产环境使用时要结合实际情况考虑清楚策略的选择。