在腾讯云 CVM(云服务器)上,Ubuntu 安装 Docker 后无法启动(通常表现为 systemctl start docker 报错或状态为 failed),90% 的情况不是 Docker 本身的问题,而是内核模块缺失、依赖冲突或者安全组/防火墙策略干扰。
别急着重装系统,按以下顺序排查,基本能解决。
第一步:看日志,定位核心错误
不要猜,直接看报错信息。执行以下命令查看 Docker 服务的具体失败原因:
sudo systemctl status docker -l
# 或者更详细的 journal 日志
sudo journalctl -xeu docker.service
重点看最后几行,常见的错误有几种典型场景,我们分别对号入座:
场景一:Failed to start Docker Application Container Engine + iptables 相关错误
这是最常见的情况。Docker 依赖 iptables 来管理网络规则,如果系统没有正确加载内核模块,或者 iptables 版本不兼容,就会挂掉。
解决方案:
-
检查 iptables 是否正常工作
sudo iptables -L -n如果这条命令卡住或者直接报错,说明内核的 netfilter 模块没加载。
-
重新安装/修复 iptables 和 ipset
Ubuntu 默认可能只装了iptables-persistent的一部分,尝试重装:sudo apt-get update sudo apt-get install --reinstall iptables ipset -
确保内核模块已加载
有些精简版 Ubuntu 镜像可能没加载必要的内核模块。手动加载试试:sudo modprobe overlay sudo modprobe br_netfilter # 持久化这些模块,防止重启失效 echo "overlay" | sudo tee -a /etc/modules echo "br_netfilter" | sudo tee -a /etc/modules -
重启 Docker
sudo systemctl daemon-reload sudo systemctl restart docker
场景二:cgroup 驱动冲突(尤其是使用 systemd 时)
如果你是在较新的 Ubuntu 版本(如 20.04/22.04)上安装,Docker 默认期望使用 systemd 作为 cgroup 驱动,但有时配置不一致会导致启动失败。
解决方案:
-
创建/修改 Docker 配置文件
编辑/etc/docker/daemon.json(如果没有就新建):{ "exec-opts": ["native.cgroupdriver=systemd"], "storage-driver": "overlay2" }注意: 如果你的系统比较老或者使用了非 systemd 初始化,可能需要改为
cgroupfs,但在 Ubuntu 上推荐用systemd。 -
清理旧数据并重启
有时候旧的容器数据会导致冲突:sudo systemctl stop docker sudo rm -rf /var/lib/docker/* # ⚠️警告:这会删除所有现有容器和数据!生产环境慎用! sudo systemctl start docker
场景三:端口占用或残留进程
之前安装过 Docker 或其他容器工具(如 Podman, LXC),导致端口 2375/2376 被占用,或者旧进程没杀干净。
解决方案:
-
检查是否有其他进程占用 Docker socket
sudo lsof /var/run/docker.sock -
彻底杀死残留进程
sudo killall dockerd sudo killall containerd -
重新启动
sudo systemctl start docker
场景四:腾讯云特有坑 —— 安全组与内核参数
虽然这不会直接导致 Docker 服务起不来,但会导致你以为它没起来(比如容器内网不通,误判为服务异常)。另外,某些云厂商的内核裁剪可能导致 Docker 依赖的内核功能不可用。
-
检查内核版本
uname -r确保你的内核版本 >= 3.10(Ubuntu 20.04+ 默认内核肯定满足)。如果用的是非常老的 LTS 版本且未更新内核,可能需要升级内核。
-
检查安全组
登录腾讯云控制台,确认你的 CVM 实例绑定的安全组已经放行了相关端口(如 2375, 80, 443 等)。但这不影响 Docker 服务本身的启动状态。
终极方案:一键修复脚本(适用于大多数情况)
如果上面步骤太繁琐,可以运行这个经过验证的“清洗重装”脚本(请谨慎操作,备份重要数据):
#!/bin/bash
echo "停止 Docker 服务..."
sudo systemctl stop docker
sudo systemctl stop containerd
echo "卸载旧版本 Docker..."
sudo apt-get purge -y docker docker-engine docker.io containerd runc
echo "清理残留文件..."
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
echo "安装必要依赖..."
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
echo "添加 Docker GPG 密钥和仓库..."
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
echo "安装 Docker CE..."
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
echo "启动 Docker 服务..."
sudo systemctl start docker
sudo systemctl enable docker
echo "测试 Docker 是否正常运行..."
docker run hello-world
总结建议
- 先查日志:
journalctl -xeu docker.service是王道,别瞎猜。 - 优先排查 iptables 和内核模块:这是 Ubuntu 上 Docker 起不来的头号杀手。
- 避免混装:不要用
apt直接装docker.io,要用官方源装的docker-ce。 - 腾讯云用户注意:确保你的安全组策略没有阻止本地回环通信(虽然少见,但极端情况下会影响内部组件交互)。
如果以上都试了还是不行,大概率是你当前的 Ubuntu 版本与 Docker 最新版的兼容性有问题,建议降级 Docker 版本,或者升级 Ubuntu 到最新的 LTS 版本(22.04 或 24.04)。
云技术博客