x86平台利用qemu-user-static实现arm64平台docker镜像的运行和构建

转载改写来源:https://www.cnblogs.com/chen2ha/p/17180287.html

docker 版本大于19.03.9才支持--platform参数,且默认没有开启,需要手动开启。

查看并开启experimental功能

查看是否开启(默认是未开启,即返回flase)

docker info | grep -i 'experimental'

修改daemon.json配置文件,增加下面的参数,开启experimental功能

Experimental: true

下面的/etc/docker/daemon.json文件仅供参考

{
  "experimental": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}

重启docker,验证生效

systemctl restart docker
docker info | grep -i 'experimental'

拉取其它平台的镜像

查看当前的环境平台,返回x86_64

uname -m 

拉取一个arm64平台的镜像

docker pull --platform arm64 debian:12

查看镜像使用的平台

docker inspect debian:12 | grep -i 'Architecture'

预期返回

    "Architecture": "arm64",

注:
如果不加 --platform参数,默认拉取自己当前cpu平台的镜像
如果本地有相同tag的镜像,只是平台不同的情况下,需要注意区分tag,不然直接docker pull就会覆盖掉之前的镜像,之前的镜像tag会变为

准备qemu-user-static

注册可支持的架构解释器,不指定cpu平台,使用register来注册可支持的架构解析器

docker run --rm \
    --privileged \
    multiarch/qemu-user-static:register \
    --reset

执行成功后,会返回类似如下的结果来表明支持的架构解析器

Setting /usr/bin/qemu-alpha-static as binfmt interpreter for alpha
Setting /usr/bin/qemu-arm-static as binfmt interpreter for arm
Setting /usr/bin/qemu-armeb-static as binfmt interpreter for armeb
Setting /usr/bin/qemu-sparc-static as binfmt interpreter for sparc
Setting /usr/bin/qemu-sparc32plus-static as binfmt interpreter for sparc32plus
Setting /usr/bin/qemu-sparc64-static as binfmt interpreter for sparc64
Setting /usr/bin/qemu-ppc-static as binfmt interpreter for ppc
Setting /usr/bin/qemu-ppc64-static as binfmt interpreter for ppc64
Setting /usr/bin/qemu-ppc64le-static as binfmt interpreter for ppc64le
Setting /usr/bin/qemu-m68k-static as binfmt interpreter for m68k
Setting /usr/bin/qemu-mips-static as binfmt interpreter for mips
Setting /usr/bin/qemu-mipsel-static as binfmt interpreter for mipsel
Setting /usr/bin/qemu-mipsn32-static as binfmt interpreter for mipsn32
Setting /usr/bin/qemu-mipsn32el-static as binfmt interpreter for mipsn32el
Setting /usr/bin/qemu-mips64-static as binfmt interpreter for mips64
Setting /usr/bin/qemu-mips64el-static as binfmt interpreter for mips64el
Setting /usr/bin/qemu-sh4-static as binfmt interpreter for sh4
Setting /usr/bin/qemu-sh4eb-static as binfmt interpreter for sh4eb
Setting /usr/bin/qemu-s390x-static as binfmt interpreter for s390x
Setting /usr/bin/qemu-aarch64-static as binfmt interpreter for aarch64
Setting /usr/bin/qemu-aarch64_be-static as binfmt interpreter for aarch64_be
Setting /usr/bin/qemu-hppa-static as binfmt interpreter for hppa
Setting /usr/bin/qemu-riscv32-static as binfmt interpreter for riscv32
Setting /usr/bin/qemu-riscv64-static as binfmt interpreter for riscv64
Setting /usr/bin/qemu-xtensa-static as binfmt interpreter for xtensa
Setting /usr/bin/qemu-xtensaeb-static as binfmt interpreter for xtensaeb
Setting /usr/bin/qemu-microblaze-static as binfmt interpreter for microblaze
Setting /usr/bin/qemu-microblazeel-static as binfmt interpreter for microblazeel
Setting /usr/bin/qemu-or1k-static as binfmt interpreter for or1k
Setting /usr/bin/qemu-hexagon-static as binfmt interpreter for hexagon

增加arm64镜像的支持
下载qemu-aarch64-static (地址:https://github.com/multiarch/qemu-user-static/releases )

wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static \
    && chmod +x qemu-aarch64-static \
    && mv qemu-aarch64-static /usr/bin/

启动容器时将qemu-aarch64-static带入到容器内
注:qemu-aarch64-static二进制文件的路径,可以自定义路径,只需要带入到容器内的/usr/bin目录下

docker run -t \
    --rm \
    --platform arm64 \
    -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
    debian:12 \
    uname -m

正常情况下,返回 aarch64 后容器就会被销毁了(因为加了 --rm 参数)

后台运行arm64容器

docker run -d \
    --rm \
    --platform arm64 \
    -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static \
    --name debian12 \
    debian:12 \
    sleep 3600

进入容器,容器内的命令均为aarch64的

docker exec -it debian12 sh

注:跨平台运行镜像,不能保证完全兼容运行。

创建一个arm64镜像

  • 准备一个Dockerfile
  • 需要将qemu-aarch64-static带入到容器内的/usr/bin目录下可以实现构建

Dockerfile

FROM scratch
ADD base_sys.tar.gz /
ADD docker_entrypoint.sh /usr/local/bin/
ADD qemu-aarch64-static /usr/bin/
RUN groupadd -g 1000 gbasedbt && useradd -u 1000 -g gbasedbt -d /home/gbase -m -s /bin/bash gbasedbt
ADD v8.8_3513x13_csdk_arm64.tar.gz /
EXPOSE 9088
ENTRYPOINT ["docker_entrypoint.sh"]

开始构建

docker build \
    --platform arm64 \
    -t liaosnet/gbase8s:v8.8_3513x13_csdk_arm64 .

构建完成后,可以使用下面的命令验证容器内的平台是否是 arm64

docker inspect liaosnet/gbase8s:v8.8_3513x13_csdk_arm64 | grep -i 'Architecture'

标签: none

添加新评论