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は内部ではsshfsを使っているのだが、sshfs + Docker Volumeの組み合わせはdocker側を止めて置かないと、dockerが保持しているvolumeデータを残したまま次に接続しようとしてしまう。再起動して「volume notempty」のエラーが出た場合は、
- dockerを全部削除
- limaで入って、 /Users//work などのフォルダを削除(中身を確認、だいたいdockerでマウントされているものがはいっている)
というフローで解決できる
limaのインストール後に出てくるunix socketを使ってdockerしよう
limaの公式のdockerの設定を使うと、最後にunix socketの情報が出てくる。
このunix socketの情報を正しく設定すると、非常にうまく動作する。一方、ipアドレスベースでの指定は非常にバグが多く、うまく動作しないことが多い。