最近在研究修改docker源码实现自定义功能,自然需要先学会源码编译。在网上找到许多教程都是利用docker环境进行源码编译,但是编译完之后,使用起来是个问题。相较之下,利用go编译器,直接编译源码,生成二进制文件的方法,方便很多。下面就来介绍一下具体如何操作。
¶使用APT安装Docker
要想使用自定义功能的docker,原理是编译出二进制文件之后,替换原来系统使用的docker二进制文件。因此,在介绍如何源码编译之前,需要给系统安装docker。我使用的是Ubuntu 18.04 LTS版本,因此后续的一切介绍,都是基于这个环境。首先,给Ubuntu安装docker CE,具体参考这篇文章。
¶安装go编译器
具体版本有什么限制我不太确定,推荐是用官方编译使用的版本一样,也就是go1.10.8,但是我这里用了go1.12.7,也一样可行。
具体如何安装go编译器,以及配置GOROOT和GOPATH参考我的这篇博客:Ubuntu 18.04 源码安装go编译器
¶安装编译库
构建前,安装必要的库
| 1 | apt-get install gcc pkg-config btrfs-tools | 
¶下载源码
从docker的github项目网址下载任意版本的源码,将解压出来的文件夹重命名为docker。将docker目录移动到$GOPATH/src/github.com/docker/目录下。
¶开始构建
打开终端,进入到$GOPATH/src/github.com/docker/docker目录,执行编译指令
| 1 | cd $GOPATH/src/github.com/docker/docker | 
注意:
- VERSION=xxx是指定构建后的docker版本,比如直接安装,会显示- 18.09.3,此处我们将版本命名为- testbuild。
- 在编译指令中,你还可以选择储存引擎,只需要再命令前加上DOCKER_GRAPHDRIVER=overlay2就可以了
- 构建完成后,生成的二进制文件储存在$GOPATH/src/github.com/docker/docker/bundles/binary-daemon目录下,名字是dockerd。使用ls -l命令可以看到这里已经创建了软连接dockerd -> dockerd-testbuild
¶替换docker启动文件
接下来就是最后一步,用生成的dockerd替换掉当前系统的docker启动文件。首先,停止系统中正在运行的docker引擎。
| 1 | systemctl stop docker | 
- 
找到docker服务文件的位置 在终端输入 1 systemctl cat docker.service 你会在输出的第一行,看到 1 /lib/systemd/system/docker.service 这就是服务文件的位置了,按 q退出终端中查看docker.service的程序
- 
修改 docker.service1 sudo vim /lib/systemd/system/docker.service 找到 ExecStart=/usr/bin/dockerd xxx,将其中的/usr/bin.dockerd替换成刚刚生成的二进制文件,也就是$GOPATH/src/github.com/docker/docker/bundles/binary-daemon/dockerd注意:这里的 $GOPATH要用绝对路径,每个人设置的路径是不同的,如果你不清楚自己是真的,可以在终端输入以下指令查看1 echo $GOPATH 
¶重载及启动docker服务
替换完成后,终端输入
| 1 | systemctl daemon-reload | 
重载完成后,就可以启动引擎了
| 1 | systemctl start docker | 
验证是否替换成功,执行sudo docker version
| 1 | Client: | 
看到Server一栏中,引擎版本已经更新成testbuild了
¶启用Experimental功能
有时候,你测试自己开发的docker功能,会提示未启用实验(Experimental)功能,要开启它,只需要修改/etc/docker/daemon.json文件,添加"experimental": true (注意这行代码需要放在一个花括号{}里面)。
然后重启服务
| 1 | sudo service docker restart | 
这时候再sudo docker version,看到Server一栏中,有Experimental: true就行了。