banner
云野阁

云野阁

闲云野鹤,八方逍遥

x86服务器构建ARM架构docker镜像

基础环境#

操作系统:openEuler 22.03 (LTS-SP2)

软件:Docker-26.1.2 、Docker Compose-v2.27.0

安装 Docker#

(1)配置 yum 源下载 docker。

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/\$releasever/7/g' /etc/yum.repos.d/docker-ce.repo

(2)安装最新版 docker 和 docker compose。

# 下载依赖及docker、docker compose
yum install -container-selinux
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 

(3)修改 Docker 的数据目录为 “/data/dockerData”,并配置 docker 镜像源。

echo '{
  "data-root": "/data/dockerData",
 "registry-mirrors": ["https://dockerhub.icu"]
}' > /etc/docker/daemon.json

(4)启动 Docker 服务,并设置为开机自启动。

systemctl start docker
systemctl enable docker

使用 register 注册可支持的架构解析器#

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

查看二进制格式的解释器是否启用,显示enabled,即为启用。

ls  /proc/sys/fs/binfmt_misc/ 
cat /proc/sys/fs/binfmt_misc/qemu-aarch64

拉取基础 arm 镜像#

此处以 httpd 镜像为例,在 x86 服务器上拉取 arm64 架构的 httpd 镜像,其中--platform=arm64指定拉取的镜像架构位 arm64,--platform=amd64则是拉取 x86 架构的镜像。

docker pull --platform=arm64 httpd:latest

定义 Dockerfile,创建新镜像#

通过使用 Dockerfile 创建新 arm 镜像的方式有两种,一种是直接下载qemu-aarch64-static程序,在构建镜像时直接拷贝进镜像中;另一种是拉取multiarch/qemu-user-static:x86_64-aarch64镜像,通过多阶段构建,从multiarch/qemu-user-static:x86_64-aarch64镜像中复制 qemu-aarch64-static程序 到 httpd 镜像中。

方式一:下载程序,直接复制#

(1)在下载qemu-aarch64-static程序时,可直接下载该程序,也可先下载其压缩包,再解压。

# 直接下载程序(推荐)
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static
# 先下载其压缩包,再解压
wget https://github.com/multiarch/qemu-user-static/releases/download/v7.2.0-1/qemu-aarch64-static.tar.gz
tar -vzxf qemu-aarch64-static.tar.gz
# 赋予可执行权限
chmod +x /usr/bin/qemu-aarch64-static

(2)创建 Dockerfile 文件,在 httpd 镜像的基础上构建新镜像,qemu-aarch64-static程序必须和 Dockerfile 文件在同一目录下。Dockerfile 文件的具体内容如下:

FROM httpd:latest
# 将qemu-aarch64-static程序拷贝进镜像的/usr/bin/目录
COPY ./qemu-aarch64-static /usr/bin/qemu-aarch64-static
# 将测试的html文件拷贝到镜像的相关目录
COPY ./index.html  /usr/local/apache2/htdocs/

(3)指定构建的架构,执行命令开始构建新镜像,构建完成后,查看新镜像的架构并导出为 tar 文件,在 arm 服务器上进行验证。

# 构建镜像
docker build --platform arm64 -t httpd:1.00 .
# 查看新镜像的架构
 docker inspect httpd:1.00 | grep Architecture
# 导出镜像为tar文件
docker save -o httpd.tar httpd:1.00

方式二:通过镜像多重构建复制#

(1)创建 Dockerfile 文件,分两个阶段构建新镜像,第一阶段从 multiarch/qemu-user-static 镜像中获取qemu-aarch64-static程序,第二阶段在 httpd 镜像的基础上构建新镜像,Dockerfile 文件的具体内容如下:

# 第一阶段:从multiarch/qemu-user-static镜像中获取qemu-aarch64-static程序  
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
# 第二阶段:在httpd镜像的基础上构建新镜像
FROM httpd:latest
# 将qemu-aarch64-static程序拷贝进镜像的/usr/bin/目录
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin/
# 将测试的html文件拷贝到镜像的相关目录
COPY ./index.html  /usr/local/apache2/htdocs/

(2)指定构建的架构,执行命令开始构建新镜像,构建完成后,查看新镜像的架构并导出为 tar 文件,在 arm 服务器上进行验证。

# 构建镜像
docker build --platform arm64 -t httpd:1.00 .
# 查看新镜像的架构
 docker inspect httpd:1.00 | grep Architecture
# 导出镜像为tar文件
docker save -o httpd.tar httpd:1.00

扩展:通过镜像多重构建复制也可用该 docker 命令直接替代。

docker build --rm --platform arm64 -t "httpd:1.00" -<<EOF
FROM multiarch/qemu-user-static:x86_64-aarch64 as qemu
FROM httpd:latest
COPY --from=qemu /usr/bin/qemu-aarch64-static /usr/bin
COPY ./index.html  /usr/local/apache2/htdocs/
EOF

在 arm 服务器上验证#

将新的镜像 tar 文件导入到 arm 服务器上,创建新容器验证镜像是否可用及镜像中的 html 文件是否生效。

# 导入新镜像
docker load -i httpd.tar
# 查看新镜像的架构
docker inspect httpd:1.00 | grep Architecture
# 运行新容器
docker run -itd --name test httpd:1.00
# 查看运行状态
docker ps
# 查看容器IP
docker inspect test | grep IPAddress
# 访问测试上传的html文件是否生效
curl 172.17.0.2
加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。