基础环境

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

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

安装Docker

(1)配置yum源下载docker。

1
2
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。

1
2
3
# 下载依赖及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镜像源。

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

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

1
2
systemctl start docker
systemctl enable docker

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

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

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

1
2
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架构的镜像。

1
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程序时,可直接下载该程序,也可先下载其压缩包,再解压。

1
2
3
4
5
6
7
# 直接下载程序(推荐)
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文件的具体内容如下:

1
2
3
4
5
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服务器上进行验证。

1
2
3
4
5
6
# 构建镜像
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文件的具体内容如下:

1
2
3
4
5
6
7
8
# 第一阶段:从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服务器上进行验证。

1
2
3
4
5
6
# 构建镜像
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命令直接替代。

1
2
3
4
5
6
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文件是否生效。

1
2
3
4
5
6
7
8
9
10
11
12
# 导入新镜像
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