Dockerではマルチプラットフォームとしてエミュレーションの機能を使いながら別のアーキテクチャーのDockerコンテナーを動かすことができるようになっています。
この状況については、Docker公式ドキュメントのMulti-platform imagesで説明されていますが、「Docker Desktopではbinfmt_miscマルチアーキテクチャー対応により、arm、mips、ppc64le、s390xなどのコンテナーを実行できます」とされています。
MacにインストールしているDocker for Desktopで様子を見てみると、次のようにさまざまなアーキテクチャーに対応している様子が表示されます。
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running 20.10.20 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
desktop-linux docker
desktop-linux desktop-linux running 20.10.20 linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
同様にして、Raspberry Pi 4にインストールしたDockerで様子をみると次のようになっています。
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running 20.10.21 linux/arm64, linux/arm/v7, linux/arm/v6
この状態では、armの32-bitと64-bitにしか対応していません。
そこで、QEMUのパッケージを追加インストールします。
$ sudo apt install -y qemu-user-static
インストール後に、もう一度様子を見てみます。
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default * docker
default default running 20.10.21 linux/arm64, linux/arm/v7, linux/arm/v6, linux/amd64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386
今度は、linux/amd64を始めとして幾つかのアーキテクチャーが追加されました。
実行してみましょう。最初は、そのまま実行してみます。
$ docker run --rm ubuntu uname -a
Linux 2e0ec90c1e66 5.15.61-v8+ #1579 SMP PREEMPT Fri Aug 26 11:16:44 BST 2022 aarch64 aarch64 aarch64 GNU/Linux
Raspberry Pi 4にRaspberry Pi OSの64-bit版をインストールしていますからLinux/aarch64として表示されました。
次に、Linux/amd64のDockerコンテナーを実行してみます。
$ docker run --rm --platform=linux/amd64 ubuntu uname -a
Linux caaf7b74ff80 5.15.61-v8+ #1579 SMP PREEMPT Fri Aug 26 11:16:44 BST 2022 x86_64 x86_64 x86_64 GNU/Linux
確かに、Linux/x86_64 (= amd64) のDockerコンテナーを実行していることがわかります。
念のために、Dockerコンテナーのアーキテクチャーを確認してみます。
$ docker inspect --format='{{.Architecture}}' ubuntu
amd64
しっかり”amd64″となっています。
実際には、実行時にQEMUでのエミュレーションが入ることからパフォーマンスなどは期待出来ないと思われますがDockerの便利さの一つではないかと思われます。
参考: 2022/01/07 DockerのマルチCPUアーキテクチャー対応