備忘録 M1Mac+Lima+DockerでDocker compose開発する際のポイント


tl;dr

  • 多くのイメージはarm64v8でimageを探すと見つかることがあるよ
  • mysqlはmysql-serverはmysqlと動きが異なるので、arm64v8/mariadbを使ったほうが良いよ
  • lima + dockerに接続するならunix socketが良いよ

Lima+Docker+Docker Compose+OSX環境

DockerDesktopがおもすぎる問題は非常に言われており、ベンチマークも各所に上がっている。DockerDesktopが重いシンプルな理由としては以下が挙げられる

  • 別アーキテクチャ(Intel x64)のエミュレートをしているため、動作が超非効率
  • Macのディスクをマウントして動作させているため、これまた動作が非効率(Intel macでも同様の現象あり)

この問題はひとえにCPUのアーキテクチャが全く異なることからきている。

筆者は Lima + Docker + DockerCompose 環境でPython/PHPの開発が多いのだが、全てをubuntuから独自イメージを作ってない人にとっては、ハマりがちという問題がある。
2日ハマりきった経験をもとに知りたかった情報をまとめます。

arm64v8を使おう

M1MacのCPUのアーキテクチャ名は linux/amd64 でも、 linux/x86_64 でもなく、 「linux/arm64v8」であることをしっかりと念頭に置く必要がある。
現在M1Macのような新しいアーキテクチャ対応のDockerプログラムは徐々に出つつあり、メジャーなDocker imageでは対応されつつあるが、mysql(8のみ限定的に対応)やphpmyadmin(公式では非対応)などのDockerを使っている場合など、そのままでは動作しないケースも多い。

2021年12月時点では、「arm64v8 <ソフト名> docker」のような検索をすることで野良docker imageが出てくることが多いので、それを使うという手もある。

以下は、よく行う変換のルールだ
* mysql -> arm64v8/mariadb (mysql5.7の場合はmariadb10.3, mysql8の場合は mariadb10.7)
* phpmyadmin/phpmyadmin -> arm64v8/phpmyadmin
* wernight/ngrok -> athombv/ngrok (ルールの書き換えが必要)

~/work などを作ってwritableにmountしよう

Limaの仕様上、~をwritableにするのは推奨されていないため、~/workなどをwritableにするのが良い

limaのインストール後に出てくるunix socketを使ってdockerしよう

limaの公式のdockerの設定を使うと、最後にunix socketの情報が出てくる。
このunix socketの情報を正しく設定すると、非常にうまく動作する。一方、ipアドレスベースでの指定は非常にバグが多く、うまく動作しないことが多い。