必须先安装 Docker 运行时,因源码编译在容器内进行;克隆 moby/moby 仓库,执行 make build 和 make binary 编译 daemon,产物为静态二进制文件,需手动复制并替换原 dockerd。

直接编译 Docker 源码不是常规安装方式,但适合需要定制 daemon 行为、调试底层逻辑或适配特殊环境的场景。它依赖宿主机已有 Docker 环境,并在容器内完成构建,整个过程对网络、Go 版本和系统依赖较敏感。
必须先装好 Docker 运行时
源码编译本身要在 Docker 容器里跑,所以宿主机必须已安装并能正常运行 Docker(不能只装 docker.io,推荐用官方 docker-ce):
- Ubuntu/Debian:用
apt install docker-ce docker-ce-cli containerd.io安装完整版,避免docker.io因版本过旧导致ARG指令报错 - 确认可用:
sudo docker run hello-world成功输出即表示环境就绪 - 普通用户需加入
docker组才能免 sudo 执行命令,否则后续 make 步骤会失败
拉取正确源码仓库
Docker 项目已拆分为 client 和 daemon 两部分,编译 daemon(即 dockerd)需克隆 moby/moby:
-
git clone https://github.com/moby/moby.git—— 这是核心 daemon 源码 - 如需同时编译
docker命令行客户端,额外执行:git clone https://github.com/docker/cli.git - 注意:不要用
docker/docker旧地址,该仓库已归档,不再更新
执行编译流程
进入 moby 目录后,标准流程分两步,全部由 Makefile 驱动:
-
make build:启动一个临时构建容器,按Dockerfile安装 Go、C 工具链等依赖;这步耗时长且易因国内网络中断(如访问 golang.org 或 GitHub assets 失败) -
make binary:在上一步生成的镜像中运行hack/make.sh binary,最终调用go build编译出dockerd、containerd等二进制文件,输出在bundles/子目录下 - 若只想编译 daemon 不编 client,可跳过 cli 仓库,
make binary默认只产出 daemon 相关 binary
安装与验证
编译产物是静态链接的二进制文件,无需传统 make install:
- 手动复制:
sudo cp bundles/latest/binary-daemon/dockerd /usr/local/bin/ - 替换 systemd service 文件(如有),或直接运行:
sudo dockerd --debug查看是否启动成功 - 验证:
sudo systemctl restart docker && docker version应显示本地编译的 commit hash - 注意:不要覆盖正在运行的 docker daemon,建议先停掉原服务再替换二进制


















