在 CVM 上部署 Docker 并实现开机自启,核心是确保 Docker 服务本身随系统启动,同时为容器配置重启策略。
先说结论:标准做法是通过 systemd 管理 Docker 服务,并为容器添加 `--restart` 参数。
- 适合:主流 Linux 发行版(CentOS 7+, Ubuntu 20.04+)
- 先准备:root 权限或 sudo 授权
- 验收:重启服务器后容器状态为 Up
1. 安装 Docker 引擎
建议使用官方维护的安装脚本,能自动识别系统版本并配置仓库。国内用户建议配置镜像加速,否则拉取镜像可能超时。
# 1. 安装 Docker (官方脚本)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 2. 配置国内镜像加速 (可选但推荐)
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-EOF
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker注意:不同发行版包管理器不同,CentOS 使用 yum,Ubuntu 使用 apt,但上述脚本已自动处理。若脚本执行失败,可检查网络连接或手动配置仓库。
2. 配置服务与容器自启
Docker 的开机自启分两层:Docker 守护进程随系统启动,业务容器随 Docker 启动。
# 1. 设置 Docker 服务开机自启
sudo systemctl enable docker
sudo systemctl start docker
# 2. 启动容器时指定重启策略
sudo docker run -d `--name` my-app `--restart`=always nginx
# 3. 已有容器修改重启策略
sudo docker update `--restart`=always my-app策略说明:`--restart`=always 表示无论退出码如何都重启;`--restart`=unless-stopped 表示除非手动停止,否则重启。生产环境推荐前者。
3. 验证是否生效
1. 检查服务状态
运行 systemctl is-enabled docker,返回 enabled 表示服务已设自启。
2. 检查容器配置
运行 docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' <容器名称>,应输出 always 或 unless-stopped。
3. 重启测试
最稳妥的方法是执行 sudo reboot,等待服务器启动完成后,运行 docker ps 查看容器是否在运行列表中。
4. 常见故障排查
1. 网络依赖问题
如果容器依赖外部网络,而系统启动时网络尚未就绪,容器可能会启动失败。虽然 restart 策略会重试,但可能影响业务恢复速度。复杂场景建议配置 systemd 的 After=network-online.target。
2. 磁盘空间不足
开机自启不代表一定能成功启动。如果磁盘满了,Docker 守护进程可能无法写入日志或层数据,导致容器起不来。定期清理无用镜像和容器是必要的。
3. 权限与兼容性问题
部分老旧 CVM 镜像可能使用 SysVinit 而非 systemd。如果遇到 systemctl 命令不存在,需要改用 chkconfig。此外,确保当前用户有 sudo 权限,避免 Permission denied 错误。
4. 资源限制与 OOM
如果容器设置了内存限制,而开机时系统内存紧张,容器可能被 OOM Killer 杀掉。虽然 restart 策略会尝试重启,但可能陷入重启循环。建议配合监控观察重启次数。