※ 本記事はDMM WEBCAMP mentor Advent Calendar 2022 8日目のエントリーです。
先日の「AWS re:Invent 2022」でFinchというDocker Desktop代替のオープンソースクライアントが発表されました。
OSSなのでDocker Desktopの有料化や値上げ対策としても優秀ですし、何よりLimaベースなのでMacOSでも高速に動作することが魅力です。というか現在はMacOSでのみ動作するようです。
本記事ではそんなFinchを用いて、Dockerからどのくらい早くなったのかを検証します。
前提
以下のMacBook 14インチを使用しています。
Model Name: MacBook Pro
Model Identifier: MacBookPro18,3
Model Number: MKGP3J/A
Chip: Apple M1 Pro
Total Number of Cores: 8 (6 performance and 2 efficiency)
Memory: 16 GB
Finchのインストール
Githubのリリースページから自分の環境に適したアーキテクチャの.pkg
ファイルをダウンロードして展開します。
僕はM1 Proを使用しているためaarch64
の方です。
インストールが完了したら、以下のコマンドを打って初期設定をします。
$ finch vm init
Dockerを使う際にはDocker Desktopが立ち上がってなければならないように、Finchを使う際にもFinch環境が立ち上がっている必要があります。
init
後は自動で環境が立ち上がっているので問題ありませんが、PC本体の再起動等は
$ finch vm start
でFinch環境が起動します。
インストールできているか確認するには、以下のコマンドがお勧めです。
$ 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
Finch(小鳥)のAAが表示されたらインストール成功です。
今実行したfinch run --rm public.ecr.aws/finch/hello-finch
のように、Docker Desktopを使っていた際のコマンドのdocker
部分をfinch
に置き換えれば、基本的にはDockerで使用できていた全てのコマンドが使用できるそうです。
ベンチマーク
以下の2ファイルを用意します。
services:
bench:
image: python:3.11.0-slim-bullseye
volumes:
- .:/app
command: python /app/main.py
def main(n: int):
with open("/tmp/log.txt", "w") as f:
f.write(f"Called: n = {n}")
if n < 3:
return 1
return main(n-1) + main(n-2)
if __name__ == "__main__":
print(main(26))
フィボナッチ数列の第26項を計算するコードです。より実際のアプリケーションに近いベンチマークができるように、計算中の項を/tmp/log.txt
書き込むようにしました。実はこれが無いとDockerとFinchで差はほとんど出ません。ファイルの書き込みは実際のアプリケーションでは、アプリケーションのビルドや、ライブラリのインストールに対応します。
$ time docker compose up
$ time finch compose up
で時間を計測しました。ただし、各コマンドは2回ずつ実行し、それぞれ2回目のデータを計測結果として採用しました(1回目はビルドが含まれるため)。
計測結果
Docker | Finch |
---|---|
27.076[s] | 21.078[s] |
Dockerに比べてFinchの方が、22%速く処理を終えました。今回のコードよりも読み書きの部分の比重が大きくなってくると、この差は更に広がります。
例えば/tmp/log.txt
を開いて計算中の項を書き込む処理をコピペ3倍多くすると、
Docker | Finch |
---|---|
1:20.29[s] | 58.385[s] |
といった具合に27%程度速くなります。
という訳でこの結果のパーセンテージに全く意味はないのですが、読み書きを頻繁に行う場合にはFinchの方が速くなるということだけ知ってもらえれば大丈夫です。
余談
手元で試したところ
- GCCを使ったコンパイル
- マウント中のファイルの読み書き
辺りはむしろDockerの方が1.5倍程度速かったです。Limaに詳しい人ならこれもFinchの方が速くできそうな気はしているのですが、その辺りに気を使ってまでFinchを使うメリットは、Docker Desktopと違って企業利用でも無料なことくらいな気はしています。
結論
金銭面を除けば、まだDocker Desktopを使ってて良いんじゃない......? と思います。