Docker容器随系统启动自动运行需配置--restart策略(如unless-stopped)并启用docker服务开机自启(systemctl enable docker),而非依赖docker start或rc.local等不可靠方式。

在 Linux 系统中,让 Docker 容器随系统启动自动运行,关键不是靠 docker start 命令本身(它只是手动启动容器),而是通过 Docker 的重启策略(restart policy)配合 systemd 或 Docker 自身的守护进程机制来实现“服务自启”。
使用 restart 策略让容器随 Docker 守护进程启动而自动运行
Docker 容器默认不会开机自启,但可通过 --restart 参数设置重启策略,使其在 Docker daemon 启动、容器退出或系统重启后自动拉起:
- always:无论退出状态如何,Docker daemon 启动时总会重启该容器(推荐用于长期服务,如 Nginx、PostgreSQL)
-
unless-stopped:同上,但跳过被手动
docker stop停止的容器(更安全,生产常用) - on-failure[:max-retries]:仅当容器非 0 状态退出时重启(适合批处理类任务)
示例:运行一个 MySQL 容器并确保它随 Docker 自启
docker run -d --name mysql-prod \--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
-v /data/mysql:/var/lib/mysql \
 >mysql:8.0
确保 Docker daemon 本身开机自启
如果 Docker 服务没启动,容器自然无法自启。需确认 Docker 守护进程已启用系统级自启:
- Ubuntu/Debian/CentOS 7+(使用 systemd):
sudo systemctl enable docker - 验证是否生效:
systemctl is-enabled docker→ 应返回enabled - 重启测试:
sudo reboot后执行docker ps,确认容器已在运行
避免常见误区
-
不要依赖
docker start写入 rc.local 或 crontab:不可靠、易竞态、无错误反馈 -
不要用
nohup docker run ... &启动前台容器:绕过 Docker 管理,丢失日志、健康检查、重启逻辑 -
容器内主进程必须前台运行:若应用默认后台化(如
nginx -d),需改用nginx -g "daemon off;",否则 Docker 会认为容器已退出
进阶:用 Docker Compose 管理多服务自启
对于多个关联容器(如 web + db + cache),推荐用 docker-compose.yml 统一定义,并启用 restart 策略:
services:
web:
image: nginx:alpine
restart: unless-stopped
ports: ["80:80"]
db:
image: postgres:15
restart: unless-stopped
environment:
POSTGRES_PASSWORD: example
部署后启用自启:docker-compose up -d 启动服务,再确保 compose 文件路径下服务可被 systemd 托管(例如用 compose-switch 或编写简单 systemd unit)










