Docker容器自启动设置:让你的服务崩溃后自动恢复
开始前的准备
在动手之前,先确认你满足以下条件:
- 已安装 Docker(官方版本 19.03 及以上)
- 拥有服务器 root 或 sudo 权限
- 如果使用宝塔面板,需要已安装【Docker 管理器】插件(版本 1.6 以上)
提示:本文所有命令均在 CentOS 7.9 下测试通过,Ubuntu/Debian 同样适用。
两种实现Docker容器自启动的方法
Docker 容器自启动的核心是利用 --restart 策略。
你可以在创建容器时设置,也可以对已有容器追加。
下面分别讲解。
方法一:创建新容器时启用自启动
最直接的方式是在 docker run 时加上 --restart 参数。
推荐使用 always 或 unless-stopped。
docker run -d --name my-nginx --restart always nginx:latestalways:只要 Docker 守护进程启动,容器就自动重启。即使你手动docker stop过,下次 Docker 重启时依然会启动。unless-stopped:手动停止过的容器,Docker 重启时不会自动启动。更符合日常运维习惯。
建议:对于数据库、Web 服务等核心应用,用 always;
对临时调试容器用 unless-stopped 避免误重启。
方法二:让已有容器具备自启动能力
如果你已经有一个正在运行的容器(比如 my-app),可以用 docker update 命令修改重启策略。
docker update --restart always my-app之后该容器就会自动启用自启动。
无需重建容器,零中断影响。
宝塔面板用户:在【Docker】->【容器管理】中找到对应容器,点击【设置】,在“重启策略”下拉框中选择“始终重启”或“除非手动停止”,保存即可。
操作可视化,无需记命令。
如何验证自启动是否生效
设置完成后,必须验证才能放心。
以下是三种验证方式。
1. 检查容器详情
docker inspect my-app --format '{{.HostConfig.RestartPolicy.Name}}'返回值应为 always 或 unless-stopped,而不是空字符串。
2. 模拟服务器重启
sudo reboot等待服务器恢复后,登录执行:
docker ps查看目标容器是否在运行列表中。
如果显示状态 Up 且时间与当前时间接近,说明自启动生效。
3. 模拟容器进程崩溃
docker kill my-app # 强制杀死容器
sleep 3
docker ps如果看到容器自动重启(状态中的 Uptime 重置),说明 always 策略工作正常。
注意:Kill 后 Docker 会标记重启状态,如果你的策略是 on-failure:5(最多重启5次),则需测试多次。高频问题与避坑提醒
Q1:为什么容器重启策略设置为 always,但重启后还是没启动?
- 检查 Docker 服务本身是否设置为开机自启:
sudo systemctl enable docker- 如果 Docker 服务没有自启,容器策略再正确也没用。
- 如果是通过
docker compose启动的容器,需要同时检查docker-compose.yml中restart字段。
Q2:restart: unless-stopped 和 restart: always 到底选哪个?
- always:Docker 重启后无条件启动容器(包括手动停掉的)。适合生产环境关键服务。
- unless-stopped:手动停掉的容器不会随 Docker 重启。适合开发/临时环境。
- on-failure[:max-retries]:仅在容器因错误退出时重启(退出码非0),可设置重试次数。
Q3:宝塔面板里设置了自启动,但实际没效果?
检查宝塔的 Docker 插件版本,部分旧版插件未同步重启策略。
建议在宝塔中查看容器配置里的“重启策略”是否已保存成功;
如果不放心,用 docker inspect 命令二次确认。
避坑清单
- ⚠️ 不要对数据库容器随意使用
--restart always,如果容器因数据损坏频繁重启,可能导致死循环。建议先设置为on-failure:2限制重启次数。 - ⚠️ Docker 重启策略仅在 Docker 守护进程启动时生效,如果物理机宕机后 Docker 未先正确启动,需人工介入。
- ⚠️ 使用
docker update修改后的容器,原有环境变量和挂载卷不受影响,放心操作。
总结
Docker容器自启动设置只有一行命令或一次面板点击的成本,却能在服务器意外重启时挽救你的业务。
推荐新手先用 docker run --restart unless-stopped 创建测试容器,熟悉后再应用到生产环境。
遇到任何异常,优先检查 Docker 服务自启状态。