在阿里云 ECS 上跑 Ubuntu 装 Docker,说实话,坑不算多,但“隐形”的障碍不少。很多新手或者从其他云厂商迁移过来的同学,容易在环境依赖、网络配置和权限管理这几个环节卡住。
结合我平时帮客户排查问题的经验,把最常见的几个问题梳理一下,全是干货,没有废话。
1. 内核版本过低导致的兼容性问题
这是最容易被忽视的基础问题。Docker 对 Linux 内核有硬性要求,特别是对于 cgroup v2 的支持以及某些网络驱动特性。
- 现象:安装后启动 daemon 失败,日志里提示
kernel version is too old或者cgroup not supported。 - 原因:Ubuntu 18.04 或更早版本的默认内核可能较旧。虽然 Docker 官方文档说支持 3.10+,但在生产环境中,尤其是使用 Overlay2 存储驱动时,建议内核版本至少在 4.4 以上,最好是 5.x 系列。
- 解决:
- 检查内核:
uname -r - 如果版本太低,不要手动去编译内核(太折腾且容易出 bug),直接升级 Ubuntu 到 20.04 LTS 或 22.04 LTS。阿里云提供的 Ubuntu 镜像通常都是经过裁剪优化的,直接用最新的 LTS 版本最稳妥。
- 检查内核:
2. APT 源配置错误与 GPG Key 缺失
国内用户最容易踩的坑就是换源和添加 Docker 官方源时的网络波动或证书问题。
-
现象:执行
apt-get update时报错NO_PUBKEY,或者下载速度极慢甚至超时。 -
原因:
- 直接使用 Docker 官方国际源,国内连接不稳定。
- 没有正确导入 Docker 的 GPG 密钥。
/etc/apt/sources.list.d/docker.list文件内容格式不对。
-
解决:
-
强烈建议使用阿里云镜像站。不要直接抄官网脚本,而是去阿里云开发者社区找到对应的 Docker CE 镜像源配置方法。
-
确保先安装
ca-certificates,curl,gnupg等基础工具。 -
命令流程大致如下(以 Ubuntu 22.04 为例):
# 1. 安装必要依赖 sudo apt-get install ca-certificates curl gnupg # 2. 添加 Docker 官方 GPG key (推荐使用阿里云镜像提速下载) 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 # 3. 添加仓库源 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 # 4. 更新并安装 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
3. systemd 与 Docker 服务的冲突
Ubuntu 默认使用 systemd 作为初始化系统,而 Docker 依赖于 systemd 来管理容器生命周期。
- 现象:
systemctl start docker报错,或者重启服务器后 Docker 服务无法自启。 - 原因:
- 最小化安装的 Ubuntu Server 可能没有预装完整的 systemd 环境(极少见,但存在)。
- 配置文件
/etc/docker/daemon.json语法错误(比如多了逗号、括号不匹配),导致 daemon 启动失败,进而影响 systemd 状态。
- 解决:
- 检查配置文件语法:
dockerd --validate或者直接查看journalctl -u docker.service -e获取详细错误信息。 - 确保安装了
containerd.io,因为现代 Docker 架构中,containerd 是核心运行时,必须独立安装。
- 检查配置文件语法:
4. 阿里云安全组与防火墙限制
这不是 Docker 本身的问题,但会导致你“以为” Docker 没装好或运行不正常。
- 现象:容器内启动了 Nginx 或 Web 服务,端口映射为 80:80,但网络访问不通。
- 原因:
- 阿里云安全组未放行:ECS 实例的安全组规则只放行了 SSH (22),忘了放行业务端口。
- UFW 防火墙拦截:Ubuntu 默认可能开启了 UFW (Uncomplicated Firewall),即使安全组放行了,主机内部的防火墙也可能拦截。
- 解决:
- 登录阿里云控制台,检查 ECS 实例的安全组入方向规则,确保目标端口已添加 TCP 协议放行。
- 在服务器上检查 UFW 状态:
sudo ufw status。如果是active,需要允许 Docker 流量:sudo ufw allow in on docker0或者直接关闭 UFW(测试环境可接受,生产环境建议配置精细规则)。
5. 非 root 用户权限问题
为了安全,不建议直接用 root 操作 Docker。
- 现象:普通用户执行
docker ps报错permission denied或cannot connect to the Docker daemon。 - 原因:Docker socket (
/var/run/docker.sock) 默认属于root用户组docker。普通用户不在该组内。 - 解决:
- 创建
docker用户组(如果不存在):sudo groupadd docker - 将当前用户加入该组:
sudo usermod -aG docker $USER - 关键一步:注销并重新登录,使组变更生效。否则当前终端会话仍无权限。
- 验证:
id查看是否包含docker组。
- 创建
6. 存储空间不足与 Overlay2 驱动
- 现象:拉取大镜像失败,或容器写入数据时报错
no space left on device。 - 原因:
- 阿里云 ECS 的系统盘(通常是
/挂载点)默认只有 40GB 左右,Docker 默认数据目录/var/lib/docker就在系统盘下。随着镜像和容器增多,空间迅速耗尽。 - 使用了错误的存储驱动。
- 阿里云 ECS 的系统盘(通常是
- 解决:
- 扩容数据盘:最佳实践是将 Docker 的数据目录指向一块额外的数据盘。例如,挂载一块 100GB 的云盘到
/data/docker,然后修改/etc/docker/daemon.json:{ "data-root": "/data/docker" }重启 Docker 服务即可。
- 清理无用资源:定期执行
docker system prune -a(谨慎操作,会删除所有未使用的镜像和容器)。
- 扩容数据盘:最佳实践是将 Docker 的数据目录指向一块额外的数据盘。例如,挂载一块 100GB 的云盘到
总结建议
在阿里云 Ubuntu 上装 Docker,核心原则是:用 LTS 版本 + 阿里云镜像源 + 合理分配磁盘空间 + 注意网络安全组。
只要避开上面这几个坑,整个过程其实非常顺畅。如果遇到具体报错,优先看 journalctl -u docker.service 和 docker info 的输出,大部分问题都能定位到。
云技术博客