基礎環境#
操作系統: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