Apple Silicon (M1/M2) で MySQL Docker イメージが実行できない問題の解決策
問題の概要
Apple Silicon(M1/M2チップ)搭載のMacでDockerを使用する際、MySQLイメージを実行しようとすると以下のエラーが発生することがあります:
ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries
このエラーは、MySQLの公式DockerイメージがARM64アーキテクチャに対応していないために発生します。DockerはデフォルトでネイティブのARM64イメージを探しますが、多くのMySQLイメージはlinux/amd64アーキテクチャでのみ利用可能です。
解決策
方法1: プラットフォームの明示的指定(推奨)
Docker Composeを使用している場合、docker-compose.yml
ファイルでプラットフォームを明示的に指定します:
version: '3'
services:
db:
image: mysql:5.7
platform: linux/amd64 # この行を追加
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: wp
MYSQL_USER: wp
MYSQL_PASSWORD: wp
方法2: 環境変数でのグローバル設定
すべてのDockerコマンドでamd64アーキテクチャを使用するように設定:
echo 'export DOCKER_DEFAULT_PLATFORM=linux/amd64' >> ~/.zshrc
source ~/.zshrc
方法3: 個別のdocker runコマンドでの指定
docker run --platform linux/amd64 --name mysql-container -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7
方法4: Dockerfileでのプラットフォーム指定
FROM --platform=linux/amd64 mysql:5.7
# その他の設定
代替ソリューション
MariaDBの使用
MySQLの代わりにネイティブARM64サポートがあるMariaDBを使用する:
services:
db:
image: mariadb:10.5.8
# MySQLと同様の環境変数を使用可能
MySQLのARM64ネイティブイメージ
Oracleが提供するARM64対応のMySQLイメージを使用する:
services:
db:
image: mysql/mysql-server:8.0
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: wp
チーム開発での考慮事項
異なるアーキテクチャのマシンで作業するチームの場合、環境固有の設定を分離することが推奨されます。
docker-compose.yml
(共通設定):
version: '3'
services:
db:
image: mysql:5.7
# その他の共通設定
docker-compose.mac.yml
(M1/M2固有設定):
version: '3'
services:
db:
platform: linux/amd64
以下のコマンドで両方のファイルを読み込んで起動します:
docker-compose -f docker-compose.yml -f docker-compose.mac.yml up
パフォーマンスに関する注意点
WARNING
AMD64イメージをApple Siliconでエミュレーション実行すると、ネイティブ実行に比べてパフォーマンスが低下し、メモリ使用量が増加する可能性があります。可能な場合はネイティブARM64イメージの使用を検討してください。
特にMySQLでは、エミュレーション環境ではLinux Native AIO(非同期I/O)がサポートされないという制限があります:
[Warning] [MY-012654] [InnoDB] Linux Native AIO disabled.
まとめ
Apple Silicon搭載MacでMySQL Dockerイメージを使用する主な解決策は:
- プラットフォームの明示的指定(
platform: linux/amd64
) - MariaDBへの切り替え(ネイティブARM64サポート)
- Oracle提供のMySQLイメージの使用
プロジェクトの要件とパフォーマンスのバランスを考慮して最適な方法を選択してください。チームで開発している場合は、環境固有の設定を分離する方法が効果的です。