記事を書く発端はAWSがFinchというコンテナのオープンソースプロジェクトを発表したことから始まります。コンテナは大変便利な技術なのですが、発展の途上でDocker社の動きやOSSの開発ペースの上昇などで複雑に変化してきました。その流れにある程度まとまりが生まれそうな予感を感じさせるのがこのFinchかと思います。 ここではFinchそのものと、コンテナのOSS環境にフォーカスしてみます。
Finchとは
The Finch CLI an open source client for container development
AWSが投稿したFinchの原文と翻訳文はこちらにあります。AWSが伝えたいことはこちらのリンクを読むと非常によくわかります。本ページでは一部を抜粋して紹介していますのでお時間が無い方に適していますが、是非一度はAWSの投稿内容の方も目を通していただけると理解が深まると思います。
Finchの紹介として翻訳文から引用します。
Finch は Linux コンテナをビルド、実行、公開するための新しいコマンドラインクライアントです。Lima、nerdctl、containerd、BuildKit などの厳選されたデファクトスタンダードのオープンソースコンポーネントと共に、macOS ネイティブのクライアントを簡単にインストールできます。Finch では、コンテナをローカルで作成して実行したり、オープンコンテナイニシアチブ (OCI) コンテナイメージをビルドして公開したりできます。
Finchはオープンソースであり、デファクトスタンダードなオープンソースたちと一緒に動いています。使い手にとってみれば安心してFinchを使える環境を整備してくれるということになります。AWSは開発者にツールの構築ではなく、アプリケーションの構築に集中してもらいたいと考えてるようです。
オープンソースとしての公開を優先したため、執筆時点ではmacOSのみの対応ですが、WindowsやLinuxの対応もロードマップとして追加したいと考えているようです。
AWSもFirecrackerというコンテナランタイムを開発しており、軽量なVMと後に出てくるcontainerdと組み合わせて動作しています。
FirecrackerをAWSが投資し独自で作るよりOSSのプロジェクトとして進める方が良いと判断したのかと考えています。
ここで気になるのが、デファクトスタンダードなOSS達がどんなものなのかということです。 本記事ではFinchと連携しているOSS(Lima、nerdctl、containerd、BuildKit)の紹介と、Finchが意識しているであろう他のOSSについても考えていきます。
OSSを紹介する前に予備知識としてコンテナの仕組みに少し寄り道します。
コンテナの仕組み
※加筆予定
- OCI
- CRI
Finchと連携しているOSS
Lima
https://github.com/lima-vm/lima/
Lima: Linux virtual machines (on macOS, in most cases)
Lima launches Linux virtual machines with automatic file sharing and port forwarding (similar to WSL2), and containerd.
Lima can be considered as a some sort of unofficial “containerd for Mac”.
Lima is expected to be used on macOS hosts, but can be used on Linux hosts as well.
LimaはmacOS上で動くLinux仮想マシンです。WindowsにおけるWSL2に似たものになります。 次に出てくるcontainerdをMacで使うためにLimaを使うことになります。
Limaの機能には以下のものが含まれています。 ARMもIntelも問題なく使えます。
✅ Automatic file sharing
✅ Automatic port forwarding
✅ Built-in support for containerd (Other container engines can be used too)
✅ Intel on Intel
✅ ARM on Intel
✅ ARM on ARM
✅ Intel on ARM
✅ Various guest Linux distributions: AlmaLinux, Alpine, Arch Linux, Debian, Fedora, openSUSE, Oracle Linux, Rocky, Ubuntu (default), …
Firecrackerを使わずにLimaにすることで、デファクトスタンダードを優先し開発者やユーザーの障壁を減らそうとしているように感じます。
containerd
An industry-standard container runtime with an emphasis on simplicity, robustness and portability.
containerdはコンテナランタイム(コンテナとコンテナイメージを管理するソフトウェア)です。 コンテナランタイムは低レベルランタイムと高レベルランタイムがあり、containerdは高レベルランタイムになります。こちらの紹介が詳しいです。
次に出てくるnerdctlも一緒に話に出てくることが多いです。
nerdctl
https://github.com/containerd/nerdctl
nerdctl: Docker-compatible CLI for containerd
nerdctlはcontainerdプロジェクトの中にあります。
Docker互換のCLIで、特徴としては以下のものがあげられます。
- ✅ Same UI/UX as docker
- ✅ Supports Docker Compose (nerdctl compose up)
コマンドでdockerと書いていたところをnerdctlとすれば動くというものになっています。サンプルを見ると以下のようになりdockerを使用していた人でも違和感なく使えるように作られています。
Basic usage
To run a container with the default bridge CNI network (10.4.0.0/24):
# nerdctl run -it --rm alpine
buildkit
https://github.com/moby/buildkit
BuildKit is a toolkit for converting source code to build artifacts in an efficient, expressive and repeatable manner.
BuildKitはmobyというDockerエコシステムのOSS開発プロジェクトで開発されている内の一つです。Dockerはmobyにリリースされたものをベースに作られます。 そのため、BuildKitはDocker上で動作するOSSなのですが、Dockerに限らず汎用のビルドフレームワークとしても使うことができます。 BuildKitが持つ役割は、このスライドの7ページからが詳しいです。
Githubに記載されている特徴は以下のようになっています。
Key features:
Automatic garbage collection
Extendable frontend formats
Concurrent dependency resolution
Efficient instruction caching
Build cache import/export
Nested build job invocations
Distributable workers
Multiple output formats
Pluggable architecture
Execution without root privileges
Finchが意識しているであろうOSS
Red HatのPodman
https://github.com/containers/podman
Podman: A tool for managing OCI containers and pods
Podmanはcontainerdのような高レベルランタイムです。Red Hatのエンジニアとオープンソースコミュニティが作ったもので、今はcontainersプロジェクト内でOSSとして公開されています。
Red HatのPodman紹介ページ
https://www.redhat.com/ja/topics/containers/what-is-podman
Dokcer Desktop有料化に伴いPodmanを試した人も多いのではないでしょうか。 AWSとしては、生まれが競合や同業種のOSSは一定の距離をとっているのかもしれません。
GoogleのgVisor
https://github.com/google/gvisor
gVisorのホームページ
https://gvisor.dev
What is gVisor?
gVisor is an application kernel, written in Go, that implements a substantial portion of the Linux system surface. It includes an Open Container Initiative (OCI) runtime called runsc that provides an isolation boundary between the application and the host kernel. The runsc runtime integrates with Docker and Kubernetes, making it simple to run sandboxed containers.
こちらは低レベルランタイムです。gVisorの思想としては、低レベルランタイムにセキュリティ境界を追加してコンテナへの攻撃に対するセキュリィを高めようというものです。 独立したカーネルとしてgVisorを挟むことでサンドボックス化したコンテナを作ることができます。こちらのページが詳しいです。
gVisorはGoで書かれていることもあり、AWSとしては一定の距離を持っているかもしれません。
まとめ
Finchが取り組もうとしていることと、Finchに関連するOSS、Finchから一定の距離がありそうなOSS(どれも便利だが)をまとめてきました。 これからのFinchの発展に期待していきながらコンテナをどんどん使っていきたいと思います。