努力
加油

阿里云上的Ubuntu系统安装Docker时常见问题有哪些?

在阿里云 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,或者下载速度极慢甚至超时。

  • 原因:

    1. 直接使用 Docker 官方国际源,国内连接不稳定。
    2. 没有正确导入 Docker 的 GPG 密钥。
    3. /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 服务无法自启。
  • 原因:
    1. 最小化安装的 Ubuntu Server 可能没有预装完整的 systemd 环境(极少见,但存在)。
    2. 配置文件 /etc/docker/daemon.json 语法错误(比如多了逗号、括号不匹配),导致 daemon 启动失败,进而影响 systemd 状态。
  • 解决:
    • 检查配置文件语法:dockerd --validate 或者直接查看 journalctl -u docker.service -e 获取详细错误信息。
    • 确保安装了 containerd.io,因为现代 Docker 架构中,containerd 是核心运行时,必须独立安装。

4. 阿里云安全组与防火墙限制

这不是 Docker 本身的问题,但会导致你“以为” Docker 没装好或运行不正常。

  • 现象:容器内启动了 Nginx 或 Web 服务,端口映射为 80:80,但网络访问不通。
  • 原因:
    1. 阿里云安全组未放行:ECS 实例的安全组规则只放行了 SSH (22),忘了放行业务端口。
    2. 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。
  • 原因:
    1. 阿里云 ECS 的系统盘(通常是 / 挂载点)默认只有 40GB 左右,Docker 默认数据目录 /var/lib/docker 就在系统盘下。随着镜像和容器增多,空间迅速耗尽。
    2. 使用了错误的存储驱动。
  • 解决:
    • 扩容数据盘:最佳实践是将 Docker 的数据目录指向一块额外的数据盘。例如,挂载一块 100GB 的云盘到 /data/docker,然后修改 /etc/docker/daemon.json:
      {
        "data-root": "/data/docker"
      }

      重启 Docker 服务即可。

    • 清理无用资源:定期执行 docker system prune -a(谨慎操作,会删除所有未使用的镜像和容器)。

总结建议

在阿里云 Ubuntu 上装 Docker,核心原则是:用 LTS 版本 + 阿里云镜像源 + 合理分配磁盘空间 + 注意网络安全组。

只要避开上面这几个坑,整个过程其实非常顺畅。如果遇到具体报错,优先看 journalctl -u docker.service 和 docker info 的输出,大部分问题都能定位到。