現在のDcokerはマルチCPUアーキテクチャーに対応していますから、コンテナーがマルチCPUアーキテクチャーに対応している場合であれば、docker pullするだけで実行するホストの環境に合わせたイメージがダウンロードされます。
そこで、Raspberry Pi 4BでRaspberry Pi OS 64bit版を実行している場合には”arm64”となり、Windows上でDocker Desktop for Windowsの場合には”amd64″となっています。
$ docker inspect --format='{{.Architecture}}' alpine
arm64
$ docker inspect --format='{{.Architecture}}' alpine
amd64
ここで、Docker Desktop for WindowsまたはDocker Desktop for Macの場合には、最初からbuildxが有効になっていてマルチCPUアーキテクチャーのコンテナーを作成することができるようになっています。例えば、Windowsの場合次のようなアーキテクチャーに対応しています。
$ docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS PLATFORMS
desktop-linux protocol not available
default * docker
default default running linux/amd64, linux/arm64, linux/riscv64, linux/ppc64le, linux/s390x, linux/386, linux/arm/v7, linux/arm/v6
今日は、ビルドの話ではなくて実行についてのお話なのですが、実はマルチCPUに対応してコンテナーを実行することもできてしまいます。
例えばWindowsの場合であれば、通常のコンテナーは次のように実行することができます。
$ docker run alpine uname -m
x86_64
ここに、例えばRaspberry Piでdocker pullしたalpineのコンテナーイメージをdocker saveしたものをdocker loadして実行することもできてしまいます。
$ docker run alpine:aarch64 uname -m
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64) and no specific platform was requested
aarch64
警告が表示されていますが、もちろんホストであるWindowsと実行しているコンテナーのアーキテクチャーが違っているためであり、platformが定義されていないことが原因となっています。
そこで、platformを指定して実行すると次のようになります。
もちろん、最初からplatformを指定することで該当のアーキテクチャーのコンテナーがプルされてから実行されます。この方法であれば、これまで書いていたようなタグを使う必要もなくなるでしょう。
$ docker run --platform linux/arm64 alpine:aarch64 uname -m
aarch64
実用的にはどうだろうという感じですが、MacもM1としてARMアーキテクチャーになってきていることもあり緊急避難的には使えそうな感じがしています。