macOSでlima+dockerの環境構築

### 背景
私用のPCはmac(macbook air 2013 mid　古すぎ！！)。Docker Desktop for Macでは動作が遅かったので、しばらくDockerの利用はあきらめていた。
ファイルシステムが違うとか、そんな理由らしい・・・
最近になって、Limaを使用すると快適に作業できるとかいう記事を見かけたので環境構築してみた。ほとんど参考記事そのまま。

### 参考記事

https://zenn.dev/takasp/articles/3cf03da87d894e

https://qiita.com/akinami/items/d38b9e7c7f37bd070f40

### 環境

* Intel Mac (Macbook Air 2013 mid)
* limactl 0.9.1
* Docker 20.10.14
* Docker Compose 2.4.1

### Lima、Dockerのインストール
これだけ。
```
brew install lima docker
```

### Limaの設定ファイル
LimaはmacOS上でLinux仮想マシンを提供するツールらしい。似たようなものにvagrantもある。ちょっと違いのかもしれないが、WindowsでいうところのWSLみたいなものか。仮想マシンに対する設定ファイルをlima.yml作成する必要がある。docker用の[サンプル](https://github.com/lima-vm/lima/blob/v0.7.4/examples/docker.yaml)も用意されている。とりあえず上記参考記事をほぼコピペで以下のようになった。



```:lima.yml
arch: "default"
images:
  - location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-amd64.img"
    arch: "x86_64"
  - location: "https://cloud-images.ubuntu.com/impish/current/impish-server-cloudimg-arm64.img"
    arch: "aarch64"
#仮想マシンに振り分けるリソース、貧弱・・・
cpus: 1
memory: "1GiB"
disk: "10GiB"

mounts:
  - location: "~"
    # CAUTION: `writable` SHOULD be false for the home directory.
    # Setting `writable` to true is possible, but untested and dangerous.
    writable: false
  # 作業ディレクトリを指定（ホスト側の作業場所）
  - location: "~/Documents/workspaces"
    writable: true
ssh:
  localPort: 60006
  loadDotSSHPubKeys: true
containerd:
  # Enable system-wide (aka rootful)  containerd and its dependencies (BuildKit, Stargz Snapshotter)
  # Default: false
  system: false
  # Enable user-scoped (aka rootless) containerd and its dependencies
  # Default: true
  user: true
provision:
  # `system` is executed with the root privilege
  - mode: system
    script: |
      #!/bin/sh
      sed -i 's/host.lima.internal.*/host.lima.internal host.docker.internal/' /etc/hosts
  - mode: system
    script: |
      #!/bin/bash
      set -eux -o pipefail
      command -v docker >/dev/null 2>&1 && exit 0
      export DEBIAN_FRONTEND=noninteractive
      curl -fsSL https://get.docker.com | sh
      # NOTE: you may remove the lines below, if you prefer to use rootful docker, not rootless
      systemctl disable --now docker
      apt-get install -y uidmap dbus-user-session
  # `user` is executed without the root privilege
  - mode: user
    script: |
      #!/bin/bash
      set -eux -o pipefail
      systemctl --user start dbus
      dockerd-rootless-setuptool.sh install
      docker context use rootless
probes:
  - script: |
      #!/bin/bash
      set -eux -o pipefail
      if ! timeout 30s bash -c "until command -v docker >/dev/null 2>&1; do sleep 3; done"; then
        echo >&2 "docker is not installed yet"
        exit 1
      fi
      if ! timeout 30s bash -c "until pgrep rootlesskit; do sleep 3; done"; then
        echo >&2 "rootlesskit (used by rootless docker) is not running"
        exit 1
      fi
    hint: See "/var/log/cloud-init-output.log". in the guest
portForwards:
  - guestSocket: "/run/user/{{.UID}}/docker.sock"
    hostSocket: "{{.Dir}}/sock/docker.sock"
message: |
  To run `docker` on the host (assumes docker-cli is installed):
  $ export DOCKER_HOST=unix://{{.Dir}}/sock/docker.sock
  $ docker ...
```

### Lima環境構築

#### 仮想マシンの起動

Limaはlimactlとういコマンドで扱うらしい。lima.ymlがあるディレクトリで下記コマンドを実行する。

```
limactl start ./lima.yml
```

参考記事にもあるが、lima.ymlを変更した場合は仮想環境を再作成する必要がある。なお、仮想マシン名はymlファイル名となる。今回の場合、「lima」が仮想マシン名となる。

#### 仮想マシンの停止
```
limactl stop lima
```

#### 仮想マシンの削除
```
limactl rm lima
```

lima.yml編集後に再度、`limactl start ./lima.yml`で環境設定ファイルが反映されようだ。

#### 確認

```
limactl list
```

以下のような感じで起動している仮想マシンの状態がわかる。
```
NAME    STATUS     SSH                ARCH      CPUS    MEMORY    DISK     DIR
lima    Running    127.0.0.1:60006    x86_64    1       1GiB      10GiB    /Users/***/.lima/lima
```

### 仮想環境に入る場合

```
nyaao@MBA ~ % limactl shell lima
nyaao@lima-lima:/Users/nyaao$ 
```

### ホストマシンから仮想環境のdockerを使う

ホストマシンにはDockerをインストールしていますが、このままだとlima上のdockerデーモンではなく、ホストマシン上のdockerデーモンを使用することになります。
`DOCKER_HOST`の環境変数を上書きすることで、limaのシェルに入ることなく、ターミナルなどからlima上のdockerデーモンを操作できるようになります。
`.zshrc`に下記を追記しておけば良いようです。
```
export DOCKER_HOST=unix:///${HOME}/.lima/lima/sock/docker.sock
```

### パソコン再起動時の対応

パソコンを再起動すると仮想環境はstop状態になるようです。`.zshrc`に下記を追記しておくと再起動時に仮想環境が自動起動します。
```
limactl start lima
```


### あとがき

まだ環境構築したばかりなので、快適に動作するかわかりませんが、とりあえずできました。
~~Macbook Airが古すぎるので効果は感じられないかも、M1 Macほしいな・・・~~
M1を購入して１ヶ月ほどlima環境でdockerを使用しています。
今のところ、全く問題ないです。



### 追記

以前にDocker Desktopを使用しているとdocker-composeでのpull時に以下のエラーが出るっぽい。
`error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH,`

[こちら](https://zenn.dev/harapeko_wktk/scraps/00937f4a9faa3e)によると`rm -fr ~/.docker`をしておくと良いみたい。