背景

  1. x86环境下构建arm架构的docker镜像。实现交叉编译。<br /> Docker 19.03+ 版本中可以使用 $ docker buildx build 命令使用 BuildKit 构建镜像。该命令支持 --platform 参数可以同时构建支持多种系统架构的 Docker 镜像,大大简化了构建步骤。<br />Docker for Linux 不支持构建 arm 架构镜像,我们可以运行一个新的容器让其支持该特性,Docker 桌面版(windwosmac)无需进行此项设置。

必要条件

  • docker 必须已经安装完成,docker版本大于Docker 19.03+
  • 安装 Docker >= 19.03: 该 Docker 版本包含 buildx。但是我这docker 没有buildx。所以才有下面buildx下载安装的步骤

    安装 buildx

    buildx官方安装教程
  1. 进入 https://github.com/docker/buildx/releases ,找到适合自己版本
  2. 选择一个版本并下载二进制文件

    例如,对于 CentOS 或 Red Hat Enterprise Linux: ```bash

    curl下载方式

    curl -LJO “https://objects.githubusercontent.com/github-production-release-asset-2e65be/177210627/6768dc51-6b08-465a-98b2-5111d4acae2e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220309%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220309T100234Z&X-Amz-Expires=300&X-Amz-Signature=ad7778ae8bca199c2dd9addca9a2ff5f6c1e46e4c099a7e2c3b060baf9fabadd&X-Amz-SignedHeaders=host&actor_id=29112372&key_id=0&repo_id=177210627&response-content-disposition=attachment%3B%20filename%3Dbuildx-v0.8.0-rc1.linux-amd64&response-content-type=application%2Foctet-stream

wget 下载

wget https://objects.githubusercontent.com/github-production-release-asset-2e65be/177210627/6768dc51-6b08-465a-98b2-5111d4acae2e?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20220309%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20220309T100234Z&X-Amz-Expires=300&X-Amz-Signature=ad7778ae8bca199c2dd9addca9a2ff5f6c1e46e4c099a7e2c3b060baf9fabadd&X-Amz-SignedHeaders=host&actor_id=29112372&key_id=0&repo_id=177210627&response-content-disposition=attachment%3B%20filename%3Dbuildx-v0.8.0-rc1.linux-amd64&response-content-type=application%2Foctet-stream

  1. 3. 重命名下载的二进制文件并将其复制到与您的操作系统匹配的目标位置:
  2. 例如:
  3. ```bash
  4. # 进入刚才下载二进制的目录
  5. cd /data/gitlab_runner
  6. mv buildx-v0.8.0-rc1.linux-amd64 docker-buildx
  7. # 查看有没有 /root/.docker/cli-plugins 这个目录,没有就创建一个
  8. mv docker-buildx /root/.docker/cli-plugins/docker-buildx
  1. 在 Unix 环境中,可能还需要使用以下命令使其可执行chmod +x:

    1. chmod +x ~ /.docker/cli-plugins/docker-buildx
  2. 打开docker 实验项配置

experimental=true,另外我还补充了几个国内源,做镜像加速。如下配置:

  1. {
  2. "data-root": "/data/docker",
  3. "experimental": true,
  4. "fixed-cidr-v6": "fc00:100::/24",
  5. "ip6tables": true,
  6. "ipv6": true,
  7. "live-restore": true,
  8. "log-driver": "json-file",
  9. "log-opts": {
  10. "max-file": "3",
  11. "max-size": "10m"
  12. },
  13. "registry-mirrors": [
  14. "https://docker.mirrors.ustc.edu.cn",
  15. "https://l10nt4hq.mirror.aliyuncs.com",
  16. "https://hub-mirror.c.163.com",
  17. "http://f1361db2.m.daocloud.io",
  18. "https://fwvjnv59.mirror.aliyuncs.com"
  19. ]
  20. }
  1. 重启docker服务(注意:必须重启,否则不生效)
    1. systemctl daemon-reload
    2. systemctl restart docker
    3. # 验证buildx是否安装成功
    4. docker buildx version

    新建 builder 实例

    在内核中使用 QEMU 仿真支持来进行多架构镜像构建:
    此映像可用于为您的节点不具有本机支持的架构安装模拟器,以便您可以为任何架构运行和构建容器。
    这个镜像不是官方来源社区,可靠性有待测试
    tonistiigi/binfmt镜像使用教程https://hub.docker.com/r/tonistiigi/binfmt
    1. # 安装模拟器(用于多平台镜像构建)
    2. $ docker run --rm --privileged tonistiigi/binfmt:latest --install all
    打印输出支持的目标平台类似于,
    1. {
    2. "supported": [
    3. "linux/amd64",
    4. "linux/arm64",
    5. "linux/riscv64",
    6. "linux/ppc64le",
    7. "linux/s390x",
    8. "linux/386",
    9. "linux/arm/v7",
    10. "linux/arm/v6"
    11. ],
    12. "emulators": [
    13. "qemu-aarch64",
    14. "qemu-arm",
    15. "qemu-ppc64le",
    16. "qemu-riscv64",
    17. "qemu-s390x"
    18. ]
    19. }
    注:这个是官方镜像,没有上面这个镜像使用方便。docker/binfmt 可以参考网址:https://hub.docker.com/r/docker/binfmt/tags 获取最新镜像。

由于 Docker 默认的 builder 实例不支持同时指定多个 —platform,我们必须首先创建一个新的 builder 实例。同时由于国内拉取镜像较缓慢,我们可以使用配置了 镜像加速地址 dockerpracticesig/buildkit:master 镜像替换官方镜像。
如果你有私有的镜像加速器,可以基于 https://github.com/docker-practice/buildx 构建自己的 buildkit 镜像并使用它。
因为我是物理机,直接使用下方的 国内环境命令

  1. # 适用于国内环境
  2. docker buildx create --use --name=panda_builder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master
  3. # 适用于腾讯云环境(腾讯云主机、coding.net 持续集成)
  4. docker buildx create --use --name=panda_builder --driver docker-container --driver-opt image=dockerpracticesig/buildkit:master-tencent
  5. # 使用默认镜像
  6. docker buildx create --name panda_builder --driver docker-container
  7. # 使用新创建好的 builder 实例
  8. docker buildx use panda_builder

查看已有的 builder 实例:可以看到【panda_builder】支持的目标平台

  1. [root@localhost update]# docker buildx ls
  2. NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
  3. panda_builder * docker-container
  4. panda_builder0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/mips64le, linux/mips64, linux/arm/v7, linux/arm/v6
  5. default docker
  6. default default running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6

新建Dockerfile文件

要想构建多种系统架构的镜像,还需要一个支持的 Dockerfile 文件,这里面多架构镜像最主要的就是基础镜像和安装的软件都需要支持多架构。
以下是一个示例的 Dockerfile 文件,该 Dockerfile 文件内容如下:

  1. FROM python:3.7-slim-buster
  2. # ARG DEBIAN_FRONTEND=noninteractive
  3. ENV DEBIAN_FRONTEND noninteractive
  4. # 用代理大大提高下载境外包的速度
  5. ENV http_proxy http://10.0.0.250:7890
  6. ENV https_proxy http://10.0.0.250:7890
  7. LABEL maintainer="panda <123456789@qq.com>" description="基础镜像"
  8. RUN DEBIAN_FRONTEND=noninteractive apt update -y && apt-get update -y && \
  9. apt install -y inetutils-ping dnsutils net-tools iproute2 curl && \
  10. apt install -y gcc g++ unixodbc unixodbc-dev gnupg gnupg2 gnupg1 && \
  11. apt-get install -y vim dos2unix procps zip wget libatlas-base-dev

交叉编译

进入到刚创建的dockerfile文件目录,开始交叉编译。因为我这里是私服地址,没有做权限,不需要登录。如果要推送到dockerhub可能还需要docker login 进行登录操作

  1. docker buildx build -t {docker registry ip:port}/foo:latest --platform=linux/arm,linux/arm64,linux/amd64 -f ./Dockerfile . --push

参考引用

跨平台构建 Docker 镜像新姿势,x86、arm 一把梭 https://cloud.tencent.com/developer/article/1543689?fileGuid=0l3NVKX0BgflYN3R 使用 buildx 构建多种系统架构支持的 Docker 镜像 https://yeasy.gitbook.io/docker_practice/buildx/multi-arch-images 使用 Docker Buildx 构建多种系统架构镜像 https://www.51cto.com/article/678858.html buildx 安装 https://github.com/docker/buildx 随 Docker 镜像分发的跨平台模拟器集合。 https://hub.docker.com/r/tonistiigi/binfmt 官方buildx文档 https://docs.docker.com/buildx/working-with-buildx/ 国内buildkit加速镜像 https://github.com/docker-practice/buildx