利用go编译器源码编译docker

最近在研究修改docker源码实现自定义功能,自然需要先学会源码编译。在网上找到许多教程都是利用docker环境进行源码编译,但是编译完之后,使用起来是个问题。相较之下,利用go编译器,直接编译源码,生成二进制文件的方法,方便很多。下面就来介绍一下具体如何操作。

使用APT安装Docker

要想使用自定义功能的docker,原理是编译出二进制文件之后,替换原来系统使用的docker二进制文件。因此,在介绍如何源码编译之前,需要给系统安装docker。我使用的是Ubuntu 18.04 LTS版本,因此后续的一切介绍,都是基于这个环境。首先,给Ubuntu安装docker CE,具体参考这篇文章

安装go编译器

具体版本有什么限制我不太确定,推荐是用官方编译使用的版本一样,也就是go1.10.8,但是我这里用了go1.12.7,也一样可行。

具体如何安装go编译器,以及配置GOROOTGOPATH参考我的这篇博客: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
2
cd $GOPATH/src/github.com/docker/docker
VERSION=testbuild DOCKER_GITCOMMIT=1 ./hack/make.sh binary

注意

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Client:
Version: 18.09.7
API version: 1.39
Go version: go1.10.8
Git commit: 2d0083d
Built: Thu Jun 27 17:56:23 2019
OS/Arch: linux/amd64
Experimental: false

Server:
Engine:
Version: testbuild
API version: 1.41 (minimum version 1.12)
Go version: go1.12.7
Git commit: 1
Built: Tue Aug 27 05:35:56 2019
OS/Arch: linux/amd64
Experimental: true
containerd:
Version: 1.2.6
GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
runc:
Version: 1.0.0-rc8
GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f
docker-init:
Version: 0.18.0
GitCommit: fec3683

看到Server一栏中,引擎版本已经更新成testbuild

启用Experimental功能

有时候,你测试自己开发的docker功能,会提示未启用实验(Experimental)功能,要开启它,只需要修改/etc/docker/daemon.json文件,添加"experimental": true (注意这行代码需要放在一个花括号{}里面)。

然后重启服务

1
sudo service docker restart

这时候再sudo docker version,看到Server一栏中,有Experimental: true就行了。

参考文章

0%