Apple SiliconとDockerの互換性(platform)
はじめに
このページではApple SiliconのチップでDockerを利用する際に--platform
オプションを使用する必要がある場合について記述します。
Apple SiliconとDockerの互換性について
Apple Silicon(M1、M2など)のMacでは、CPUアーキテクチャが従来のIntelベースのx86_64からARM64ベースに変更されました。このため、Dockerコンテナを実行する際に、使用するベースイメージやビルド設定によっては、互換性の問題が発生する場合があります。
--platform
オプションの概要
1. --platform
オプションは、Dockerイメージを実行する際に使用するプラットフォーム(CPUアーキテクチャ)を指定するために使用されます。Apple Siliconでは、x86_64ベースのイメージを実行する場合に、明示的にプラットフォームを指定しなければならないことがあります。
例えば、次のように指定します。
docker run --platform linux/amd64 イメージ名
このコマンドは、ARM64アーキテクチャのMac上でx86_64(amd64)アーキテクチャのイメージをエミュレーションして実行することを意味します。
--platform
を使用するか
2. どのような場合にApple SiliconのMacでDockerを利用する際に--platform
オプションが必要になる一般的なケースは以下の通りです。
2.1 x86_64専用のイメージを使用する場合
Apple SiliconのMacではデフォルトでARM64アーキテクチャのDockerイメージを実行します。しかし、特定のイメージがx86_64(amd64)アーキテクチャ専用の場合、そのままでは実行できません。このような場合、--platform linux/amd64
オプションを指定して、エミュレーションモードで実行する必要があります。
2.2 依存関係がx86_64アーキテクチャを前提としている場合
一部のDockerイメージやアプリケーションは、内部で使用するライブラリやツールがx86_64アーキテクチャを前提としてコンパイルされています。これらをARM64環境で実行しようとするとエラーが発生するため、--platform
オプションでプラットフォームを指定します。
2.3 クロスコンパイルが必要な場合
特定の開発環境やビルド環境では、ビルドプロセスの一環としてx86_64環境を仮想化して利用することがあります。このような場合も--platform
オプションが必要です。
--platform
オプションの使用例
3. 3.1 Ubuntuのx86_64イメージを実行する場合
以下のコマンドは、Apple SiliconのMacでx86_64バージョンのUbuntuイメージを実行する例です。
docker run --rm --platform linux/amd64 ubuntu uname -m
このコマンドを実行すると、x86_64
が出力され、エミュレーションモードで動作していることが確認できます。
3.2 MySQLの公式イメージを使用する場合
MySQLの公式イメージはARM64とx86_64の両方に対応していますが、特定のバージョンやタグでx86_64専用のものを使用する場合には、以下のように指定します。
docker run --rm --platform linux/amd64 mysql:5.7
このコマンドはMySQL 5.7イメージのx86_64バージョンを実行します。
4. パフォーマンスへの影響
--platform
オプションを使用してx86_64イメージをARM64環境で実行する場合、Rosetta 2を介したエミュレーションが行われるため、パフォーマンスが低下する可能性があります。特に、重い計算処理やI/Oを多用するアプリケーションでは、ネイティブなARM64対応のイメージを使用する方が望ましいです。
まとめ
Apple SiliconのMacでDockerを使用する際には、x86_64専用のイメージを実行するために--platform
オプションを指定する必要がある場合があります。このオプションを適切に使用することで、異なるアーキテクチャのイメージをエミュレーションして実行することができますが、パフォーマンスへの影響も考慮する必要があります。
Discussion