何個か前の投稿で、Docker Desktopの代替アプリとして「Finch」を紹介しました。
Finchはコンテナの実行環境としてLimaでLinux VMを起動します。このVMの中ではcontainerdが動いていて、それを操作するためにnerdctlを使用します。今回はFinch経由ではなく、直接Limaとnerdctlを使ってみたいと思います。
日本語ドキュメントはこちら
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
この設定は以下のファイルに記述されています。
リポジトリ直下に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から乗り換えたいと考えている方はこちらも試してみるといいですね。