AWS が ARMアーキテクチャのCPU、AWS Graviton に大きく力を入れ始め、対応サービスも次々と増えてきたことにより、今後、CPUは x86_64(AMD64)アーキテクチャだけでなく、ARMアーキテクチャも主流の1つになっていくかと思われます。
とはいえ、クライアントマシンは依然として x86_64(AMD64)アーキテクチャが多数なので、サーバに ARMを採用すると、サーバマシンのアーキテクチャとクライアントマシンのアーキテクチャが異なる事になり、色々と手間がかかる事があります。
以下、x86_64(AMD64)アーキテクチャの Windows マシンにて Ubuntu 24 のコンテナを動かした状態です。
以下、EC2 にて Ubuntu 24 を動かした状態です。
この状態だと、以下のような不都合が発生する事があります。
・クライアントマシンでビルドしたバイナリが、サーバで動かない。(要クロスコンパイル)
・クライアント側で用意したパッケージをインストールできない。
例えば、Go や C# は、実行にはビルドが必要なコンパイル型の言語ですが、生成されるバイナリファイルは CPUのアーキテクチャによって異なります。
そのため、x86_64(AMD64)アーキテクチャの CPUを使用したマシンでビルドしたバイナリファイルは、ARMアーキテクチャの CPUを使用したマシンでは動かないため、ローカルマシンで動作させる用と、サーバマシンで動作させる用の、2種類のコンパイルが必要になる事があります。
また、多くのライブラリやユーティリティは CPU アーキテクチャごとに異なるバイナリが提供されているため、インストール時のファイル取得元が異なることがあります。
例えば、AWS CLI をインストールする時、x86_64(AMD64)では awscli-exe-linux-x86_64.zip を、ARM64(AArch64)では awscli-exe-linux-aarch64.zip をダウンロードします。
こんな場合、ローカルマシンでコンテナを使用する時には、サーバマシンのCPUアーキテクチャと同一になるように設定しておくと、後でややこしい問題に遭遇する可能性を減らすことができます。
-1-
Docker Hubからコンテナを選択する時、CPUのアーキテクチャを選択できます。
-2-
「MANIFEST DIGEST」の項目の内容をコピーします。
-3-
イメージファイルの取得元に、MANIFEST DIGEST からコピーした内容を記述します。
「コンテナ名@MANIFEST DIGEST」という記法になります。
参考までに、pull コマンドの公式マニュアルです。
docker image pull | Docker Docs
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
NAMEの部分は、Ubuntu や php といった内容になり、「@」を MANIFEST DIGEST の前に記述します。
-4-
こんな感じで、ホストマシンの CPUアーキテクチャは x86_64(AMD64) で、コンテナのマシンを ARM64(AArch64)で動作させる事が出来ました。
試しに AWS CLI の ARMアーキテクチャ版をインストールしてみたところ、正常にインストールできました。
コメント