前言
docker的编译环境实际是创建了一个docker容器,在docker容器内对代码进行编译。创建该docker容器的过程中,会安装一些编译docker源码需要的第三方库以及go语言环境。此处需要注意的是,创建该docker容器的硬件平台需与最终的docker二进制文件运行平台保持一致,比如,docker二进制文件运行在aarch64(或ARM32v7)硬件上,则需在aarch64(或ARM32v7)硬件平台上构建该docker容器,并且该硬件平台应可以正常联网,这些要求的依据是在后面需要下载安装大量硬件平台相关的lib。
Pull下来的镜像需要是对应当前run镜像的系统类型的,比如,在x86上制作的镜像只能在x86系统上run ,而在arm平台上则不可以运行,否则run的时候回提示如下图所示的error。
1. 下载镜像dockercore/docker:17.05
在 / 上有2个可以用于编译 docker的容器:
Dockercore/docker:17.05 ,该镜像最近更新时间 April 18, 03:06 PMdocker-dev:1.9 ,该镜像最近更新时间 March 30, 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//docker/docker目录下文件用于编译docker二进制文件。
DOCKER_GRAPHDRIVER
上述命令中的“=devicemapper”用于指定新build出来的docker容器的文件系统。进入镜像后,copy出容器内的 go/src//docker/docker目录内容(如下图)到宿主机win10,等待后续用于在aarch64硬件平台上构建docker容器。
3. 运行aarch64 Linux镜像并执行编译
在树莓派arm硬件平台上,提前下载镜像,下载的镜像会在后面编译过程中被使用,这2个镜像可以选其中一个下载即可,armhf/debian为例。
arm32v7/debian ,该镜像最近更新时间 April 18, 03:06 PMarmhf/debian ,该镜像最近更新时间 March 30, 06:53 AM
将copy出的go/src//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相关的静态编译文件或动态编译文件到目标系统内。
4. 运行编译好的 Docker 二进制文件
以静态(binary)编译Docker二进制文件为例,将 ./binary 目录下的Docker二进制文件copy到arm硬件平台 /bin 目录下。
首先,需要在linux系统中增加docker用户组:
sudo groupadd -f docker
然后,运行dockerd进程时,可以指定docker容器使用的文件系统类型,比如vfs、ovrelay、aufs、devicemapper等,默认使用的是 ovrelay。
可以查看docker client 和 server的版本信息。
在文件/etc/docker/deamon.json中可以修改Docker获取镜像的仓库地址,推荐修改并使用国内的镜像加速地址。
最后,可以使用 docker pull 镜像到本地。
// # 下面的几行命令可以用于对编译好的 docker 二进制文件进行功能测试。// #// # 下载 busybox 镜像docker pull busybox// # 查看本地已经下载的镜像docker images// # 运行本地 busybox 镜像的容器docker run -it busybox