1. 项目概述:为什么在 Debian 上装 Docker 不能“随便试试”?
在 Debian 上装 Docker,真不是敲几行 apt install 就能拍手收工的事。我见过太多人——尤其是刚从 Ubuntu 或 macOS 转过来的开发者——照着网上五花八门的教程一顿操作,结果装完连 docker run hello-world 都报错:“permission denied while trying to connect to the Docker daemon socket”。更糟的是,有人用 sudo apt install docker.io 装了个 20.10 版本(Debian 11 默认源里打包的),半年后才发现自己漏掉了整整三个安全补丁、两个关键的 cgroup v2 支持改进,以及对 --platform linux/amd64 的原生兼容。这不是小问题,是生产环境里随时可能引爆的哑弹。
Debian 的魅力恰恰在于它的克制和确定性:一次安装,三年稳定;一次配置,五年不改。但这份稳定性是有前提的——你得在安装那一刻就选对路径,而不是靠后期打补丁去填坑。它不像某些滚动发行版,允许你“先跑起来再说”,Debian 的哲学是“没想清楚,就别动”。所以这篇指南不讲“怎么最快装上”,而是讲“怎么装得最稳、最可维护、最经得起时间考验”。
核心关键词其实就三个: 官方源、overlay2、docker group 权限模型 。它们不是并列选项,而是一条逻辑闭环:官方源确保你拿到带完整 systemd 集成和 AppArmor profile 的二进制;overlay2 是 Debian 内核(5.10+)与 ext4/xfs 文件系统协同最优解,不是“能用就行”,而是“唯一推荐”;而 docker 用户组的添加,表面是省掉 sudo ,本质是把 root 权限的边界清晰地划在了 /var/run/docker.sock 这个文件上——这是整个安全模型的支点。后面所有硬化的动作,比如禁用 icc 、启用 no-new-privileges 、配置 bip ,都是在这个支点上做加法,而不是推倒重来。
适合谁读?如果你是 DevOps 工程师,要给客户部署一套跑 PostgreSQL + Redis + Nginx 的三节点集群,这篇就是你的安装检查清单;如果你是数据科学家,想在本地复现团队的 ML 训练环境,这篇能帮你避开 Permission denied 和 no space left on device 这两大拦路虎;甚至如果你只是个树莓派爱好者,想用 Debian Bookworm 跑 Home Assistant,文末的存储清理和内核模块加载技巧,能让你少重启三次。它不预设你懂 cgroups,但会告诉你 --memory=512m 后面到底发生了什么;它不假设你熟悉 AppArmor,但会手把手教你 apparmor_parser -r 执行时,系统底层究竟加载了哪几条策略规则。
我写这篇的底气,来自过去三年在金融、教育、IoT 三个行业的实际交付:给银行核心系统装 Docker,我们坚持用官方源 + 离线包校验;给高校实验室部署 200 台教学机,我们用 daemon.json 统一配置 live-restore=true 防止学生误关服务;给边缘网关刷 Debian,我们手动 modprobe bridge 并写入 /etc/modules ,因为默认内核没编译这个模块。这些不是“最佳实践”的空话,是踩过坑、赔过时间、被运维半夜打电话叫醒之后,沉淀下来的肌肉记忆。
2. 安装方法深度解析:四条路,每条都通向不同终点
2.1 方法一:官方 Docker 仓库(强烈推荐,生产环境唯一选择)
这不是“推荐”,而是 Debian 生产环境的 事实标准 。原因不在版本新旧,而在 更新机制的确定性 。Debian 自己的 docker.io 包,更新节奏由 Debian Release Team 控制,他们优先考虑的是整个发行版的 ABI 兼容性,而非 Docker Engine 的功能迭代。这意味着你装上的 docker.io ,可能永远停留在 20.10.12,哪怕 Docker 官方已发布 24.0.7 并修复了 CVE-2023-28843(一个容器逃逸漏洞)。而官方仓库的 docker-ce ,更新由 Docker 团队直接推送,安全公告(Security Advisory)发布后 48 小时内,新包就会出现在 https://download.docker.com/linux/debian/ 下,且每个包都经过 GPG 签名验证。
实操中,最关键的不是命令本身,而是 签名密钥的导入方式 。很多教程教人用 curl | sudo apt-key add - ,这在 Debian 11+ 已被废弃,因为 apt-key 会把密钥无差别地放进全局信任环,存在供应链风险。正确做法是使用 gpg --dearmor 生成二进制密钥环,并通过 signed-by 参数在 sources.list 中显式绑定:
# 第一步:下载并验证 GPG 公钥(注意 -fsSL 保证 SSL 和重定向)
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 第二步:生成 sources.list 条目(关键在 signed-by 参数)
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这里 $(dpkg --print-architecture) 输出 amd64 或 arm64 , $(lsb_release -cs) 输出 bookworm 或 bullseye ,确保你拉取的包与系统架构和发行版代号完全匹配。我试过在 bookworm 上错误地用了 bullseye 的源,结果 apt update 报 404 Not Found ,排查了半小时才意识到是代号写错了。
安装命令 sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin 里的四个包,各自承担不可替代的角色:
-
docker-ce:Docker Engine 核心守护进程(dockerd) -
docker-ce-cli:命令行工具(docker命令本身) -
containerd.io:独立的容器运行时,Docker Engine 依赖它来管理容器生命周期 -
docker-compose-plugin:新版 Compose(v2),作为docker compose子命令集成,取代了旧的docker-compose独立二进制
提示:不要试图用
apt install docker-compose单独装旧版 Compose。新版插件已深度集成,docker compose up的启动速度比旧版快 40%,且支持docker compose ls这类实时状态查询。
2.2 方法二:Debian 默认仓库(仅限临时测试,务必设为“一次性”)
sudo apt install docker.io 的诱惑力在于“一行解决”。但它背后是 Debian 维护者对稳定性的极致妥协。以 Debian 12 (Bookworm) 为例,其 docker.io 包版本是 20.10.12+dfsg1-3 ,而 Docker 官方最新稳定版是 24.0.7 。这中间隔了 12 个次要版本、37 个补丁版本、以及 200+ 个已知问题修复 。其中最关键的是 cgroup v2 支持: docker.io 在 Bookworm 中默认仍使用 cgroup v1 ,而 docker-ce 24.x 已强制要求 cgroup v2 ,这对内存限制( --memory )的精度有数量级提升。
我曾在一个客


528

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



