Docker容器自启动服务器重启
为什么要让 Docker 容器随服务器自动重启
刚接触 Docker 的朋友经常遇到一个问题:辛辛苦苦部署好的容器,服务器一重启就全停了,每次都要手动 docker start。
尤其是在生产环境,这种操作既麻烦又容易漏掉关键服务。
Docker 自带了重启策略,可以让你指定容器在退出或系统重启后自动复活,无需人工干预。
下面按最实用的方式,一步步教你怎么设置。
准备工作:确认 Docker 服务已启用自启动
在配置容器之前,先确保 Docker 守护进程本身已经设置为开机自启。
如果 Docker 服务没起来,容器策略再完美也没用。
- 执行
sudo systemctl status docker,看输出中是否有Active: active (running)。 - 如果没有启用自启,运行
sudo systemctl enable docker --now即可立即启动并设为开机启动。
方法一:创建容器时指定自启动策略(最推荐)
使用 docker run 创建新容器时,直接加上 --restart 参数。
常用的值有:
always:容器退出或服务器重启时自动重启,除非手动执行docker stop。unless-stopped:和always类似,但如果容器被手动停止,则重启后不再自动启动。on-failure:仅在容器因错误退出时重启,服务器重启时也会启动。
示例: 创建一个 Nginx 容器并设置为 always 重启
docker run -d --name my-nginx --restart always -p 80:80 nginx:latest
参数说明:
-d后台运行--restart always指定自重启-p 80:80映射端口
执行完后,即使重启服务器,my-nginx 也会自动恢复运行。
方法二:对已有容器启用自启动(无需重建)
如果容器已经创建过了,不用删掉重建,使用 docker update 命令更新重启策略。
命令格式:
docker update --restart always 容器名或ID
实战:
- 先查看现有容器列表:
docker ps -a。 - 找到你想自启动的容器,比如
wp-blog。 - 执行
docker update --restart always wp-blog。 - 验证策略是否生效:
docker inspect wp-blog | grep -i restart,应该能看到"RestartPolicy": {"Name": "always"}。
这个方法不影响容器内部配置,可以批量操作:
docker update --restart always $(docker ps -q)
注意:以上命令会作用于所有运行中的容器,谨慎使用。
避坑指南:常见错误与解决方案
1. 重启策略与 systemd 冲突
有些服务器使用 docker-compose 管理或自定义了 systemd 服务。
如果容器自身设置了 --restart always,而 systemd 服务也设置了 Restart=always,可能造成双重重启,导致日志疯狂刷。解决办法:统一用一种方式。
建议用 Docker 自己的重启策略,把 systemd 服务设为 Restart=no(或直接不设置)。
2. 停止容器后重启仍启动
如果你手动 docker stop 了一个 --restart always 的容器,重启服务器后它依然会启动。
这是因为 Docker 重启策略在停止时不会改变。
如果需要彻底禁用,用 docker update --restart no 容器名 修改策略。
3. 容器依赖顺序问题
如果 A 容器依赖 B 容器(例如 WordPress 依赖 MySQL),双方都设置 always 重启策略后,启动顺序不受控。
建议用 docker-compose 的 depends_on 并结合 restart: always,或者使用更专业的编排工具。
验证方法:模拟重启并检查结果
配置完成后,最好真实验证一次。
- 确认当前容器正在运行:
docker ps。 - 执行
sudo reboot重启服务器(注意:云服务器通常可从控制台强制重启)。 - 等待系统启动,SSH 登录后查看容器状态:
docker ps。 - 如果容器出现在列表中且状态为
Up,说明配置成功。
快速验证不重启系统:也可以使用 docker restart 容器名 测试退出后是否自动拉起来,但服务器重启场景必须实际验证一次。
总结
配置 Docker 容器自启动并不复杂,核心就是 --restart 参数和 docker update 命令。
新手容易忽略 Docker 服务本身的自启状态,也容易混淆不同重启策略的区别。建议所有关键业务容器都设置为 unless-stopped,既能保证自动恢复,又不会在手动停止后意外复活。
如果你在生产环境中遇到容器启动顺序或日志疯转的问题,可以返回本文的避坑指南对照排查。