🐳

M1 Macでlimaを使ってDockerを使う

2022/06/13に公開

はじめに

M1のMacBook Airを買ったので、せっかくならとlimaを使ってDockerを動かしてみようとやってみました。

https://github.com/lima-vm/lima

環境はM1でIntel版でも同じようにできるかは検証していません。

Install lima

公式のREADMEを参考にbrewでインストールすれば、とくに苦もなく入るはずです。

自分はaquaというツールを使っており、aquaでインストールができるのでaquaを使ってインストールしました。

aquaでのインストール

依存ツールのqemuのインストール

brew install qemu

aquaのyml

# aqua - Declarative CLI Version Manager
# https://aquaproj.github.io/
registries:
  - type: standard
    ref: v2.22.0 # renovate: depName=aquaproj/aqua-registry
packages:
  - name: lima-vm/lima@v0.11.0

limactl --versionでインストールができたか試してみてください。

VMを立ち上げる

設定ファイルは自動で吐き出してくれるのでとりあえず立ち上げてみます。

limactl startを実行すると対話形式になるので以下の順で進めます。

  • Choose another example
  • docker
  • Proceed with the current configuration

limaの実行が完了すると、~/.lima/docker/lima.yaml が作成されて、VMインスタンスが作成されます。

ちなみに作成されたyamlのテンプレートは https://github.com/lima-vm/lima/blob/master/examples/docker.yaml にあります。

作成されているインスタンスの一覧はlimactl lsで表示ができます。

NAME      STATUS     SSH                ARCH       CPUS    MEMORY    DISK      DIR
docker    Running    127.0.0.1:54249    aarch64    4       4GiB      100GiB    /Users/wim/.lima/docker

インスタンスに対してなにか操作したいときはNAMEを引数に渡して実行します。
たとえばdockerインスタンスにログインする場合はlimactl shell dockerになります。

limaコマンド

limactl以外にlimaというコマンドがあります。

limactl shell <INSTANCE> <COMMAND>: launch <COMMAND> on Linux.

For the "default" instance, this command can be shortened as lima <COMMAND>. The lima command also accepts the instance name as the environment variable $LIMA_INSTANCE.

要するにlima <COMMAND>limactl shell <INSTANCE> <COMMAND>のショートハンドになります。(<INSTANCE>はdefaultになります。)
<INSTANCE>を変更したい場合は、LIMA_INSTANCE環境変数にインスタンス名を設定します。

# limactl shell dockerと等しい
LIMA_INSTANCE=docker lima

以降はLIMA_INSTANCE=dockerが設定されている前提とします。

ホスト側との接続

limactl startが終わったときに出てくる以下のメッセージ通りに行えばホスト側から操作が可能になります。

# unix socketの場所は各環境で異なるのでメッセージを確認してください
docker context create lima --docker "host=unix:///Users/wim/.lima/docker/sock/docker.sock"
docker context use lima
docker run hello-world

docker composeもそのまま動くはずです。https://github.com/docker/awesome-compose から適当なディレクトリをcloneして試してみてください。

docker-composeのインストール

Docker Desktop for macだとdocker-composeは一緒になっているのでインストールする必要はないですが、CLIのdockerだけインストールした場合は別途インストールする必要があります。

mkdir -p ~/.docker/cli-plugins/
curl -SL <url> -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose

<url>の部分は https://github.com/docker/compose/releases からOSやバージョンによって適切なURLを取得してください。

limaの設定

limaの設定はyamlファイルで書き、yamlファイルの名前でインスタンス名が決まります。(maybe)

limactl start hoge.ymlでインスタンスを立ち上げるとhogeという名前のインスタンスができ、~/.lima/hogeという設定用のディレクトリができます。

チューニングする

どのような設定があるかは https://github.com/lima-vm/lima/blob/master/examples/default.yaml を参照してください。

この記事で作成したdockerインスタンスはいくつか修正したほうが良い箇所があります。
たとえばファイルのマウントは以下のようになっています。

mounts:
- location: "~"
- location: "/tmp/lima"
  writable: true

ホスト側の~をマウントしている箇所はwritableになっておらずread-onlyになっているためwritableをtrueにしないと書き込みができません。

またメモリがデフォルトだと4Gibになっているので増やしたほうがいいでしょう。

memory: "8Gib"

permission denied

docker上でnpm iをしたところ、[Error: EACCES: permission denied, lchown '/var/www/node_modules/agent-base']といったエラーでインストールできませんでした。

https://github.com/lima-vm/lima/issues/231

こちらのissueに書いてありますが、sshfsによる制限でchownができないらしいです。

設定ファイルにmountType: 9pを追加し設定を変更することで解消できました。

https://github.com/lima-vm/lima/blob/f32d795ad775b33680d6f7283e58c5d17e98d382/examples/default.yaml#L92

ただ9pは遅いらしいのですがそこまでの検証はしていません。

Discussion