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 イメージを作成する方法は 2 つあります。一つはqemu-aarch64-staticプログラムを直接ダウンロードし、イメージを構築する際に直接コピーする方法です。もう一つはmultiarch/qemu-user-static:x86_64-aarch64イメージをプルし、マルチステージビルドを通じてmultiarch/qemu-user-static:x86_64-aarch64イメージからqemu-aarch64-staticプログラムをhttpdイメージにコピーする方法です。

方法 1:プログラムをダウンロードし、直接コピーする#

(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

方法 2:イメージのマルチビルドを通じてコピーする#

(1)Dockerfile ファイルを作成し、2 つのステージで新しいイメージを構築します。第一ステージでは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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。