一直使用 oracle 提供的免费 arm 云服务器,自己的 pc 又是 x86 架构,x86 构建出来的镜像不能在 arm 平台使用
使用 buildx 可以生成跨平台镜像,跨平台镜像就是同一个镜像名称,同一个 tag,但是 arm 机器和 amd64 机器拉下来的镜像 hash 是不一样的
创建 docker buildx 构建环境
这里的 driver 有两种,一种是 docker-container,一种是 docker,构建多平台版本只能使用 docker-container, –use 是将切换为默认
1
   | docker buildx create --use --name buildx --node buildx --driver-opt network=host
   | 
 
准备 qemu 模拟器
构建不通架构的镜像是通过 qemu 来模拟的,你会发现构建过程中,和 build 机器同架构的会构建很快,不同架构构建很慢。
1 2 3 4 5 6 7 8
   |  docker run --privileged --rm tonistiigi/binfmt --install all
 
  docker run --privileged --rm tonistiigi/binfmt --install arm64,riscv64,arm
 
  docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-aarch64
 
  | 
 
buildx 构建镜像
准备一个简单的 Dockerfile
1 2
   | FROM ubuntu CMD ["uname", "-i"]
   | 
 
1 2 3
   | docker buildx build --push \     --tag iuxt/ubuntu:latest \     --platform linux/amd64,linux/arm64 .
   | 
 
这个时候登录 dockerhub 查看

可以看到已经是多平台支持了。
1 2 3
   | docker run --rm iuxt/test
  > x86_64
   | 
 
正常构建的时候,也需要考虑到不同的架构区别,在构建命令里面做判断,比如
Dockerfile
1 2 3 4 5 6 7 8
   | FROM ubuntu:latest ADD build.sh / RUN /build.sh
  ENV REDIS_ADDR=127.0.0.1:6379 ENV REDIS_PASSWORD=111111
  CMD /redis_exporter -redis.addr ${REDIS_ADDR} -redis.password ${REDIS_PASSWORD}
   | 
 
build.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | apt update && apt install curl -y && apt clean all cd /tmp/ 
  case $(uname -m) in x86_64)     filename="redis_exporter-v1.37.0.linux-amd64.tar.gz"     bin="redis_exporter-v1.37.0.linux-amd64/redis_exporter"     ;; aarch64)     filename="redis_exporter-v1.37.0.linux-arm64.tar.gz"     bin="redis_exporter-v1.37.0.linux-arm64/redis_exporter"     ;; *)     echo "don't support $(uname -i)"     ;; esac
  curl -OL https://github.com/oliver006/redis_exporter/releases/download/v1.37.0/$filename tar xf $filename && mv $bin / rm -rf /tmp/*
   | 
 
docker buildx 常用命令
1 2 3 4 5 6 7 8
   |  docker buildx ls
 
  docker buildx rm mybuilder
 
  docker buildx use mybuilder
 
  |