在 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:alpine restart: unless-stopped ports: - "80:80" db: image: mysql:8.0 restart: unless-stopped environment: 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
是最简单可靠的解决方案。