🗂

Apple SiliconとDockerの互換性(platform)

2024/09/17に公開

はじめに

このページではApple SiliconのチップでDockerを利用する際に--platformオプションを使用する必要がある場合について記述します。

Apple SiliconとDockerの互換性について

Apple Silicon(M1、M2など)のMacでは、CPUアーキテクチャが従来のIntelベースのx86_64からARM64ベースに変更されました。このため、Dockerコンテナを実行する際に、使用するベースイメージやビルド設定によっては、互換性の問題が発生する場合があります。

1. --platformオプションの概要

--platformオプションは、Dockerイメージを実行する際に使用するプラットフォーム(CPUアーキテクチャ)を指定するために使用されます。Apple Siliconでは、x86_64ベースのイメージを実行する場合に、明示的にプラットフォームを指定しなければならないことがあります。

例えば、次のように指定します。

docker run --platform linux/amd64 イメージ名

このコマンドは、ARM64アーキテクチャのMac上でx86_64(amd64)アーキテクチャのイメージをエミュレーションして実行することを意味します。

2. どのような場合に--platformを使用するか

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オプションが必要です。

3. --platformオプションの使用例

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