Docker Desktopの代わりになる?AWSが発表したFinchを触ってみた

finch その他

こんにちは。INAPのShosukeです。

今回は以前話題になっていたFinchとコンテナ技術についてまとめてみたいと思います。

Finchとは

FinchはAWSが発表したコンテナをビルド、実行、公開するコマンドラインクライアントです。Docker Desktopの代替として期待されています。

Finchには以下のような特徴があります。

  • オープンソース
  • 無料
  • macOS専用(2023/1月現在)今後はWindowsとLinuxに対応する予定らしい
  • AWSが主導しているが、AWSを便利に扱えるような機能は現時点ではない
  • Lima, containerd, nerdctl, BuildKitが利用されている
  • Docker Hubからイメージをプルすることも可能
  • composeを利用して、複数コンテナの連携も可能
  • CPUはintelまたはApplieシリコンのみ利用可能
  • Dockerと同じくGoで開発されている

用語紹介

Lima・・・macOSで利用されるLinuxの仮想化技術。Finchではこれを利用してcontainerdを動かし、コンテナを動かす環境を作成している。

containerd・・・コンテナの実行を行うランタイム。FinchではDockerではなくcontainerdを使用してコンテナの管理を行っている。また、Kubernetesのコンテナ管理にも使用されている。

nerdctl・・・containerdの操作をDockerコマンドのように扱えるようにする。これによりDockerユーザーが、Dockerを操作するようにFinchを扱うことができる。

BuildKit・・・DockerfileからDockerイメージを作成できる。

そもそもDockerとは何か?

Dockerは、コンテナ型の仮想化を行うプラットフォームです。コンテナ型の仮想化は1つの物理マシン上に複数の仮想環境を立ち上げることができます。

コンテナ型の仮想化はDockerだけでなく、containerdなどもあります。

コンテナ型の仮想化には以下のような特徴があります。

  • ホストOS(PCに最初から入っているOSのこと)の上にゲストOS(仮想化環境で使用するOS)をのせないので処理が早く、使用するPCのリソースが少なく済む。
  • ホストOSのカーネルをDockerを通して利用している。各仮想環境は1つのプロセスとして扱われる。
  • コンテナの複製と配布が容易なため以下のメリットがある
    • 開発チームのメンバーが同じ開発環境で開発を行える
    • 本番環境にアプリをデプロイする際にも、コンテナを利用することで簡単にアプリが動作する環境を作成することが出来る

Docker自体はLinuxでしか動作できないので、WindowsやmacOSでDockerを動かすためのアプリが必要になります。それがDocker Desktop, Lima, そして今回取り上げるFinchがそのアプリに当たります。Finchは内部でLimaを利用しています。

余談ですが、今までメジャーであったDocker Desktopの有料化が決まったことで、Finchのような無料の代替アプリに注目が集まっています。

また、コンテナを作成するには、Dockerイメージというコンテナの設計図が必要になります。

この設計図をもとにコンテナを作成します。

設計図であるDockerイメージを入手するには、Docker Hubというイメージの共有サイトを利用するか、Dockerfileを利用して自分で作成することができます。

Finchの使用方法

インストールする

brewコマンドでインストールすることが出来ます。

brew install –cask finch

以下のリンクからもダウンロードすることができます。

Releases · runfinch/finch
The Finch CLI an open source client for container development - runfinch/finch

Finchを起動する

Docker Desktopのような自動起動してくれる機能がないので、手動で起動する必要があります。

[~]$ finch vm init
INFO[0000] Using default values due to missing config file at “/Users/username/.finch/finch.yaml”
INFO[0000] “/Users/username/.finch” directory doesn’t exist, attempting to create it
INFO[0000] binaries directory doesn’t exist
INFO[0000] Requesting root access to finish network dependency configuration
INFO[0000] sudoers file not found: open /etc/sudoers.d/finch-lima: no such file or directory
INFO[0004] Initializing and starting Finch virtual machine…
INFO[0185] Finch virtual machine started successfully

コンテナを起動する

テストコンテナを起動します。Dockerと同じく「run」で実行します。

[~]$ finch run –rm public.ecr.aws/finch/hello-finch

下の画像が実行結果です。finch(実際に存在する鳥)のアスキーアートが表示されます。

また、FinchにはDocker Engineに利用されているBuildKitが組み込まれているため、Dockerfileからイメージをビルドすることができます。

「hello world」と出力するDockerfileを作成します。

FROM ubuntu
CMD [“echo”,”hello world”]
# Dockerfileがあることを確認
[~/finch_sample/project]$ ls
Dockerfile

# Dockerfileからイメージをビルドする。ubuntuという名前でタグ付けを行う
[~/finch_sample/project]$ finch build . -t ubuntu
[+] Building 50.0s (5/5) FINISHED
=> [internal] load build definition from Dockerfile                                                                                               0.2s
=> => transferring dockerfile: 75B                                                                                                                0.0s
=> [internal] load .dockerignore                                                                                                                  0.1s
=> => transferring context: 2B                                                                                                                    0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest                                                                                   4.7s
=> [1/1] FROM docker.io/library/ubuntu@sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9                                   42.0s
=> => resolve docker.io/library/ubuntu@sha256:27cb6e6ccef575a4698b66f5de06c7ecd61589132d5a91d098f7f3f9285415a9                                    0.1s
=> => sha256:6e3729cf69e0ce2de9e779575a1fec8b7fb5efdfa822829290ab6d5d1bc3e797 29.36MB / 30.43MB                                                  44.9s
=> exporting to image                                                                                                                            45.0s
=> => exporting layers                                                                                                                            0.0s
=> => exporting manifest sha256:1e4dfd24c713b1e5b177fd363419586069659a7db8ab6bfdb9ccfacde482cfac                                                  0.0s
=> => exporting config sha256:5b98ee7777fb07070b69f5efa72db4f3af2ac757192a95db13d3a59c75fbb0e7                                                    0.0s
=> => naming to docker.io/library/ubuntu:latest                                                                                                   0.0s
=> => unpacking to docker.io/library/ubuntu:latest                                                                                               44.9s

# イメージの一覧を確認すると、ubuntuという名前のイメージが作成されている。
[~/finch_sample/project]$ finch images
WARN[0000] unparsable image name “<none>@sha256:14c6ae3ba7b4b5de1c15405bc4490c372d055ed4b3ba7572a0112562d977657e”  error=”invalid reference format”REPOSITORY                          TAG       IMAGE ID        CREATED           PLATFORM       SIZE         BLOB SIZE<none>                              <none>    14c6ae3ba7b4    4 hours ago       linux/amd64    962.8 MiB    339.1 MiBpython                              latest    14c6ae3ba7b4    28 minutes ago    linux/amd64    962.8 MiB    339.1 MiBubuntu                              latest    1e4dfd24c713    24 minutes ago    linux/amd64    83.4 MiB     29.0 MiBpublic.ecr.aws/finch/hello-finch    latest    a71e474da9ff    4 hours ago       linux/amd64    1.7 MiB      1.0 MiB

# ubuntuを実行すると「hello world」が出力された。

[~/finch_sample/project]$ finch run ubuntu
hello world

Dockerと同じようにDockerfileからコンテナをビルド出来ることが分かりました。

コマンドの種類について

Finchでは下のようなコマンドが利用できます。nerdctlが利用されているだけあって必要十分なコマンドは揃っている印象です。

[~/Documents/test]$ finch -h
Finch: open-source container development tool

Usage:
  finch [command]

Available Commands:
  build       Build an image from Dockerfile
  builder     Manage builds
  commit      Create a new image from a container’s changes
  completion  Generate the autocompletion script for the specified shell
  compose     Compose
  container   Manage containers
  cp          Copy files/folders between a running container and the local filesystem
  create      Create a new container
  events      Get real time events from the server
  exec        Run a command in a running container
  help        Help about any command
  history     Show the history of an image
  image       Manage images
  images      List images
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a container registry
  logout      Log out from a container registry
  logs        Fetch the logs of a container
  network     Manage networks
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image from a registry
  push        Push an image or a repository to a registry
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  system      Manage containerd
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Shows Finch version information
  vm          Manage the virtual machine lifecycle
  volume      Manage volumes
  wait        Block until one or more containers stop, then print their exit codes

Flags:
      –debug     running under debug mode
  -h, –help      help for finch
  -v, –version   version for finch

Use “finch [command] –help” for more information about a command.

Finchの今後について

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


プロジェクトはまだ始まったばかりです。開発チームは機能の追加に繰り返し取り組んでいきますので、皆さんからのご意見をお待ちしています。仮想化を最小限にとどめ、起動時間を短縮してユーザーにとってわかりやすいものにするというアイディアがあります。また、Finch を拡張可能にして、オプションのアドオン機能を可能にすることにも関心があります。プロジェクトが発展するにつれ、開発チームは必要に応じてアップストリームの依存関係にコントリビュートするようにします。

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

Finchは2022の11月に公開されたばかりなので、まだまだ発展途上のプロジェクトです。

上の記事を読む限りでは、FinchとAWSを組み合わせて差別化するよりも、ユーザーにとって軽快で使いやすいものを目指しているようです。

ただ、ユーザーからのアイディアを取り入れていきたいようなので、今後Dockerにはないユニークな機能が生まれるかもしれないです。

issueを見る限りバグ関連のものが大半なので、暫くは機能追加よりも安定化を目指すと思われます。

何か欲しい機能があれば、ぜひissueなどでコメントしてみてください!

おわりに

使ってみた感想としては、コンテナ環境を作るための、Linux VM、コンテナランタイム、ビルドツールが全て入っており、無料ながら非常に使いやすくて良いなと感じました。

使ってみたところバグにも遭遇せず、ビルド速度にも不満を感じなかったので、Docker Desktopの料金がネックに感じている法人は導入しても良いと思います。

ただ、私達の会社は大人数でなくDocker Desktopを無償で利用することができ、Dockerにも不満がないため業務への導入はもう一歩足りないかなぁという印象です。

公開から僅かの日数でここまでのクオリティに達しているので、今後AWSとの連携性が高まれば一気に普及するのではないかと思うほどのポテンシャルを感じました。

また、今回のブログを書くことで今まで理解せずに利用していたDockerの内部を知る良い機会になりました。

ここまで読んでいただきありがとうございました。

タイトルとURLをコピーしました