Docker容器开机自启本质是依赖原生--restart策略实现自动拉起,而非轮询或外部调度;前提为Docker服务已systemd启用开机自启且容器配置了unless-stopped/always/on-failure等有效重启策略。

Docker 容器实现开机自启,本质是让容器在宿主机重启或 Docker 守护进程恢复后自动拉起,关键靠原生的 --restart 策略,而不是写脚本轮询或依赖外部调度。
容器开机自启的前提条件
必须满足两个基础环节,缺一不可:
- Docker 服务本身已设置为系统开机自启(否则容器根本没机会启动)
- 容器配置了有效的重启策略(如
unless-stopped、always等)
启用 Docker 服务开机自启(以 systemd 系统为例):
sudo systemctl enable docker sudo systemctl start docker # 立即启动(若尚未运行)
验证是否生效:
systemctl is-enabled docker # 应输出 enabled systemctl is-active docker # 应输出 active
新建容器时直接配置重启策略
使用 docker run 命令时加上 --restart 参数(需配合 -d 后台模式):
--restart=unless-stopped
宿主机或 Docker daemon 重启后自动启动;但手动执行docker stop后不再自启,运维意图明确,生产环境推荐首选--restart=always
不管是否被手动停过,只要 daemon 启动就强制拉起;适合 etcd、cert-manager 等绝对不可中断的核心组件,必须搭配HEALTHCHECK使用,否则健康失败也会无限重启--restart=on-failure:3
仅当容器以非零退出码终止时重启,最多重试 3 次;适合依赖数据库、Redis 等外部服务的应用,避免因连接失败陷入死循环--restart=no(默认值)
不自动重启,适用于 CI 构建容器、一次性任务,或由 Kubernetes / systemd 上层编排统一管理生命周期的场景
示例:
# Web 服务(推荐 unless-stopped) docker run -d --restart unless-stopped --name web -p 80:80 nginx # 缓存服务(异常时最多重试 5 次) docker run -d --restart on-failure:5 --name cache redis # 核心协调服务(需健康检查) docker run -d --restart always --health-cmd="redis-cli ping" --health-interval=30s redis
已运行容器补设重启策略
无需停止容器,Docker 20.10+ 支持热更新:
docker update --restart unless-stopped myapp
验证是否生效:
docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' myapp
# 输出应为 unless-stopped、always 等对应值批量或全局设置方式
-
批量更新所有容器(谨慎使用):
docker update --restart unless-stopped $(docker ps -aq)
-
设置 Docker daemon 默认策略(影响后续所有新建容器):
编辑/etc/docker/daemon.json:{ "default-restart-policy": "unless-stopped" }保存后重启 Docker:
sudo systemctl restart docker
Docker Compose 场景
在 docker-compose.yml 中为服务指定 restart 字段:
services:
api:
image: myapi:latest
restart: unless-stopped
db:
image: postgres:15
restart: on-failure:3注意:Compose 启动的服务仍依赖宿主机上 Docker 服务已开机自启,且 restart 策略在 docker-compose up -d 后才生效。
不复杂但容易忽略。


















