原因についてM1、M2、またはM3チップを搭載したMacへの移行は通常、大幅なアップグレードとなりますが、古いDockerスタックを実行しようとすると問題が発生することがあります。MySQL 5.7や古いPythonビルドなど、使い慣れたイメージをプルしようとして、処理が停止し、以下のエラーで失敗することがあります。
no matching manifest for linux/arm64/v8 in the manifest list entries
根本的な原因はアーキテクチャの不一致です。Apple SiliconはARM64アーキテクチャを使用していますが、古いDockerイメージの多くはx86_64(Intel/AMD)専用にビルドされています。イメージをリクエストすると、Docker Desktopはレジストリからネイティブチップに一致するバージョンを探します。メンテナがARM64ビルドを公開していない場合、Dockerは処理を断念します。
クイックフィックス:CLIでプラットフォームを強制指定するDockerにIntel版のイメージを使用するように明示的に指示することで、このエラーを回避できます。macOSはRosetta 2を介してこの重い処理を処理し、ARMチップ向けにIntelの命令を動的に変換します。ネイティブコードほど高速ではありませんが、動作させることは可能です。
互換性のないイメージをプルするには、コマンドに --platform フラグを追加します:
# 例:ネイティブARMサポートがないMySQL 5.7をプルする
docker pull --platform linux/amd64 mysql:5.7
コンテナを起動する際も、エミュレーションレイヤーを確実に有効にするために、再度プラットフォームを指定する必要があります:
docker run -d --name my-db --platform linux/amd64 -e MYSQL_ROOT_PASSWORD=pass mysql:5.7
恒久的な対策:Docker Composeを更新するフラグを手動で入力するのは面倒です。特に、チーム内にIntelベースのMacを使用しているメンバーが混在している環境ではなおさらです。このプラットフォーム要件を docker-compose.yml ファイルに直接記述することで、プロセスを自動化できます。
特定のサービスに platform: linux/amd64 属性を追加するだけです:
services:
db:
image: mysql:5.7
platform: linux/amd64
environment:
- MYSQL_ROOT_PASSWORD=root
ports:
- "3306:3306"
この設定により、チームメンバー全員が同じバージョンをプルできるようになります。Docker Composeは、ホストマシンがMacBook Pro M3であっても、古いIntel iMacであっても、自動的に amd64 イメージを使用します。
長期的な代替案Rosetta 2によるエミュレーションは便利ですが、パフォーマンスの低下を伴います。エミュレートされたコンテナは通常、CPUパフォーマンスが20%から35%低下し、バッテリーの消費も早くなります。可能な限り、ARM64をネイティブにサポートしているイメージに切り替えてください。
- MySQL:
mysql:8.0にアップグレードするか、mariadb:latestに切り替えてください。どちらも優れたARMサポートを提供しています。 - Postgres: バージョン13以降はARM64に完全に最適化されています。
- 開発ランタイム: Node.jsやPythonには
-slimまたは-alpineタグを使用してください。これらはほとんどの場合、マルチアーキテクチャ対応です。 レガシーなイメージの使用を決める前に、Docker Hubの「OS/ARCH」セクションを確認してください。arm64がリストにない場合は、プラットフォームフラグによる回避策が必要になります。
修正の確認コンテナが起動したら、正しいアーキテクチャが使用されているか再確認できます。以下のコマンドを実行してメタデータを確認してください:
docker inspect <container_id> | grep Architecture
ARMベースのMacであっても、出力は "Architecture": "amd64" と表示されるはずです。Docker Desktopのダッシュボードに、イメージのプラットフォームがホストと一致しないことを示す黄色の警告アイコンが表示されることがありますが、これは無視して構いません。これはコンテナがエミュレーション下で動作していることを知らせるリマインダーに過ぎません。

