TL;DR
- Dockerの代替としてLimaを使用して、コンテナを起動する
- Limaでcontainerdを動かす
概要
LimaはVMとしてQEMUを使用し、その上でcontainerdを起動することを目的としたOSSです。
Lima: Linux virtual machines
去年の9月時点でCNCFのsandboxのレベルにjoinしました。
Lima | Cloud Native Computing Foundation
特徴
VMとしてQEMUを採用することで異なるCPUアーキテクチャ間でカジュアルにARM/Intelコンテナイメージを起動することができる点がメリットです。
また、k8sでdockerdがdeprecatedなった今、素直にcontainerdを直接扱うことができることも魅力です。
Limaは 他のコンテナエンジン dockerやpodmanなども扱えます。
そのためLima上でdocker-composeを動かすことも可能です。しかし、完全な互換性があるわけではありません。
Limaは日本人のDocker/runc/BuildKitのコミッターの方が個人開発のOSSとして開発されました。
そのためかはわかりませんが、公式に日本語のREADMEが用意されています。
lima/README.ja.md at master · lima-vm/lima · GitHub
その中にLimaの動機として以下のように記載されています。
動機 Limaの目的は、Macユーザにnerdctl (contaiNERDctl)を含めcontainerdを広めることです。
QEMUベースのコンテナオーケストレーションツールではなく、containerdに焦点を当てていることがわかります。
Versions
- lima
- 0.16.0
手順
実際にLimaでコンテナを動かしてみます。
基本的に上述した同じ日本語READMEに沿って構築し、動作確認を行います。
再掲: lima/README.ja.md at master · lima-vm/lima · GitHub
前提として、Docker・k8s・ECSはOCI(Linux Foundation傘下のコンテナの標準規格)準拠のコンテナイメージのcontainerdを使用しています。
そのため今回はDocker Hubからコンテナイメージを使用してnginxの起動を目的とします。
Limaのインストール
Limaはbrewに対応しているので、簡単にインストール可能です。
brew install lima
QEMU
Lima環境(今回はQEMUのx86)の初期構築を行います。構築には少し時間がかかります(下り650Mbpsの回線を使用しています。)
limactl start --name=default
VMが起動できているか確認します
$ limactl list NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK DIR default Running 127.0.0.1:60022 qemu x86_64 4 4GiB 100GiB ~/.lima/default
nginxを起動し、8080番ポートへport-fowardを行います。
lima nerdctl run -d --name nginx -p 8080:80 nginx
プロセスの起動確認を行います。
$ lima nerdctl ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4522e8eae231 docker.io/library/nginx:latest "/docker-entrypoint.…" 7 minutes ago Up 0.0.0.0:8080->80/tcp nginx
実際にアクセスし、200ステータスコードが帰ってくることを確認します
curl -I localhost:8080
Limaのお片付け
作成したコンテナを停止します。
$ lima nerdctl stop nginx $ lima nerdctl ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
$ lima nerdctl ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4522e8eae231 docker.io/library/nginx:latest "/docker-entrypoint.…" 11 minutes ago Exited (0) About a minute ago 0.0.0.0:8080->80/tcp nginx $ lima nerdctl rm 4522e8eae231
pullを行ったイメージを削除します
$ lima nerdctl images REPOSITORY TAG IMAGE ID CREATED PLATFORM SIZE BLOB SIZE nginx latest 593dac25b773 10 minutes ago linux/amd64 192.1 MiB 67.3 MiB $ lima nerdctl rmi nginx:latest
LimaのVMインスタンスを削除します
$ limactl list NAME STATUS SSH VMTYPE ARCH CPUS MEMORY DISK DIR default Running 127.0.0.1:60022 qemu x86_64 4 4GiB 100GiB ~/.lima/default $ limactl stop default $ limactl delete default $ limactl list WARN[0000] No instance found. Run `limactl start` to create an instance.
余談
containerdイメージの作成
こちらは前述したとおり、Dockerはcontainerdのコンテナイメージを作成することが可能です(作成しています)。
しかし、Docker(moby)を使用せずにcontainerdイメージ場合は、BuildKit・Buildpacks・Kaniko・containerdを使用することを選択肢として持つとよいでしょう。
BuildKitやBuildpacksなどはDockerfileをそのまま使用可能なため、既存の開発資産/体験を損なわずに利用が可能です。
所感
まず、日本人の方が作成したOSSがCNCFプロジェクトのOSSの1つにjoinしたということが、未熟ながら1人の日本人エンジニアとして尊敬です。
LimaのCLIはユーザー体験として非常に良く、QEMUインスタンスの立ち上げの遅さ(これはワンオフなので許容可能な範囲の認識です。)以外不満点はありませんでした。
個人的に、Dockerは企業利用する際はビジネスプランで使用するという形で快適に使用していたのですが、QEMUでのコンテナ環境が欲しいという機会がRaspberyPiなど稀にあるため、その際は積極的に採用したいと考えています。
ただしかし、正直普段遣いや仕事で移行するかと言うと、やはりdocker-composeの互換性の不足分やDockerの普及率的に引き続きDockerを使用します。逆にその部分が解決可能なチームやDocker社の今後のニュース次第ではLimaに移りたいと感じています。