Limaを使ってDockerのファイル同期を試す
動機
- ファイル数が増えるとMacでのDockerでVolumeの同期が遅い
- DockerDesktopのMutagenに期待していたがDockerDesktopの有料プランに取り込まれてしまった
- 他の手段としてlimaを試したいのでDockerの起動とファイルの同期までをやってみる
Limaの実行
インストール
brew install lima
Limaではなにも指定せずにstartすればDefaultという名前で環境を作ってくれるが、今回Dockerを使いたいので用意されているTemplate元に設定を作成
Docker向けののTemplate
lima/examples/docker.yaml at master · lima-vm/lima · GitHub
Templateの修正
mountType: "virtiofs" # ファイルの共有方法virtiofsに変更 vmType: "vz" # mountTypeに合わせてvmTypeもvsを指定
virtiofsとvzは現時点でexperimental
設定ファイルを指定してLimaインスタンスの作成と起動
limactl create --name=my-docker docker.yaml limactl start my-docker
起動している仮想マシンの一覧。vmTypeがvzであることが確認できる
$ limactl list NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK DIR my-docker Running 127.0.0.1:57337 vz aarch64 4 4GiB 100GiB ~/.lima/my-docker
Dockerの動作確認
limaインスタンス起動時のメッセージを参考にDockerのcontextを切り替える
$ docker context create lima-my-docker --docker "host=unix://$HOME/.lima/my-docker/sock/docker.sock" $ docker context use lima-my-docker $ docker context show lima-my-docker
コンテナの起動
docker run --name nginx -p 127.0.0.1:8080:80 nginx:alpine
ブラウザからhttp://localhost:8080/を開くとnginxの起動を確認できる
ファイルの同期
開発環境として実行したいのでファイル同期の確認をしておく
limaのインスタンスのマウントはDockerのTemplateで以下のように指定されているので/tmp/lima/以下にサンプルのhtmlをおく
docker.yaml
mounts: - location: "~" - location: "/tmp/lima" writable: true
/tmp/lima/index.html
<!DOCTYPE html> <html> <body> <h1>Lima test</h1> </body> </html>
ファイルを置いた状態でvolumeをマウントしてdockerを起動
docker run --name nginx -p 127.0.0.1:8080:80 -v /tmp/lima/index.html:/usr/share/nginx/html/index.html nginx:alpine
ブラウザからの表示が変更されているの確認したあと
Lima test
ローカルの/tmp/lima/inde.htmlを修正してからリロードすると
... <h1>changed file</h1> ...
表示が変更される
changed file
Limaのインスタンスから変更しても同期される(ブラウザの反映にはリロード & キャッシュの削除が必要だった)
$ limactl shell my-docker bash $ sed -i 's/changed file/changed file in lima/' /tmp/lima/index.html
感想
Lima側の設定が用意されたTemplateから出来たので試したかったことは簡単に行えた
ローカル、Lima、Dockerと3つの環境の把握が必要になるのが難点だが、そもそもそういうものなのでやむをえないしアプリケーションのファイル数が増えて同期が遅くなってくるのも辛いので、改善されるなら試す価値はあると思う
環境の管理が大変なら有料でも同じことができるDesktop環境を探す選択肢をとることになりそう