基本環境#
オペレーティングシステム: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