docker源码编译 linux_「docker」交叉编译适用于ARM平台的Docker源码

本文详细介绍了如何在x86环境下,为ARM平台交叉编译Docker源码。首先,下载并运行x86的docker官方镜像获取源码,然后在ARM设备上使用修改后的Dockerfile编译环境镜像。通过修改软件源、Go工具包地址和执行权限,构建编译环境。接着,执行编译脚本生成静态二进制文件,最后将编译好的Docker二进制文件部署到ARM设备并进行功能测试。
摘要由CSDN通过智能技术生成

前言

docker的编译环境实际是创建了一个docker容器,在docker容器内对代码进行编译。创建该docker容器的过程中,会安装一些编译docker源码需要的第三方库以及go语言环境。此处需要注意的是,创建该docker容器的硬件平台需与最终的docker二进制文件运行平台保持一致,比如,docker二进制文件运行在aarch64(或ARM32v7)硬件上,则需在aarch64(或ARM32v7)硬件平台上构建该docker容器,并且该硬件平台应可以正常联网,这些要求的依据是在后面需要下载安装大量硬件平台相关的lib。

Pull下来的镜像需要是对应当前run镜像的系统类型的,比如,在x86上制作的镜像只能在x86系统上run ,而在arm平台上则不可以运行,否则run的时候回提示如下图所示的error。图. Docker镜像的运行环境与其制作环境应一致

1. 下载镜像dockercore/docker:17.05Dockercore/docker:17.05,该镜像最近更新时间 April 18, 2017 03:06 PM

docker-dev:1.9,该镜像最近更新时间 March 30, 2016 06:53 AM

其中,根据镜像docker-dev:1.9页面上的描述,该镜像已经被镜像Dockercore/docker:17.05替代,如下图所示 docker pull dockercore/docker:17.05

2. 运行x86_docker官方镜像

运行镜像dockercore/docker:17.05的目的是获取该镜像容器内go/src/http://github.com/docker/docker目录下文件用于编译docker二进制文件。

docker run -i --privileged -e BUILDFLAGS -e KEEPBUNDLE -e DOCKER_BUILD_GOGC -e DOCKER_BUILD_PKGS -e DOCKER_CLIENTONLY -e DOCKER_DEBUG -e DOCKER_EXPERIMENTAL -e DOCKER_GITCOMMIT -e DOCKER_GRAPHDRIVER=devicemapper -e DOCKER_INCREMENTAL_BINARY -e DOCKER_REMAP_ROOT -e DOCKER_STORAGE_OPTS -e DOCKER_USERLANDPROXY -e TESTDIRS -e TESTFLAGS -e TIMEOUT -v "../bundles:/go/src/github.com/docker/docker/bundles" -t "dockercore/docker:17.05" bash

上述命令中的“=devicemapper”用于指定新build出来的docker容器的文件系统。进入镜像后,copy出容器内的 go/src/http://github.com/docker/docker目录内容(如下图)到宿主机win10,等待后续用于在aarch64硬件平台上构建docker容器。图. docker目录内容清单

3. 运行aarch64 Linux镜像并执行编译

在树莓派arm硬件平台上,提前下载镜像,下载的镜像会在后面编译过程中被使用,这2个镜像可以选其中一个下载即可,armhf/debian为例。arm32v7/debian,该镜像最近更新时间 April 18, 2017 03:06 PM

armhf/debian,该镜像最近更新时间 March 30, 2016 06:53 AM

将copy出的go/src/http://github.com/docker/docker目录内容放在树莓派arm硬件平台上,该目录中的文件清单图上图所示。这里需要重点关注文件Dockerfile.armhf、文件夹hack的内容。文件 Dockerfile.armhf,

文件夹hack,

Dockerfile.armhf 用来 build 出一个用于编译 docker 的容器,该容器内会安装一些编译docker源码需要的第三方库以及go语言环境。由于大陆网络的限制,需要对Dockerfile.armhf 修改如下:

(1)修改Linux的软件源;

(2)修改go工具包的下载地址;

(3)根据情况,修改 .sh 文件的执行权限。

完成上述内容的修改之后,在文件 Dockerfile.armhf 所在目录执行如下命令构建docker的编译环境镜像。

docker build -t docker -f Dockerfile.armhf .

从上述指令名称来看,构建结束后会生成名为docker的镜像;但是由于本次试验过程中的网络等原因,本次试验构建RUN在执行 RUN /tmp/install-binaries.sh (详见 Dockerfile.armhf 中的RUN命令)之前行就结束了,并且会相应的生产一个Docker Image,因此,需要我们手动运行(run)该Image起来一个Container(假设该容器名是arm_compile_docker),将上图(图. docker目录内容清单)所示的binaries-commit、install-binaries.sh文件拷贝到/tmp目录下并执行脚本

/tmp/install-binaries.sh tomlv vndr runc containerd tini proxy

下一步,编译docker的二进制文件。

docker 目录下的 hack/make.sh复制到 /tmp 目录,并执行脚本

hack/make.sh binary

生产docker相关的静态二进制文件(这里,binary也可以用动态dynbinary代替);生成的docker二进制文件如下图所示。

最后,根据个人的需求,copy相关的静态编译文件或动态编译文件到目标系统内。图. 交叉编译生产的docker相关的二进制文件

4. 运行编译好的 Docker 二进制文件

以静态(binary)编译Docker二进制文件为例,将 ./binary 目录下的Docker二进制文件copy到arm硬件平台 /bin 目录下。

首先,需要在linux系统中增加docker用户组:

sudo groupadd -f docker

然后,运行dockerd进程时,可以指定docker容器使用的文件系统类型,比如vfs、ovrelay、aufs、devicemapper等,默认使用的是 ovrelay。图. Docker容器指定文件系统类型

可以查看docker client 和 server的版本信息。图. Docker的版本

在文件/etc/docker/deamon.json中可以修改Docker获取镜像的仓库地址,推荐修改并使用国内的镜像加速地址。图. 修改并使用国内的docker镜像仓库加速地址

最后,可以使用 docker pull 镜像到本地。

// # 下面的几行命令可以用于对编译好的 docker 二进制文件进行功能测试。

// #

// # 下载 busybox 镜像

docker pull busybox

// # 查看本地已经下载的镜像

docker images

// # 运行本地 busybox 镜像的容器

docker run -it busybox

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值