一直使用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查看

docker镜像
可以看到已经是多平台支持了。

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 -i) 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
# 查看所有的builder列表
docker buildx ls

# 删除创建的builder
docker buildx rm mybuilder

# 切换默认builder
docker buildx use mybuilder