以前、「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.yamllimactl 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 にしておけって書かれてますけど)
| |
CPU, Memory, Disk のデフォルトは次のようになっており、変更はお好みで。
| |
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-dockerVM 内で 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/dockerdocker 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
