y-ohgi's blog

TODO: ここになにかかく

Limaを利用しQEMU上でコンテナを動かす

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に移りたいと感じています。