参考

buildx(github 安装QEMU文档)

build(Docker 官网文档)

QEMU(github安装文档)

构建多平台镜像

有3种方式:

  1. 使用QEMU模拟器。
  2. 使用原生的节点来构建,通过docker context命令来切换,连接不同的docker server。参考
  3. 通过使用--platform参数在Dockerfile里,来实现不同平台的镜像编译。(不知道是我不会用,还是不好用)

正文

开启 buildx

  • 编辑 /etc/docker/daemon.json,添加"experimental": true选项

    [root@]# cat /etc/docker/daemon.json 
    {
      "experimental": true
    }
    
  • 重启 docker

    systemctl daemon-reload
    systemctl restart docker
    
  • 检测是否成功开启,true表示开启了

    [root@]# docker version -f '{{.Server.Experimental}}'
    true
    

安装QEMU

  • 安装

    [root@]# docker run --privileged --rm tonistiigi/binfmt --install all
    
  • 快速测试

    [root@]# docker run --rm arm64v8/alpine uname -a
    WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64) and no specific platform was requested
    Linux 869e16c62dd8 5.10.18-amd64-desktop #1 SMP Mon Mar 1 17:09:41 CST 2021 aarch64 Linux
    

buildx构建amd和arm平台的两种镜像,并在各自的环境下使用

  • Dockerfile

    FROM ubuntu
    
  • 登录到docker,要推送镜像到 自己的 dockerhub 仓库

    [root@]#  docker login 
    
  • 添加一个 docker driver,会自动添加配置项,具体内部操作原因现在也还不清楚

    [root@]# docker buildx ls
    [root@]# docker buildx create --name my-buildx 
    [root@]# docker buildx use my-buildx
    

    上面几个命令的详细输出:

    # 查看 buildx 的支持驱动
    [root@]# docker buildx ls
    NAME/NODE DRIVER/ENDPOINT STATUS  PLATFORMS
    default * docker                  
      default default         running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
    
    # 创建driver,自定义名称 my-buildx
    [root@]# docker buildx create --name my-buildx 
    my-buildx
    
    # 再次查看 drivers
    [root@]# docker buildx ls
    NAME/NODE    DRIVER/ENDPOINT  STATUS PLATFORMS
    my-buildx    docker-container                     
      my-buildx0 unix:///var/run/docker.sock inactive 
    default *    docker                   
      default    default          running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
    
    # 切换使用 my-buildx
    [root@]# docker buildx use my-buildx
    
    # 再次查看
    [root@]# docker buildx ls
    NAME/NODE    DRIVER/ENDPOINT  STATUS PLATFORMS
    my-buildx    docker-container                     
      my-buildx0 unix:///var/run/docker.sock inactive 
    default      docker                   
      default    default          running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
    
  • 打镜像并推送

    # qiangge80800880 是我的用户名,镜像打完,并推送到docker hub
    [root@]# docker buildx build --platform linux/arm64,linux/amd64 -t qiangge80800880/ubuntu-arm-test:v1 . --push
    
  • 再次查看 buildx drivers

    [root@]# docker buildx ls
    

    详细输出:

    [root@]# docker buildx ls
    NAME/NODE     DRIVER/ENDPOINT             STATUS PLATFORMS
    my-buildx *  docker-container                    
      my-buildx0 unix:///var/run/docker.sock running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
    default       docker                              
      default     default                     running linux/amd64, linux/386, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/arm/v7, linux/arm/v6
    
  • DockerHub可以看到有一个镜像tag有两个架构
    在这里插入图片描述

在 x86和arm平台使用此镜像测试

  • amd

    [root@]# uname -m
    x86_64
    
    [root@]# docker run -it  qiangge80800880/ubuntu-arm-test:v1 bash
    Unable to find image 'qiangge80800880/ubuntu-arm-test:v1' locally
    v1: Pulling from qiangge80800880/ubuntu-arm-test
    a70d879fa598: Pull complete 
    c4394a92d1f8: Pull complete 
    10e6159c56c0: Pull complete 
    Digest: sha256:a60e1f9dba411d8bf9c8f06147af7ea587cf539df082ce59cf63331761241cb2
    Status: Downloaded newer image for qiangge80800880/ubuntu-arm-test:v1
    root@0ddbf490e73b:/# 
    
  • arm

    root@ks-allinone:~# uname -m
    aarch64
    
    root@ks-allinone:~# docker run -it  qiangge80800880/ubuntu-arm-test:v1 bash
    Unable to find image 'qiangge80800880/ubuntu-arm-test:v1' locally
    v1: Pulling from qiangge80800880/ubuntu-arm-test
    2b20d1a80822: Pull complete 
    f4e993c4ee9a: Pull complete 
    c2befefc5146: Pull complete 
    Digest: sha256:a60e1f9dba411d8bf9c8f06147af7ea587cf539df082ce59cf63331761241cb2
    Status: Downloaded newer image for qiangge80800880/ubuntu-arm-test:v1
    root@68b90968bcc7:/# 
    

QEMU 卸载

docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-aarch64

PS

如果帮助到你的话,点个赞鼓励下,欢迎加入我的置顶博客的javaweb交流群,不搞带课推广,让我们一起向诗靠拢。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐