1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > docker image aarch64 x86_64_「docker」交叉编译适用于ARM平台的Docker源码

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

时间:2021-08-07 22:39:51

相关推荐

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

前言

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.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容器。

图. 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相关的静态编译文件或动态编译文件到目标系统内。

图. 交叉编译生产的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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。