在京东云(JD Cloud)的云服务器(ECS)上搭建 Docker 环境后,要实现 Docker 容器开机自启,核心是利用 Docker 自带的 --restart 策略(推荐)或结合 systemd 服务管理。以下是安全、稳定、符合生产实践的完整方案:
✅ 推荐方式:使用 Docker 的 --restart 策略(最简单可靠)
Docker 原生支持容器重启策略,无需额外脚本或 systemd 配置,且与宿主机启动顺序解耦,兼容性好。
1. 创建容器时指定重启策略
docker run -d
--name my-nginx
--restart=always # ⭐ 关键:始终重启(包括系统重启后)
-p 80:80
nginx:alpine
✅
--restart=always:Docker daemon 启动时自动启动该容器(即使容器异常退出也重启)
🔁 其他常用策略:
--restart=on-failure[:max-retries]:仅失败时重启(可选最大重试次数)--restart=unless-stopped:更推荐用于生产——容器被手动docker stop后不再自动启动,避免误操作干扰;但系统重启后仍会启动。
2. 对已运行的容器添加重启策略(需重启容器)
Docker 不支持动态修改 --restart 策略,需先更新再重启:
# 1. 停止并删除原容器(⚠️注意:会丢失未持久化数据!)
docker stop my-nginx
docker rm my-nginx
# 2. 用相同配置+--restart重新运行(建议用 docker-compose 或保存为脚本)
docker run -d
--name my-nginx
--restart=unless-stopped
-p 80:80
-v /data/nginx/conf:/etc/nginx/conf.d
-v /data/nginx/html:/usr/share/nginx/html
nginx:alpine
💡 提示:务必通过
-v挂载配置/数据目录,避免容器重建导致数据丢失!
🛠️ 进阶方式:使用 systemd 管理容器(适合复杂依赖场景)
⚠️ 仅当需要控制容器启动顺序(如依赖数据库)、或需集成到系统日志/健康检查时才推荐。普通场景不建议替代
--restart。
示例:创建 systemd service 管理 Nginx 容器
# 创建 service 文件
sudo vim /etc/systemd/system/docker-nginx.service
[Unit]
Description=Nginx Container
Documentation=https://docs.docker.com/
After=docker.service
Wants=docker.service
[Service]
Type=oneshot
ExecStart=/usr/bin/docker start -a my-nginx
ExecStop=/usr/bin/docker stop -t 2 my-nginx
Restart=always
RestartSec=10
# 可选:限制内存/CPU,增强稳定性
MemoryLimit=512M
CPUQuota=50%
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl daemon-reload
sudo systemctl enable docker-nginx.service # 开机自启
sudo systemctl start docker-nginx.service # 立即启动
✅ 验证:
sudo systemctl is-enabled docker-nginx.service→ 应返回enabled
🔍 关键检查项(京东云 ECS 特别注意)
| 检查点 | 操作 | 说明 |
|---|---|---|
| ✅ Docker 服务开机自启 | sudo systemctl enable docker |
必须执行! 否则 --restart 不生效(因为 Docker daemon 本身没启动) |
| ✅ 京东云安全组放行端口 | 控制台 → VPC/安全组 → 添加入方向规则 | 如 TCP:80,443,3306 等,否则容器虽运行但外部无法访问 |
| ✅ 云服务器防火墙(如 firewalld/ufw) | sudo ufw status 或 sudo firewall-cmd --list-all |
若启用,需放行对应端口(或关闭:sudo ufw disable) |
| ✅ 数据持久化 | 使用 -v /host/path:/container/path |
避免容器重建导致配置/数据丢失 |
🚫 常见误区 & 避坑指南
| 误区 | 正确做法 |
|---|---|
❌ 用 docker run --restart=always 但没开启 docker.service 自启 |
✅ sudo systemctl enable docker |
❌ 直接在 /etc/rc.local 里写 docker start xxx |
⚠️ 不可靠(Docker daemon 可能未就绪),且 Ubuntu 22.04+/CentOS 8+ 默认禁用 rc.local |
❌ 容器内运行 supervisord 或 systemd |
❌ 反模式!容器应只运行单进程,用宿主机 Docker 管理重启即可 |
| ❌ 忘记挂载卷导致配置丢失 | ✅ 所有关键数据(数据库、配置、日志)必须 -v 挂载到宿主机 |
✅ 最佳实践总结(京东云一键 checklist)
# 1. 确保 Docker 服务开机自启
sudo systemctl enable docker
sudo systemctl start docker
# 2. 运行容器时指定 --restart(推荐 unless-stopped)
docker run -d
--name app-web
--restart=unless-stopped
-p 8080:80
-v /home/jduser/app-data:/app/data
-v /home/jduser/app-conf:/app/config
your-registry.com/your-app:latest
# 3. 京东云控制台:检查安全组是否开放 8080 端口
# 4. 本地测试:curl http://<你的公网IP>:8080
# 5. 模拟重启验证:sudo reboot && ssh back → docker ps 查看容器是否运行
如需进一步自动化(如多容器编排),推荐直接使用 Docker Compose(docker-compose.yml 中 restart: unless-stopped),并配合 systemctl enable docker-compose@xxx.service 管理。
需要我为你生成一个完整的 docker-compose.yml 示例(含 Nginx + Redis + MySQL)或京东云安全组配置截图指引,欢迎随时提出 👍
CLOUD技术笔记