Amazon Web Services ブログ

コンテナ開発用のオープンソースクライアント「Finch」のご紹介

この記事は Introducing Finch: An Open Source Client for Container Development (記事公開日: 2022 年 11 月 22 日) の翻訳記事です。

本日、新しいオープンソースプロジェクト Finch を発表できることを嬉しく思います。Finch は Linux コンテナをビルド、実行、公開するための新しいコマンドラインクライアントです。LimanerdctlcontainerdBuildKit などの厳選されたデファクトスタンダードのオープンソースコンポーネントと共に、macOS ネイティブのクライアントを簡単にインストールできます。Finch では、コンテナをローカルで作成して実行したり、オープンコンテナイニシアチブ (OCI) コンテナイメージをビルドして公開したりできます。

新しいプロジェクトである Finch は、ローンチ時点では基本的な機能のみを備えています。現時点 (記事公開日: 2022 年 11 月 22 日時点) では macOS のみのサポートであり、すべての Mac CPU アーキテクチャをサポートしています。プロジェクトを公開しない状態で進めるよりも、さまざまな意見が寄せられる状態の方が、オープンソースは最も成功すると私たちは感じています。私たちは機能追加やイノベーションを計画していますが、早い段階でプロジェクトを開始することで、すべての人にとってより堅牢で便利なソリューションが実現すると考えます。私たちは喜んで Issue に対処し、プルリクエストを受け入れる準備ができています。また、Finch を構成するオープンソースコンポーネントの採用が、これらのコンポーネントへの注目度を高めることを期待しています。オープンソースのメンテナンスとスチュワードシップという重要な作業により、多くの手が加わることを期待しています。特に Docker の CTO である Justin Cormack 氏は「私たちは Finch が containerd と BuildKit を採用したことを心強く思っており、AWS がアップストリームへの貢献に協力してくれることを楽しみにしている」と述べています。

私たちは関心を持ってくれる協力者と共に、公開された環境で Finch を開発できることを嬉しく思います。Finch を現在の基本的な出発点から、Windows および Linux プラットフォーム、およびロードマップに追加した追加機能をカバーするように拡張したいと考えています。あなたのアイデアもぜひお寄せください。Issue を開くか、プルリクエストを提出し、また Finch の Slack チャンネルでアイデアについて議論を始めましょう。Finch は Apache 2.0 ライセンスの下で開発されており、誰でも自由に使用できます。

なぜ Finch が生まれたのか

Linux 以外のホストで Linux コンテナをビルド、実行する場合、既存の商用製品だけでなく、目的に応じたオープンソースプロジェクトも多数存在します。企業によっては、既存のオープンソースコンポーネントから簡単なコマンドラインツールを構築できるかもしれません。しかし、ほとんどの組織は開発者にツールの構築ではなく、アプリケーションの構築に集中してもらいたいと考えています。

AWS ではコンテナツールに利用できるオープンソースコンポーネントを検討し始め、すぐに Lima の進歩に感銘を受けました。Lima は最近、Sandbox プロジェクトとしてCloud Native Computing Foundation (CNCF) に採用されました。Lima の目標は、containerd と nerdctl を Mac ユーザーに広めることです。これは、CNCF の Graduated プロジェクトである containerd の利用と貢献に対する AWS の既存の投資と合致しています。AWS は別のツールを導入してオープンソースの取り組みを断片化するのではなく、Lima との統合を決定し、プロジェクトに貢献しています。nerdctl と Lima の作成者であり、containerd、BuildKit、runc の長年のメンテナーである須田瑛大 (Akihiro Suda) 氏は、次のように述べています。「AWS の nerdctl と Lima へのコントリビュートや、これらのプロジェクトを中心にコミュニティが成長しているのを見てとても嬉しく思います。AWS のコントリビューターと協力して、Finch と一緒に Lima と nerdctl を改善できることを楽しみにしています」

Finch は、オープンソースのコンテナ開発ツールを厳選し組み合わせるという複雑さへの対応であり、最初は macOS 向けに提供され、将来的に Windows と Linux 向けにも対応する予定です。Lima と nerdctl に直接依存するコンポーネントを集約し、それらの依存関係とともに macOS 用のシンプルなインストーラーにパッケージ化しています。Finch は、macOS のネイティブクライアントを介して、Lima が管理する仮想マシンで実行されている nerdctl へのパススルーとして機能します。すべての可動部分は、シンプルで使いやすい Finch クライアントによって抽象化されています。Finch は、必要とするすべてのオープンソースコンポーネントとその依存関係を管理およびインストールするため、依存関係の更新や修正を管理する必要がなくなります。

中核となる Finch クライアントは常に、オープンソースでベンダーに依存しないプロジェクトで構成される、厳選されたディストリビューションです。また、私たちは Finch の利用者が特定のユースケースに合わせて独自の拡張機能の作成や付加価値の追加ができるように、カスタマイズ可能にしたいと考えています。私たちは、AWS のお客様がローカルコンテナを AWS クラウドサービスと簡単に統合できる拡張機能を必要としていることは承知しています。ただし、これらはオプトイン拡張であり、Finch が依存するオープンソースの中核となる機能や、アップストリームの依存関係に影響を与えたり、断片化したりすることはありません。拡張機能は個別のプロジェクトとして管理され、それぞれのリリースサイクルを持ちます。このモデルは、特定の機能を提供しつつ、Finch やアップストリームの依存関係とオープンに連携するという点で完璧なバランスを取っていると感じています。このプロジェクトはオープンソースであるため、目的に応じてカスタマイズされた、独自のコンテナクライアントを構築したいと考えている人にとって、Finch は最適な出発点となります。

要約すると、Finch では協調して動作するように構築、テストされたオープンソースのコンポーネントの共通スタックを厳選し、それらをシンプルなネイティブツールで結合しています。Finch はコンテナに関する多くの知識を結集したプロジェクトです。私たちのゴールは、コンテナワークフローの中核で利用されるコマンドに焦点を当てた、最小かつシンプルなbuild / run / push / pull の体験を提供することです。プロジェクトが進展するにつれ、開発者が仮想化コンポーネントをより透過的に利用できるようにして、フットプリントが小さく、起動時間を短縮できるようにすることと、Finch を自由にカスタマイズできる拡張性フレームワークの追求にも取り組んでいきます。

この先、Finch が新しいアイデアの実験場となったり、オープンソースのコンテナ開発ツールを求めていた既存のお客様をサポートする手段になることを期待しています。Finch を使用するのに AWS アカウントは必要ありません。AWS をご利用のお客様は、Finch を AWS のサービスと併用する際に、現在の AWS サポートプランに基づいてサポートを受けることができます。

Finch で何ができますか?

Finch は nerdctl と直接統合されています。これまで使い慣れてきた一般的なコマンドやオプションはすべて、Linux 上でネイティブに nerdctl を実行していた場合と同じように機能します。レジストリからコンテナイメージを取得したり、コンテナをローカルで実行したり、既存の Dockerfile を使用してコンテナイメージをビルドしたりできます。Finch ではエミュレーションを使用して、amd64 または arm64 アーキテクチャのコンテナイメージをビルド、実行することもできます。つまり、M1 Apple Silicon または Intel ベースの Mac どちらか (または両方) のアーキテクチャ用のイメージを構築できます。初回リリース時には、ボリュームとネットワークのサポートが行われ、複数のコンテナアプリケーションを実行、テストするための Compose がサポートされています。

プロジェクトリポジトリから Finch をインストールすると、コンテナのビルドと実行を開始できます。前述のとおり、初回リリースでは macOS のみがサポートされています。

Finch を macOS にインストールするには、最新のリリースパッケージをダウンロードしてください。パッケージファイルを開くと、macOS アプリケーションの標準的なインストール手順が示されます。

現時点で Finch には GUI は提供されておらず、シンプルなコマンドラインクライアントを提供しています。クラスター管理や他のコンテナオーケストレーションツールのための追加的な統合は行われていません。今後は、お客様が選択できるオプション機能にて、Finch に拡張性を持たせたいと考えています。

インストール後、Finch の仮想環境を初期化し、起動する必要があります。次のコマンドを実行して VM を起動します。

finch vm init

Finch の仮想環境を起動するには (再起動後など)、以下を実行します。

finch vm start

それでは、簡単なコンテナを実行してみましょう。run コマンドは、コンテナイメージがまだ存在しない場合はコンテナイメージをプルし、コンテナインスタンスを作成して起動します。--rm フラグは、コンテナの実行が終了するとコンテナを削除します。

finch run --rm public.ecr.aws/finch/hello-finch
public.ecr.aws/finch/hello-finch:latest:                                          resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:a71e474da9ffd6ec3f8236dbf4ef807dd54531d6f05047edaeefa758f1b1bb7e:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:705cac764e12bd6c5b0c35ee1c9208c6c5998b442587964b1e71c6f5ed3bbe46: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:6cc2bf972f32c6d16519d8916a3dbb3cdb6da97cc1b49565bbeeae9e2591cc60:   done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 0.9 s                                                                    total:   0.0 B (0.0 B/s)

                            @@@@@@@@@@@@@@@@@@@
                        @@@@@@@@@@@@    @@@@@@@@@@@
                      @@@@@@@                  @@@@@@@
                    @@@@@@                        @@@@@@
                  @@@@@@                            @@@@@
                 @@@@@                      @@@#     @@@@@@@@@
                @@@@@                     @@   @@@       @@@@@@@@@@
                @@@@%                     @     @@            @@@@@@@@@@@
                @@@@                                               @@@@@@@@
                @@@@                                         @@@@@@@@@@@&
                @@@@@                                  &@@@@@@@@@@@
                 @@@@@                               @@@@@@@@
                  @@@@@                            @@@@@(
                   @@@@@@                        @@@@@@
                     @@@@@@@                  @@@@@@@
                        @@@@@@@@@@@@@@@@@@@@@@@@@@
                            @@@@@@@@@@@@@@@@@@


Hello from Finch!

Visit us @ github.com/runfinch

Lima は、基盤となる仮想マシンのユーザー空間のエミュレーションをサポートします。以下の例で作成して使用するイメージはすべて Linux イメージですが、Lima VM はホストシステムの CPU アーキテクチャ (64 ビット Intel または Apple Silicon ベース) をエミュレートしています。以下の例では、お使いの Mac システムがどの CPU アーキテクチャを使用していても、どの CPU ファミリーのコンテナイメージでも作成、公開、使用できることを示します。Apple シリコンラップトップで x86_64 アーキテクチャのコンテナイメージをビルドし ECR にプッシュ、Intel ベースの Mac ラップトップで実行します。

コマンドを Apple シリコンベースの Mac で実行していることを確認するには、uname を実行してアーキテクチャが arm64 と表示されていることを確認します。

uname -sm
Darwin arm64

--platform オプションを使用して非ネイティブアーキテクチャを指定し、amd64 コンテナを作成、実行してみましょう。

finch run --rm --platform=linux/amd64 public.ecr.aws/amazonlinux/amazonlinux uname -sm
Linux x86_64

ビルドの際にも --platform オプションを使用することができます。2 行の簡単な Dockerfile を作成してみましょう。

FROM public.ecr.aws/amazonlinux/amazonlinux:latest
LABEL maintainer="Chris Short"

デフォルトでは、Finch はホストの CPU アーキテクチャプラットフォームに合わせてビルドします。上の例では CPU アーキテクチャプラットフォームは arm64 です。arm64 上で amd64 コンテナをビルドして ECR にプッシュしてみましょう。amd64 コンテナイメージをビルドするには、コマンドに --platform フラグを追加します。

finch build --platform linux/amd64 -t public.ecr.aws/cbshort/finch-multiarch .
[+] Building 6.5s (6/6) FINISHED
 => [internal] load build definition from Dockerfile                                                                           0.1s
 => => transferring dockerfile: 142B                                                                                           0.0s
 => [internal] load .dockerignore                                                                                              0.1s
 => => transferring context: 2B                                                                                                0.0s
 => [internal] load metadata for public.ecr.aws/amazonlinux/amazonlinux:latest                                                 1.2s
 => [auth] aws:: amazonlinux/amazonlinux:pull token for public.ecr.aws                                                         0.0s
 => [1/1] FROM public.ecr.aws/amazonlinux/amazonlinux:latest@sha256:d0cc2f24c888613be336379e7104a216c9aa881c74d6df15e30286f67  3.9s
 => => resolve public.ecr.aws/amazonlinux/amazonlinux:latest@sha256:d0cc2f24c888613be336379e7104a216c9aa881c74d6df15e30286f67  0.0s
 => => sha256:e3cfe889ce0a44ace07ec174bd2a7e9022e493956fba0069812a53f81a6040e2 62.31MB / 62.31MB                               5.1s
 => exporting to oci image format                                                                                              5.2s
 => => exporting layers                                                                                                        0.0s
 => => exporting manifest sha256:af61210145ded93bf2234d63ac03baa24fe50e7187735f0849d8383bd5073652                              0.0s
 => => exporting config sha256:474c401eafe6b05f5a4b5b4128d7b0023f93c705e0328243501e5d6c7d1016a8                                0.0s
 => => sending tarball                                                                                                         1.3s
unpacking public.ecr.aws/cbshort/finch-multiarch:latest (sha256:af61210145ded93bf2234d63ac03baa24fe50e7187735f0849d8383bd5073652)...
Loaded image: public.ecr.aws/cbshort/finch-multiarch:latest%

finch push public.ecr.aws/cbshort/finch-multiarch
INFO[0000] pushing as a reduced-platform image (application/vnd.docker.distribution.manifest.v2+json, sha256:af61210145ded93bf2234d63ac03baa24fe50e7187735f0849d8383bd5073652)
manifest-sha256:af61210145ded93bf2234d63ac03baa24fe50e7187735f0849d8383bd5073652: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:474c401eafe6b05f5a4b5b4128d7b0023f93c705e0328243501e5d6c7d1016a8:   done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 27.9s                                                                    total:  1.6 Ki (60.0 B/s)

この時点で、Apple シリコンベースの Mac でコンテナイメージを作成しています。このコンテナイメージは、OCI 準拠のコンテナランタイムを備えた Intel / AMD CPU アーキテクチャの Linux ホストであればどれでも使用できます。これには、Intel または AMD CPU の EC2 インスタンス、オンプレミスの Intel NUC、または次に示す Intel の CPU ベースの Mac などがあります。この機能を示すために、新しく作成したコンテナイメージを Finch が既にインストールされている Intel ベースの Mac で実行します。uname の実行でこの Mac のアーキテクチャが x86_64 であることを確認しましょう。これは、Go 言語が 64 ビットの Intel / AMD CPU を amd64 として参照しているものに似ています。

uname -a
Darwin wile.local 21.6.0 Darwin Kernel Version 21.6.0: Thu Sep 29 20:12:57 PDT 2022; root:xnu-8020.240.7~1/RELEASE_X86_64 x86_64

finch run --rm --platform linux/amd64 public.ecr.aws/cbshort/finch-multiarch:latest uname -a
public.ecr.aws/cbshort/finch-multiarch:latest:                                    resolved       |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:af61210145ded93bf2234d63ac03baa24fe50e7187735f0849d8383bd5073652: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:474c401eafe6b05f5a4b5b4128d7b0023f93c705e0328243501e5d6c7d1016a8:   done           |++++++++++++++++++++++++++++++++++++++|
layer-sha256:e3cfe889ce0a44ace07ec174bd2a7e9022e493956fba0069812a53f81a6040e2:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 9.2 s                                                                    total:  59.4 M (6.5 MiB/s)
Linux 73bead2f506b 5.17.5-300.fc36.x86_64 #1 SMP PREEMPT Thu Apr 28 15:51:30 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

コマンドとオプションは使い慣れたものであることがわかります。Finch はコマンドを nerdctl クライアントに渡しているので、コマンドの構文とオプションはすべて見慣れたものでしょう。初めての方は nerdctl のドキュメントを参照してください。

別のユースケースとして、マルチコンテナアプリケーションのテストがあります。ローカルで実行したいアプリの例として yelb を使用してみましょう。yelb とは何でしょうか?キャッシュ、データベース、アプリケーションサーバー、UI を備えたシンプルな Web アプリケーションです。これらはすべて、これから作成するネットワーク上のコンテナとして実行されます。yelb をローカルで実行して、Finch のマイクロサービス向けの Compose 機能をデモします。

finch vm init
INFO[0000] Initializing and starting finch virtual machine...
INFO[0079] Finch virtual machine started successfully

finch compose up -d
INFO[0000] Creating network localtest_default
INFO[0000] Ensuring image redis:4.0.2
docker.io/library/redis:4.0.2:                                                    resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:cd277716dbff2c0211c8366687d275d2b53112fecbf9d6c86e9853edb0900956:    done           |++++++++++++++++++++++++++++++++++++++|

[ snip ]

layer-sha256:afb6ec6fdc1c3ba04f7a56db32c5ff5ff38962dc4cd0ffdef5beaa0ce2eb77e2:    done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 11.4s                                                                    total:  30.1 M (2.6 MiB/s)
INFO[0049] Creating container localtest_yelb-appserver_1
INFO[0049] Creating container localtest_redis-server_1
INFO[0049] Creating container localtest_yelb-db_1
INFO[0049] Creating container localtest_yelb-ui_1

上記の出力は、ネットワークの作成や多くのコンテナイメージのプルと起動が行われて、現在ローカルテスト環境ですべて動作していることを示しています。

このテストケースでは、小規模なチームがどこで昼食をとるべきかを判断するために Yelb を使用しています。URL をチームと共有し、皆が投票し、その結果を UI で確認します。

Finch の次の展望は?

プロジェクトはまだ始まったばかりです。開発チームは機能の追加に繰り返し取り組んでいきますので、皆さんからのご意見をお待ちしています。仮想化を最小限にとどめ、起動時間を短縮してユーザーにとってわかりやすいものにするというアイディアがあります。また、Finch を拡張可能にして、オプションのアドオン機能を可能にすることにも関心があります。プロジェクトが発展するにつれ、開発チームは必要に応じてアップストリームの依存関係にコントリビュートするようにします。私たちは、依存関係の中核である nerdctl、containerd、BuildKit、および Lima をサポートし、その成功に貢献できることを嬉しく思います。前に述べたように、Finch のエキサイティングな点の 1 つは、Finch が依存するプロジェクトに光を当てることです。

Finch のプロジェクトにぜひご参加ください!議論を始めたり、新しいアイデアで Issue を挙げたり、見つけたバグを報告してください。私たちはあなたのプルリクエストに非常に興味を持っています。私たちはユーザーやコントリビューターからの意見を取り入れ、マイルストーンとロードマップを構築することで、Finch をパブリックの場で進化させる予定です。また、コンテナのビルドや日々の使用経験、Finch がどのように役立つかについてのフィードバックもぜひお寄せください!

翻訳はソリューションアーキテクトの加治が担当しました。原文はこちらです。