【Docker・Windows】コンテナのCPUアーキテクチャを指定して起動するには?

docker-cpu システム開発

AWS が ARMアーキテクチャのCPU、AWS Graviton に大きく力を入れ始め、対応サービスも次々と増えてきたことにより、今後、CPUは x86_64(AMD64)アーキテクチャだけでなく、ARMアーキテクチャも主流の1つになっていくかと思われます。

とはいえ、クライアントマシンは依然として x86_64(AMD64)アーキテクチャが多数なので、サーバに ARMを採用すると、サーバマシンのアーキテクチャとクライアントマシンのアーキテクチャが異なる事になり、色々と手間がかかる事があります。

以下、x86_64(AMD64)アーキテクチャの Windows マシンにて Ubuntu 24 のコンテナを動かした状態です。

docker-cpu-01

docker-cpu-02

docker-cpu-03

以下、EC2 にて Ubuntu 24 を動かした状態です。

docker-cpu-04

docker-cpu-05

この状態だと、以下のような不都合が発生する事があります。

・クライアントマシンでビルドしたバイナリが、サーバで動かない。(要クロスコンパイル)
・クライアント側で用意したパッケージをインストールできない。

例えば、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のアーキテクチャを選択できます。

docker-cpu-06

-2-
「MANIFEST DIGEST」の項目の内容をコピーします。

docker-cpu-07

-3-
イメージファイルの取得元に、MANIFEST DIGEST からコピーした内容を記述します。
「コンテナ名@MANIFEST DIGEST」という記法になります。

docker-cpu-08

参考までに、pull コマンドの公式マニュアルです。

docker image pull | Docker Docs

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

NAMEの部分は、Ubuntu や php といった内容になり、「@」を MANIFEST DIGEST の前に記述します。

-4-
こんな感じで、ホストマシンの CPUアーキテクチャは x86_64(AMD64) で、コンテナのマシンを ARM64(AArch64)で動作させる事が出来ました。

docker-cpu-09

試しに AWS CLI の ARMアーキテクチャ版をインストールしてみたところ、正常にインストールできました。

docker-cpu-10

AWS CLI の最新バージョンのインストールまたは更新 – AWS Command Line Interface

コメント

タイトルとURLをコピーしました