最近在研究修改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.service
1
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
就行了。