概要
- M1チップとDockerの相性について方々で記事が書かれていますが、いざ自分で作業しながら調べていると理解が深まったので、残しておきます。(M1、Arm64、Rosettaあたり)
環境
- Mac
- 機種ID:MacBookPro18,3
- macOS:Monterey
- チップ:Apple M1 Pro
- メモリ:16GB
- Docker: version 20.10.21
- Docker Compose: v2.12.1
エラー内容
-
docker compose up -d
コマンド実行時に以下エラーが表示された。 - 利用しようとしたコンテナイメージは、mysql:5.7。
no matching manifest for linux/arm64/v8 in the manifest list entries
原因の追求
-
原因は、M1のCPUがmysqlイメージに対応していないことでした。
-
2020年後期より、それまでインテルのチップ(Intel Core i5とかのあれですね)を利用していたMacがARMアーキテクチャーを採用した独自のプロセッサー(「Appleシリコン」と呼ばれています)を搭載するようになりました。
-
ARMはiPhoneなどに採用されており、CPUパフォーマンスが圧倒的に処理速度が速いと言われています。
-
ただし、ARM64で動かないイメージもあります。その場合は
--platform linux/amd64
オプションによってIntelイメージをエミュレーション上で動かすことができる、と公式にも記載があります。mysqlイメージについては、多くの方が同様に対応しているようです。 -
メーカー、CPU、命令セットあたりの関係性、M1チップやRossettaについては、こちらのサイトがとてもわかりやすかったです。x86とかx86_64とかわかりづらい(笑)ですが、簡潔にまとまっています。
-
同じサイトですが、こちらの表が一番わかりやすい。(厳密にいうと色々あるとのことですが、これで十分だと思います!)
画像参照元:Apple Silicon と M1 チップってなに?
解決方法
-
docker-compose.yml
のservices>mysql(db)以下のようにplatformを指定することで、解決しました。
platform: linux/amd64
備忘録
- CPU周りのハードウェアのタイプを表示するunameコマンドは以下の通り。
uname -m
- 自分の場合は、
arm64
と返ってきます
-
Docker Hubに行けばイメージのアーキテクチャ一覧を確認することができます。
- 対象イメージを選択→Tagsタブクリック→OS/ARCHの項目から確認可能
- 2023.1.5時点では、mysql:5.7は以下が表示されています。(バージョンによって異なる)
linux/amd64
- Rosettaについて(Intel用のバイナリ・ARM64用のバイナリの変換技術)
- Rosetta:PowerPCからIntelアーキテクチャに移行したときに使われたもの(2004年)
- Rosetta 2:IntelアーキテクチャからApple Siliconに移行したときに使われたもの(2020年)