在腾讯云 Ubuntu 实例上安装 Docker 失败,通常不是单一原因造成的,而是环境配置、依赖冲突或网络策略综合作用的结果。作为经常处理云原生部署的技术人员,我总结了几类最常见且“坑”最深的场景,按排查优先级排列如下:
1. 内核模块缺失或版本不匹配(最常见)
Docker 依赖于 Linux 内核的一些特性(如 cgroups, namespaces, overlay2 存储驱动等)。如果内核版本过低或缺少必要模块,安装或启动时会报错。
- 现象:
dockerd启动失败,日志提示kernel version is too old或overlay2: kernel does not support overlay fs。 - 原因:
- Ubuntu 18.04/20.04 默认内核可能较旧,而新版 Docker(20.10+)要求内核至少 4.4+。
- 腾讯云轻量应用服务器(Lighthouse)或某些 CVM 实例使用的是定制内核,可能禁用了部分功能。
- 解决思路:
- 检查内核版本:
uname -r。建议升级到腾讯云提供的最新 HWE(Hardware Enablement)内核。 - 确保加载了必要模块:
lsmod | grep overlay和lsmod | grep cgroup。如果没有,需要在/etc/modules中添加并重启。 - 注意:对于 Ubuntu 22.04+,通常无需额外操作,但务必确认系统已更新到最新补丁。
- 检查内核版本:
2. APT 源问题与 GPG 密钥过期
这是国内用户最容易遇到的“玄学”问题。Docker 官方仓库的 GPG 密钥定期轮换,如果本地缓存的密钥失效,会导致 apt-get update 失败。
- 现象:执行
sudo apt-get install docker-ce时报错NO_PUBKEY ...或403 Forbidden。 - 原因:
- Docker 官方文档中的
install.sh脚本拉取的 GPG 密钥可能因网络波动或密钥轮转而失效。 - 使用了非官方或镜像站同步延迟的源。
- Docker 官方文档中的
- 解决思路:
- 推荐方式:使用 Docker 官方推荐的脚本一键安装,它会自动处理密钥和源配置:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun(这里特意加了
--mirror Aliyun,因为阿里云镜像对 Docker 官方源的提速在国内更稳定,比直接连 Docker Hub 快得多。) - 手动修复:如果必须手动添加源,请确保从 Docker 官网获取最新的 GPG 密钥,并使用
curl而非wget(后者在某些环境下证书验证更严格)。
- 推荐方式:使用 Docker 官方推荐的脚本一键安装,它会自动处理密钥和源配置:
3. 端口占用与 systemd 服务冲突
Docker 需要绑定 0.0.0.0:2375 或 unix:///var/run/docker.sock。如果已有其他程序占用了这些资源,Docker 无法启动。
- 现象:
systemctl start docker后状态为failed,查看journalctl -u docker.service发现bind: address already in use。 - 常见冲突源:
- 之前安装的旧版
docker.io(Ubuntu 默认仓库里的包)未卸载干净。 - 其他容器管理工具(如 Podman、Containerd)正在运行。
- 某些安全软件(如云效、主机安全 agent)拦截了 socket 访问。
- 之前安装的旧版
- 解决思路:
- 彻底清理旧版:
sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get autoremove # 删除残留数据目录(谨慎操作!会丢失所有镜像和容器) sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd - 检查是否有进程监听 2375 端口:
netstat -tlnp | grep 2375。
- 彻底清理旧版:
4. 防火墙规则限制(UFW / iptables)
腾讯云 CVM 默认启用安全组,但实例内部也可能启用 UFW(Uncomplicated Firewall)或 iptables 规则,阻止 Docker 创建的网络桥接接口(如 docker0)通信。
- 现象:Docker 能启动,但容器之间无法互通,或宿主机无法访问容器端口。
- 原因:
- UFW 默认策略为 DENY,而 Docker 修改 iptables 规则时可能被 UFW 拦截。
iptables的 FORWARD 链策略为 DROP。
- 解决思路:
- 如果使用 UFW,需允许转发:
sudo ufw default allow routed sudo ufw enable - 或者,直接使用腾讯云控制台的安全组放行所需端口(如 80, 443, 自定义端口),这是更规范的做法,避免在实例内部做复杂防火墙配置。
- 如果使用 UFW,需允许转发:
5. 磁盘空间不足或 inode 耗尽
Docker 镜像和容器层会快速消耗磁盘空间,尤其是使用 overlay2 存储驱动时。
- 现象:
docker pull失败,提示no space left on device;或docker run失败,提示disk quota exceeded。 - 原因:
/var/lib/docker所在分区(通常是根分区/)空间不足。- 大量小文件导致 inode 耗尽(较少见,但存在)。
- 解决思路:
- 检查磁盘使用情况:
df -h和df -i。 - 清理无用镜像和容器:
docker system prune -a。 - 最佳实践:将 Docker 数据存储目录迁移到大容量数据盘。编辑
/etc/docker/daemon.json:{ "data-root": "/mnt/data/docker" }然后重启 Docker 服务。
- 检查磁盘使用情况:
6. 权限问题(非 root 用户运行)
虽然 Docker 可以配置为非 root 用户使用,但在 Ubuntu 上,新用户加入 docker 组后需要重新登录才能生效。
- 现象:普通用户执行
docker ps报permission denied。 - 解决思路:
- 确保用户已加入 docker 组:
sudo usermod -aG docker $USER - 关键步骤:注销并重新登录,或使用
newgrp docker刷新组权限。
- 确保用户已加入 docker 组:
✅ 推荐的标准安装流程(适用于腾讯云 Ubuntu 20.04/22.04)
为避免上述问题,建议采用以下标准化流程:
# 1. 卸载可能存在的旧版本
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
# 2. 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
# 3. 添加 Docker 官方 GPG 密钥(使用阿里云镜像提速)
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 4. 添加 Docker 仓库(使用阿里云镜像)
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5. 安装 Docker CE
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 6. 验证安装
sudo docker run hello-world
特别提醒:在腾讯云环境中,务必先在控制台安全组中放行你需要的端口,而不是依赖实例内部的防火墙。这样可以减少很多网络层面的排查成本。
云技术博客