在 linux 中实现开机自动启动 Docker 并自动运行特定镜像的容器
在 CentOS 7 中实现开机自动启动 Docker 并自动运行特定镜像的容器,有以下两种推荐方法:
方法 1:使用 Docker 的 --restart
策略(简单高效,推荐)
这是最简洁直接的方案,利用 Docker 内置的重启策略来实现:
-
确保 Docker 开机启动:
sudo systemctl enable docker
-
启动容器时添加重启策略:
docker run -d \--name my-container \--restart=unless-stopped \ # 关键参数!nginx:latest
-
(可选)如果容器已存在,更新配置:
docker update --restart=unless-stopped my-container
重启策略 | 行为 |
---|---|
unless-stopped | 除非手动停止,否则系统重启后自动运行(推荐) |
always | 总是重启(即使手动停止后也会自动重启) |
on-failure | 仅当容器非正常退出时重启 |
方法 2:使用 Systemd 服务(更精细控制)
当需要更复杂的启动顺序或参数时使用:
-
创建服务文件:
sudo vi /etc/systemd/system/docker-myapp.service
-
添加以下内容(替换为你的镜像和参数):
[Unit] Description=My Docker Container Service After=docker.service # 确保在 Docker 启动后运行 Requires=docker.service[Service] Type=simple # 确保先移除旧容器(清理) ExecStartPre=-/usr/bin/docker rm -f my-container # 启动新容器 ExecStart=/usr/bin/docker run \--name my-container \-p 80:80 \nginx:latest # 停止命令 ExecStop=/usr/bin/docker stop my-container # 清理命令 ExecStopPost=/usr/bin/docker rm my-container TimeoutStartSec=90 Restart=on-failure[Install] WantedBy=multi-user.target
-
启用服务:
sudo systemctl daemon-reload sudo systemctl enable docker-myapp.service sudo systemctl start docker-myapp.service
🔍 常见镜像启动示例
1. 启动 MySQL 容器
docker run -d \--name mysql-db \--restart=unless-stopped \-e MYSQL_ROOT_PASSWORD=123456 \-p 3306:3306 \-v /data/mysql:/var/lib/mysql \mysql:8.0
2. 启动 Nginx 容器
docker run -d \--name web-server \--restart=unless-stopped \-p 80:80 \-p 443:443 \-v /path/to/html:/usr/share/nginx/html \-v /path/to/nginx.conf:/etc/nginx/nginx.conf \nginx:alpine
3. 启动自定义应用
docker run -d \--name my-app \--restart=unless-stopped \-p 8080:3000 \-e ENV=production \my-registry.com/my-custom-image:v1.2
⚠️ 重要注意事项
-
安全加固:
# 限制容器权限 --security-opt="no-new-privileges" \ --read-only \ --cap-drop=ALL
-
资源限制:
--cpus="1.0" \ --memory="512m" \ --memory-swap="1g"
-
日志管理:
--log-opt max-size=10m \ --log-opt max-file=3
-
健康检查:
docker inspect --format='{{json .State.Health}}' my-container
🧪 验证和调试
-
检查服务状态:
systemctl status docker-myapp.service
-
查看容器日志:
docker logs -f my-container
-
测试重启:
sudo reboot # 重启后验证 docker ps curl http://localhost
-
诊断启动问题:
journalctl -u docker-myapp.service -b -n 100 --no-pager
✅ 最佳实践建议
-
使用 Docker Compose(生产推荐):
version: '3' services:web:image: nginx:alpinerestart: unless-stoppedports:- "80:80"db:image: mysql:8.0restart: unless-stoppedenvironment:MYSQL_ROOT_PASSWORD: secret
然后设置 systemd 启动 compose:
ExecStart=/usr/local/bin/docker-compose -f /path/to/docker-compose.yml up
-
版本控制:
- 始终指定容器标签(如
nginx:1.23-alpine
而非nginx:latest
) - 在 Dockerfile 或 compose 文件中固化版本
- 始终指定容器标签(如
-
数据持久化:
-v mysql_data:/var/lib/mysql # 使用命名卷
通过以上方法,您可以确保 CentOS 7 启动时自动运行 Docker 并启动指定的容器镜像。对于大多数场景,方法 1 的 --restart=unless-stopped
是最简单可靠的解决方案。