Finchでcontainerdに入門した
AWSがFinchを発表した。
コンテナ開発用のオープンソースクライアント「Finch」のご紹介 | Amazon Web Services ブログ
筆者はMacを使っていて、Docker Desktopまたは、colima x Docker CLIを利用して、Dockerの開発環境を実現している。Dcoker Desktopは内部でHyperKit(macOS hypervisor)を利用してLinuxのVMを立ち上げ、その中でdockerdを実行している。Docker導入当初はDocker Desktopを利用していたが、Docker DesktopのGUIは使っていなかったので、よりシンプルなcolimaに移行した。colimaはLimaをベースに
- Limaの設定ファイルを生成してLinux環境を準備
- Linux on Limaの環境にDockerをインストール
- ホスト側(つまりmacOS側)のDocker CLIとDocker on Linux on Limaを透過的に接続できる環境を用意
ということを行なって、Docker開発のサポートをしてくれる。この時点で、Limaの存在は認知していたが、AWSの記事を見るとLima自体結構盛り上がっているようだ。
今回のFinchの発表、つまりAlternative Dockerの参入の背景はどんなものがあるのだろうか?正直言うとKubernetesは実際に利用したことがなく疎いため、KunernetesがDockerをやめた話を今回のFinchをきっかけに以下の記事を見つけ始めて認識した。
参考:Dockerからcontainerdへの移行 (NTT Tech Conference 2022発表レポート) | by Akihiro Suda | nttlabs | Medium
詳細を見てみると、従来、Kubernetesは分散環境上のコンテナ管理のためにDockerを触っていたが、近年はcontainerdを直接利用するようになったらしい。
containerdを直接利用?containerd?コンテナ技術何も分かっていなかったことが分かった。
containerd は元々、Dockerの下でコンテナの基本的な管理機能を提供するデーモンとして、2015年にDocker社により開発された。containerdのスコープは徐々に拡大して、現在では、Docker Engineのほぼ全てをカバーしているようだ。例えば、nerdctlはcontainerdのCLIだ。UXはDocker CLIとほぼ同じで、Docker Composeも対応している(nerdctl compose
)。
Kubernetesに話を戻すとCHANGELOGによれば、dockershimというDockerのCRI(Container Runtime Interface) のメンテナンス上の問題が起きていた模様。
Docker support in the kubelet is now deprecated and will be removed in a future release. The kubelet uses a module called "dockershim" which implements CRI support for Docker and it has seen maintenance issues in the Kubernetes community. We encourage you to evaluate moving to a container runtime that is a full-fledged implementation of CRI (v1alpha1 or v1 compliant) as they become available.
kubernetes/CHANGELOG-1.20.md at master · kubernetes/kubernetes
整理すると、containerdがDockerから生まれ派生し、独自に領域を増やすと同時に、Kubernetesのメンテナンス上の問題によってDockerではなくcontainerdが選ばれ、containerdを直接管理するための方法も理由も揃ってきたということになるか。そして、これらを背景にして、Finchの登場となった。Finchはcontainerd, nerdctlとLimaを組み合わせたツールだ。Finch登場以前は、containerdを利用する場合は、Limaを直接利用する場合がほとんどだっただろう。
さらにFinchの記事にはBuildKitについても触れられているのでこちらも抑えておこう。これまでと同様にDockerとの関係性を中心に理解していこうと思う。私も身に覚えがあって、DOCKER_BUILDKIT=1 docker build .
のようなものを目にする機会があった。これはDockerでBuildKitを利用する方法だ。BuildKitにはDockerデフォルトのビルドに対して以下のようなメリットがあるようだ。
- 複数ステージのビルドを並列実行できる
- 機密情報をビルド成果物(キャッシュを含む)に残さない仕組み(Dockerfile 内の RUN --mount コマンド)が使える
- ローカルファイルをビルド時のみに使える
- リモートファイルをビルド時にSSH接続して取得できる
- ビルドキャッシュのインポート/エクスポートが出来る
- 分散ビルドが出来る
なるほど。ビルドキャッシュや並列実行は強力そうだ。Finchではこれらの機能をデフォルトで利用できるという認識で良いかと思う。
Finchの意義を理解できたところで、実際に使ってみよう。
brew install finch
まず、finchの構成を設定することをしてみた。READMEに沿って以下のように設定してみた。
cpus: 8
memory: 8GiB
そしてvmを初期化する。
finch vm init
これでvmが立ち上がった。
次はDocker CLIやnerdctlと同じように、Docker Composeを利用してみる。
finch compose up
ここで、Dockerとcontainerdとの挙動の違いにいくつか出会ったので紹介しておく。
まず、portの省略的な記述が無効だった。
db:
ports:
- - 5432
+ - 5432:5432
あとは、contextの外のファイルを読み込もうとするとエラーになった。今回はファイルの置き場所を変えることで対応した。
app:
volumes:
- - ~/.gitconfig:/root/.gitconfig
+ - ./.gitconfig:/root/.gitconfig
それ以外は、Dockerの場合と同じだった。
以上、Finchをきっかけにcontainerdやコンテナ周辺の技術についての理解を深めることができた。今後は徐々にFinchへの移行を進めていった方が潮流に乗ることができるような気がしている。
Discussion