Docker on Lima

以前、「Lima で nerdctl」という記事を書きました。その後、lima の VM 上で docker daemon を実行し、ホスト側から docker コマンドでアクセスするという方法があることを知りました。たまたま、brew upgrade を実行していたところ lima が 0.8.0 に更新されたのを見て Github の releases ページを見、試してみようかなと思ったのでメモです。 ちなみに、前回試した時のバージョンは 0.6.4 でした。

Docker 入りの VM を起動させる

私は brew のインストール先を $HOME にしていますが、brew で lima をインストールすると [~/.homebrew/Cellar/lima/0.8.0/share/doc/lima/examples/docker.yaml](https://github.com/lima-vm/lima/blob/v0.8.0/examples/docker.yaml) に docker 入りの VM を作成するための設定ファイルも一緒にインストールされています。これを使うことで簡単に VM が作成できます。次のように limactl start に続けてファイルの path を指定するだけです。

$ limactl start ~/.homebrew/Cellar/lima/0.8.0/share/doc/lima/examples/docker.yaml

ファイルは URL でも良いみたいなので次のようにすることもできるようです。

$ limactl start https://raw.githubusercontent.com/lima-vm/lima/v0.8.0/examples/docker.yaml

limactl start を実行すると、指定したファイルの内容そのままでインスタンスを作成するか、編集するかを尋ねられます。その場で編集して起動させられるのは便利ですね。

? Creating an instance "docker"  [Use arrows to move, type to filter]
> Proceed with the default configuration
  Open an editor to override the configuration
  Exit

デフォルトでは $HOME ディレクトリが Read-Only でマウントされるので Writable に変更しておくと便利です。(default.yaml のコメントでは writable は false にしておけって書かれてますけど)

mounts:
  - location: "~"
    # CAUTION: `writable` SHOULD be false for the home directory.
    # Setting `writable` to true is possible, but untested and dangerous.
    writable: true

CPU, Memory, Disk のデフォルトは次のようになっており、変更はお好みで。

# CPUs: if you see performance issues, try limiting cpus to 1.
# Default: 4
cpus: 4

# Memory size
# Default: "4GiB"
memory: "4GiB"

# Disk size
# Default: "100GiB"
disk: "100GiB"

docker コマンドでアクセス

起動すると、DOCKER_HOST 環境変数の設定方法が表示されるのでそれをコピペすれば docker コマンドで lima の VM 上の docker daemon を操作できるようになります。この際、Docker Desktop 付属の docker コマンドでは何かで待たされてちょっとイラッとするので brew install docker で別途 docker コマンドをインストールしてそちらを使うのが良いかと思います。(何に引っ掛かってるのか調べたかったけど dtruss もなぜかうまく機能しないので諦め)

To run `docker` on the host (assumes docker-cli is installed):
$ export DOCKER_HOST=unix://{{.Dir}}/sock/docker.sock
$ docker ...

lima コマンドの引数で指定したコマンドを VM 内で実行してくれる便利機能は default 以外の VM で使うためには LIMA_INSTANCE という環境変数を設定する必要があります。

$ lima hostname
lima-default

$ LIMA_INSTANCE=docker lima hostname
lima-docker

VM 内で shell を実行してしまえば良いなら limactl shell docker とすれば環境変数を使わずにすみます。

その他の変更

沢山あると思いますが、Intel VM を M1 mac で、Arm VM を Intel mac で実行可能になっています。

examples ディレクトリには docker だけじゃなくていろんな VM 用のテンプレが用意されています。

port-forward が 1024 未満のポートにも対応しています。(podman の件と混同してしまって、以前どういう状態だったか覚えていない)

以前は複数の VM を同時に起動させられなかったという記憶があるのですが、同時に起動できるようになってました。

$ limactl list
NAME       STATUS     SSH                ARCH      CPUS    MEMORY    DISK      DIR
default    Running    127.0.0.1:60022    x86_64    4       4GiB      100GiB    /Users/teraoka/.lima/default
docker     Running    127.0.0.1:60006    x86_64    4       4GiB      100GiB    /Users/teraoka/.lima/docker

docker compose も問題なく使えました。

docker.yaml を default.yaml にして limactl start default.yaml とすれば default VM が docker 用になります。

$ curl -Lo default.yaml https://raw.githubusercontent.com/lima-vm/lima/v0.8.0/examples/docker.yaml
$ limactl start default.yaml
Built with Hugo
テーマ StackJimmy によって設計されています。