1. 为什么在 Ubuntu 上装 Docker 不是“点下一步”那么简单
很多人第一次打开终端敲 sudo apt install docker.io ,看到“Setting up docker.io (20.10.21-0ubuntu1~22.04.1) …”就以为大功告成。结果一运行 docker run hello-world ,弹出一堆红色报错: Permission denied while trying to connect to the Docker daemon socket ,或者更隐蔽的 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 。我见过太多人卡在这一步,反复重装、查文档、翻论坛,最后发现根本不是安装失败,而是 Ubuntu 的权限模型、服务状态、用户组配置这三道关卡没过——它们像三把锁,缺一把都打不开 Docker 的门。
Docker 在 Ubuntu 上的安装,本质不是“装一个软件”,而是 构建一套容器运行时基础设施 。它需要内核支持(cgroups/v2、namespaces)、守护进程(dockerd)持续监听、Unix 套接字文件(/var/run/docker.sock)的读写权限、以及用户身份与 docker 组的绑定。这些环节环环相扣,任何一个脱节,都会导致“明明装了却用不了”的假象。比如你用 apt 装的是社区维护的 docker.io 包,它版本通常比官方 Docker Engine 滞后 6–12 个月;而如果你用 curl 下载官方 .deb 包手动安装,又可能因依赖冲突(如 containerd 版本不匹配)导致 systemctl start docker 失败。更麻烦的是 WSL2 环境—— wsl --install 太慢?那是因为它默认下载的是完整 Windows 子系统镜像,而 Docker Desktop for Windows 实际上是在 WSL2 发行版里再起一层 dockerd ,形成“Windows → WSL2 → Ubuntu → dockerd”的四层嵌套,任何一层的虚拟化支持未启用(比如 BIOS 里 Intel VT-x/AMD-V 关闭),整个链路就直接断掉。
所以这篇指南不叫“Ubuntu 安装 Docker 教程”,而叫“Ubuntu 上 Docker 运行时基础设施的可信构建”。它不只告诉你命令,更要让你明白:
- 为什么
sudo usermod -aG docker $USER这条命令必须重启 shell 才生效(因为用户组信息在登录时由 PAM 模块一次性加载,newgrp docker只能临时切换,无法继承到子进程); - 为什么
docker info报WARNING: No swap limit support不是错误,而是 Ubuntu 默认禁用 cgroup v2 swap 控制(需改/etc/default/grub添加cgroup_enable=memory swapaccount=1并update-grub && reboot); - 为什么
command 'nvidia-smi' not found和 Docker 无关,但当你想跑 GPU 容器时,它会成为你第一个拦路虎(NVIDIA 驱动必须在宿主机安装,且nvidia-container-toolkit必须与驱动版本严格匹配)。
这不是一个“复制粘贴就能跑”的脚本,而是一份帮你建立判断力的操作地图。接下来,我会带你从底层机制出发,逐层验证、逐层加固,确保每一步都可观察、可回溯、可解释。
2. 两种安装路径的本质差异:APT 仓库 vs 官方二进制包
在 Ubuntu 上装 Docker,主流就两条路:走系统包管理器( apt )或走 Docker 官方源( apt.docker.com )。很多人觉得“官方源肯定更新快”,但实际踩坑后才发现, 快不等于稳,新不等于适配 。我做过横向测试:在 Ubuntu 22.04 LTS 上, apt install docker.io 安装的是 20.10.21 版本,而 curl -fsSL https://get.docker.com | sh 安装的是 24.0.7。表面看新版多了 3 年功能,但实测发现,24.0.7 的 dockerd 默认启用 cgroup v2,而 Ubuntu 22.04 的内核(5.15)对 cgroup v2 的 swap 限制支持不完整,导致 docker run --memory-swap=2g nginx 直接报错 invalid argument 。这时候你得手动降级 dockerd 或修改内核参数——而 docker.io 包早已预编译适配好这套环境,开箱即用。
2.1 APT 仓库安装:安全、稳定、但版本滞后
docker.io 是 Ubuntu 官方维护的包,托管在 archive.ubuntu.com 。它的优势在于:
- 依赖自动解析 :
apt会检查containerd,runc,iptables等依赖是否满足,并自动安装兼容版本; - 安全更新同步 :只要
sudo apt update && sudo apt upgrade,Docker 相关漏洞补丁会随系统更新一起下发; - 无网络代理烦恼 :国内用户不用额外配置镜像源,
apt默认走清华、中科大等高校镜像站。
但代价也很明显:
- 版本锁定 :Ubuntu 22.04 的
docker.io永远停留在 20.10.x 分支,无法使用 23.x+ 的docker buildx bake多平台构建、docker composev2 原生命令等特性; - 功能阉割 :
docker.io移除了docker desktop相关组件(如 GUI、Kubernetes 集成),纯命令行导向; - 调试信息缺失 :日志中看不到
dockerd启动时的详细初始化步骤,排查failed to start类问题更困难。
执行流程如下(以 Ubuntu 22.04 为例):
# 1. 更新索引(确保获取最新包信息)
sudo apt update
# 2. 安装 docker.io 及其依赖(注意:它会自动装 containerd.io 和 runc)
sudo apt install -y docker.io
# 3. 启用并启动服务(关键!很多人漏掉这步)
sudo systemctl enable docker
sudo systemctl start docker
# 4. 验证服务状态(不是看是否 active,而是看是否 healthy)
sudo systemctl status docker --no-pager | grep -E "(Active:|Loaded:|Main PID:)"
# 正常输出应为:Active: active (running) since ...; Main PID: 12345
提示:如果
systemctl status docker显示active (exited),说明服务启动后立即退出。此时必须查日志:sudo journalctl -u docker -n 50 --no-pager。常见原因是/etc/docker/daemon.json语法错误,或data-root指向的磁盘已满。
2.2 官方二进制包安装:最新、完整、但需手动维护
Docker 官方提供两种方式:一键脚本( get.docker.com )和手动添加 APT 源。前者方便但不可审计,后者可控但步骤多。我推荐后者,因为你能清晰看到每一步在做什么:
# 1. 卸载旧版(避免冲突)
sudo apt remove -y docker docker-engine docker.io containerd runc
# 2. 安装必要依赖(注意:curl 和 ca-certificates 必须先装,否则后续 HTTPS 失败)
sudo apt update &


115

被折叠的 条评论
为什么被折叠?



