Zenn に記事として投稿 https://zenn.dev/ww24/articles/7e576d6f01a366
or
$ brew install --cask multipass
$ multipass launch --name docker-vm --cpus 4 --mem 8G --disk 20G --cloud-init cloud-config-$(uname -m).yaml 20.04
cloud-init によって VM 作成時に次の処理を行っている。
- Docker Engine のインストール
- 設定ファイルを修正し TCP port 2375 で listen
- default user を docker group に追加して docker cli 実行時の sudo 不要に
- マウントしたディレクトリに VM ゲスト側から socket file が作成できない問題のワークアラウンドとして containerd 用に XDG_RUNTIME_DIR を設定
次のように modules-final: SUCCESS
と表示されていたら cloud-init の実行が完了し、成功している。
$ multipass exec docker-vm -- tail -1 /var/log/cloud-init.log
2021-12-07 12:37:24,572 - handlers.py[DEBUG]: finish: modules-final: SUCCESS: running modules for final
macOS 上のファイルを Docker 上にマウントするために VM にマウントする。
$ multipass mount /Users docker-vm:/Users
$ multipass mount /private/tmp docker-vm:/tmp
$ multipass info docker-vm
DOCKER_HOST
環境変数を追加する方法もあるが、docker context を使うと切り替えが便利。
$ docker context create docker-vm --docker "host=tcp://$(multipass info docker-vm --format json | jq -r '.info["docker-vm"].ipv4[0]'):2375"
$ docker context list
$ docker context use docker-vm
何かで VM の IP が変わった際には、次のように docker context update
を実行する。
$ docker context update docker-vm --docker "host=tcp://$(multipass info docker-vm --format json | jq -r '.info["docker-vm"].ipv4[0]'):2375"
$ docker run -it --rm alpine:edge sh