源码编译安装 Docker Engine 需先有可用 Docker 环境,克隆 docker/docker-ce 仓库并切换至目标版本分支,在 components/engine 目录执行 make binary 编译,替换 /usr/bin/dockerd 和 /usr/bin/docker 后重启服务即可。
源码编译安装 docker engine 是一种高度可控的方式,适合需要定制功能、调试内核行为、或在特殊环境(如离线、老旧系统、安全加固场景)下部署的用户。但它不是日常开发首选——过程长、依赖多、容易出错,且官方明确建议生产环境优先使用二进制包或包管理器安装。
前提:必须先有可用的 Docker 运行环境
这是最容易被忽略的关键点:Docker 官方构建流程本身依赖 Docker 容器来完成编译。也就是说,你得先装好一个能跑起来的 Docker Engine(哪怕是最简版本),才能编译出新的 Docker Engine。
- 推荐先用二进制方式快速装一个基础版(如
docker-29.1.4.tgz),确保dockerd和dockerCLI 可用 - 验证命令:
docker version能显示 client/server 信息,systemctl status docker显示 active (running) - 若尚未安装,可参考 WSL2 Ubuntu 下手动安装二进制包的流程(含 containerd 配置、iptables、daemon.json 设置等)
获取并准备源码
官方源码已迁移至 docker/docker-ce 仓库,不再维护旧的 docker/docker 单体仓库。
- 克隆源码:
git clone https://github.com/docker/docker-ce.git - 切换到目标版本分支,例如稳定版:
cd docker-ce && git checkout v29.1.4 - 源码根目录下有
components/engine/,这才是真正的 Docker daemon 源码路径 - 确保 Go 环境就绪(Docker 29.x 要求 Go ≥ 1.21):
go version应输出类似go version go1.21.13 linux/amd64
执行编译与安装
进入 components/engine 目录后,Docker 使用标准 Makefile 流程,不依赖外部构建工具链。
- 运行
make binary:它会拉起一个临时构建容器,编译出bin/dockerd和bin/docker - 编译产物默认生成在项目根目录的
bundles/binary-daemon/下(如dockerd-29.1.4) - 替换系统二进制:
sudo cp -f bundles/binary-daemon/dockerd-* /usr/bin/dockerd,同理更新/usr/bin/docker - 重启服务:
sudo systemctl restart docker,再用docker version确认 server 版本已更新
注意事项与常见问题
源码编译不是“一键替换”,很多细节决定成败。
- 不要跳过 containerd:即使你重编了 dockerd,containerd 仍需独立运行且版本需兼容(Docker 29.x 推荐 containerd ≥ 1.7.0)
-
配置文件不变:
/etc/docker/daemon.json不受影响,但若启用了 experimental 功能,需确认源码中对应开关已开启 -
ARG 错误是旧坑:如果你在 Dockerfile 中看到
Unknown instruction: ARG,说明构建容器用的是太老的 Docker 版本(如 1.8),应升级宿主 Docker 再试 -
存储驱动冲突:首次启动新编译的 dockerd 时,若提示
"/var/lib/docker" contains several valid graphdrivers,需手动指定驱动,例如加参数-s overlay2或清理残留目录


















