とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
各種SNSのフォローもよろしくお願いいたします。

macOSでLimaとnerdctlとcontainerd

何個か前の投稿で、Docker Desktopの代替アプリとして「Finch」を紹介しました。

devops-blog.virtualtech.jp

Finchはコンテナの実行環境としてLimaでLinux VMを起動します。このVMの中ではcontainerdが動いていて、それを操作するためにnerdctlを使用します。今回はFinch経由ではなく、直接Limaとnerdctlを使ってみたいと思います。

github.com

日本語ドキュメントはこちら

Lima???

macOSでcontainerdを実行するためのLinux仮想マシンです。CNCFでホストされていて、熟成度はSandboxです。CNCFの熟成度についてはこちらを参考にしてください。

インストール

こちらを参考に進めていきます。

https://github.com/lima-vm/lima#installation

といっても、Homebrewを使えば簡単ですね。

brew install lima

手動でインストールする場合は、QEMU 7.0以上のインストールとGitHub Relasesからバイナリを落としてくる必要があります。こちらは試していませんが、素直にHomebrewからLimaをインストールするほうが楽そうです。

おためし

VMを操作するにはlimactlコマンドを使用します。さっそくVMを立ち上げてみます。

limactl start

startサブコマンドに引数を与えなければ、以下のようなインタラクティブに設定できる画面になります。

先頭に>のある行が現在選択中の行です。

原文 内容
Proceed with the current configuration 現在の設定で起動
Open an editor to review or modify the current configuration 現在の設定を確認、変更して起動
Choose another example (docker, podman, archlinux, fedora, ...) 起動するディストリビューションを選択

現在の設定というのは以下で説明されています。

https://github.com/lima-vm/lima#configuration

この記事の執筆時点では以下でした。

OS: Ubuntu 22.10 (Kinetic Kudu)
CPU: 4 cores
Memory: 4 GiB
Disk: 100 GiB
Mounts: ~ (read-only), /tmp/lima (writable)
SSH: 127.0.0.1:60022

この設定は以下のファイルに記述されています。

github.com

リポジトリ直下にexamplesというディレクトリがあって、その中にいろいろなディストリのyamlが入っていました。Choose another example (docker, podman, archlinux, fedora, ...)ここで選択できるのも、このディレクトリに中に入ってるものになります。limactl start --list-templatesで一覧を見ることができます。

オレオレVMを起動したい時はどうしたらいいのかというと、startサブコマンドは引数にローカルにあるyamlファイルやURLを指定することができるので、自分でyamlファイルを記述しておけば独自のVMも起動できます。何か特別な設定が必要でない場合はOpen an editor to review or modify the current configurationを選択して、一部修正するのが楽そうです。

起動したVMを確認してみます。

limactl list

今回はstartの時に名前を設定していないのでNAMEがdefaultになっています。--name=VM-NAMEオプションを使用することで、VMに名前をつけることができます。もし、同じ名前をつけようと思っても以下のように怒られてしまうので、名前が被らないようにする必要があります。

では、このVM内でunameコマンドを実行してみましょう。VMでコマンドを実行する時はlimaコマンドを使用します。

lima uname -a

起動しているOSを確認してみます。

lima cat /etc/os-release

ここまでやってみてお気付きかもしれませんが、limaコマンドは引数でVMを指定することができません。デフォルトでdefaultという名前のVMを使用します。もし、コマンド実行対象のVMを変更する場合は$LIMA_INSTANCE変数に操作対象のVM名をセットしてください。

export LIMA_INSTANCE=VM-1
lima uname -a

or 

LIMA_INSTANCE=VM-1 lima uname -a

containerdが動いているか確認してみます。

lima pgrep -a containerd

nerdctlが入っているかも確認します。

lima command -v nerdctl

containerdも動いていて、nerdctlもインストールされているのでコンテナの起動やビルドができそうです。nginxのコンテナで試してみます。

lima nerdctl run --name nginx -d -p 8080:80 nginx

lima nerdctl images

lima nerdctl ps -a

イメージがダウンロードされて、コンテナが実行できました。

nginxコンテナの起動時にコンテナのポート80をホストの8080に割り当てました。実際にアクセスしてみます。

curl -i http://localhost:8080

アクセスできてますね、大丈夫そうです。

次はビルドを試してみます。VMにどうやってファイルを渡すのかというと、ホストマシンの~がVMの/Users/usernameに読み取り専用でマウントされています。Dockerfileをホームのどこかに置いておけば、VM内からも同じように辿れます。

nginxコンテナにコピーするindex.htmlを作成します。

cat <<EOF > ~/index.html
Hello World!!
EOF

index.htmlと同じ階層にDockerfileを作成します。

cat <<EOF > ~/Dockerfile
FROM nginx:latest

COPY index.html /usr/share/nginx/html/
EOF

Dockerfileを元にコンテナイメージをビルドしてみます。

lima nerdctl build -t my-hello-world .

lima nerdctl image

ビルドも成功です。

ビルドしたイメージを実行してみます。

lima nerdctl run --name my-hello-world -d -p 8081:80 my-hello-world

lima nerdctl ps -a

curl -i http://localhost:8081

Hello World!!の文字が返ってきて、自作したコンテナにアクセスできていることがわかります。

最後にVMを停止、削除して終わりたいと思います。

limactl stop default
limactl delete default

まとめ

前回Finchを使ってみて結構簡単でよきっと思ったんですが、Limaも十分楽でした。Finchはコンテナを操作するのに使うツールなので、ディストリビューションにこだわる必要もなく、動けばよしだったのですが、Limaはディストリビューションを選択できるので、こだわりのある方はこちらの方がいいかもしれません。冒頭でmacOSでcontainerdと説明しましたが、dockerも動かせるようなので、Docker Desktopから乗り換えたいと考えている方はこちらも試してみるといいですね。