最近要修改docker的源码做一些开发,但是docker的官网给的编译方式是用docker提供的dockerfile文件编译一个docker 镜像然后在这个容器里面通过脚步编译docker。我们都知道1.11以后的docker实际上有docker dockerd docker-containerd runc 几个进程组成。如何我修改一次就要全部编译一遍多麻烦。所以我觉定自己go build 出docker的几个可执行文件。
1. git clone github.com/moby/moby 现在docker 的代码从docker/docker 迁移到了 /moby/moby。当然你编译之前还需要安装go。这个golang 官网都有按照说明安装就好。
2. 编译docker 就是docker client 。代码在 cmd/docker 下,我这里是1.13.x 分支。在你的gopath 路径下还有一个docker/docker 的目录你要保持 docker下的分支和moby 下的一致。不然在moby 下build 会出错。然后 go build 。会生成docker bin文件。
3.编译 dockerd 编译dockerd 的时候需要安装许多包。可以根据错误提示安装需要的包。例如我是fedora25 。 go build 会报 libdevmapper.h 缺少。然后 dnf install device-mapper-devel.x86_6 。
4. 编译containerd . git clone github.com/docker/containerd . 编译containerd 使用containerd 的make file 来编译生成。 编译完以后会生成 containerd-shim ,containerd。 具体参考 containerd 的README。
5.编译生成runc 。runc是最终启动容器的工具,可以说容器的核心。实际上没有 dockerd 也是发送命令到containerd containerd 再 启动 containd-shim containerd-shim 再调用runc 来启动容器 停止容器等容器运行生命周期的各种操作。其实没有前几个进程,可以直接发送数据给runc 启动容器。当然了要符合oci的标准。具体可以参考runc项目的readme runc 现在在 https://github.com/opencontainers/runc。docker 变曾经的libcontainer贡献出来改了个名字变成cncf下的runc 项目。 runc 编译 就go build 一下。具体看github的 readme 写的非常详细。
现在docker 需要的5个bin文件全部都编译生成完成。 分别是docker dockerd containerd containerd-shim 和runc 。编译这些可执行文件主要是为了方便我调试docker 代码。后面我会修改docker dockerd containerd 等 。从一条docker run 看 数据如何在 这几个进程间流动。如何互相调用。