我试用了Finch – Finch命令几乎可以作为docker和docker-compose命令使用

我最近尝试了在2022年AWS re:Invent上发布的Finch,并想写下对它的感受。

Finch是什么?

 

Finch被認為是一種在桌面(本地)環境中構建和執行容器的開源軟件,在某種程度上可以替代Docker Desktop。

下面的描述说明了Finch用于实现桌面容器环境的工具集。

Finch提供了与nerdctl集成的简单客户端。对于核心的构建/运行/推送/拉取命令,Finch依赖于nerdctl来处理繁重的工作。它与containerd一起使用来进行容器管理,并与BuildKit一起处理Open Container Initiative(OCI)镜像构建。这些组件都通过Lima管理的虚拟机汇集在一起并运行。
来源:https://github.com/runfinch/finch

    • コアのbuild/run/push/pullコマンドはnerdctlを活用

 

    • コンテナーランタイムにはcontainerdを活用

 

    • Open Container Initiative (OCI) イメージビルドにBuildKitを活用

 

    仮想マシン管理にLimaを活用

为了实现桌面容器环境,上述工具集是如何相互协作的,在文章《Container Tools, Tips, and Tricks – Issue #3》中有一幅非常明晰的插图进行了介绍,我在这里将其分享。

目前,Finch只支持macOS,无法在Windows或Linux上使用。

此外,虽然我只使用过Finch和Docker Desktop,但还有一些其他可以实现桌面容器环境的工具,在此进行介绍。

    • Docker Desktop

 

    • Rancher Desktop

 

    • Podman Desktop

 

    • Colima

 

    Finch

等等,供您参考。

我在Finch上尝试过的事情。

这样的话: 充分利用环境

    • MacBook Pro (OS: Monterey)

 

    • Processor 2.5 GHz Dual-Core Intel Core i7

 

    Memory 16 GB

finch的安装方式

首先,通过brew命令安装finch。

brew install --cask finch

虚拟机启动

为了使用Finch的虚拟机(以下简称为VM),需要使用命令finch vm init进行初始设置。只需要执行一次即可。这样就可以启动VM了。

finch vm init

另外,从第二次开始,可以使用以下命令分别启动和停止VM。

finch vm start
finch vm stop

尝试从Docker Hub拉取容器镜像并运行。

因此,由於容器已經準備就緒,我們將嘗試使用下面的finch run命令來執行Docker Hub的容器映像。

我认为您可以使用docker-supermario作为示例容器映像。基本上,您可以使用与docker命令相同的选项来执行它。

finch run -d -p 8600:8080 docker.io/pengbai/docker-supermario:latest

在容器启动后,通过finch ps命令来查看启动的容器列表。

finch ps

CONTAINER ID    IMAGE                                         COMMAND              CREATED           STATUS    PORTS                     NAMES
05a1aa06b301    docker.io/pengbai/docker-supermario:latest    "catalina.sh run"    19 seconds ago    Up        0.0.0.0:8600->8080/tcp    docker-supermario-05a1a

我通过这个URL(localhost:8600)发现可以访问本地8600端口,于是尝试在浏览器中打开。

Screen Shot 2022-12-20 at 12.09.24.png

显示结果与预期一样,一切顺利。

尝试通过Dockerfile构建镜像。

接下来,我们尝试使用`finch build`命令构建图像。
作为示例,我们尝试构建我制作的awsping工具的容器图像。

首先要克隆代码。

git clone git@github.com:yokawasa/awsping.git                          
cd awsping                                                             

可以通过finch build命令从Dockerfile构建映像,方法如下。

finch build -t awsping .

尝试使用finch run命令执行最后构建的图像。

finch run awsping

以下是容器执行的输出结果。

finch run awsping

 1.  [ap-northeast-1]  80.342267ms
 2.  [ap-northeast-2]  120.614401ms
 3.  [ap-southeast-1]  210.190698ms
 4.  [us-west-2]       279.588928ms
 5.  [ap-southeast-2]  279.89593ms
 6.  [us-west-1]       280.23793ms
 7.  [ap-south-1]      328.27209ms
 8.  [ca-central-1]    401.566333ms
 9.  [us-east-2]       407.018351ms
10.  [eu-west-2]       513.608706ms
11.  [eu-west-1]       537.589785ms
12.  [eu-west-3]       539.03179ms
13.  [eu-central-1]    554.777842ms
14.  [eu-north-1]      559.914859ms

在这里,我使用相同的选项在finch命令中进行了与docker命令相同的操作。

尝试使用Docker Compose

正如之前所述,Finch在执行build/run/push/pull等核心命令时使用了nerdctl。而且,这个nerdctl也支持Docker Compose。因此,finch命令也支持Docker Compose,并且可以通过finch compose命令来使用它。

使用在awesome-compose仓库中管理的nginx-golang-mysql作为示例。

首先需要将代码进行克隆。

git clone git@github.com:docker/awesome-compose.git
cd awesome-compose/nginx-golang-mysql

同一目录下存在的Docker compose文件(compose.yaml)的内容如下所示。

services:
  backend:
    build:
      context: backend
      target: builder
    secrets:
      - db-password
    depends_on:
      db:
        condition: service_healthy

  db:
    # We use a mariadb image which supports both amd64 & arm64 architecture
    image: mariadb:10-focal
    # If you really want to use MySQL, uncomment the following line
    #image: mysql:8
    command: '--default-authentication-plugin=mysql_native_password'
    restart: always
    healthcheck:
      test: ['CMD-SHELL', 'mysqladmin ping -h 127.0.0.1 --password="$$(cat /run/secrets/db-password)" --silent']
      interval: 3s
      retries: 5
      start_period: 30s
    secrets:
      - db-password
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=example
      - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db-password
    expose:
      - 3306

  proxy:
    image: nginx
    volumes:
      - type: bind
        source: ./proxy/nginx.conf
        target: /etc/nginx/conf.d/default.conf
        read_only: true
    ports:
      - 80:80
    depends_on: 
      - backend

volumes:
  db-data:

secrets:
  db-password:
    file: db/password.txt

那么,我们试着用finch compose up命令根据Docker compose文件创建和启动容器吧。与docker-compose相同,可以使用-d选项以后台模式启动容器。

finch compose up -d

使用finch compose ps命令查看已启动的容器列表。

finch compose ps

NAME                            COMMAND                   SERVICE    STATUS     PORTS
nginx-golang-mysql_db_1         "docker-entrypoint.s…"    db         running
nginx-golang-mysql_backend_1    "/code/bin/backend"       backend    running
nginx-golang-mysql_proxy_1      "/docker-entrypoint.…"    proxy      running    0.0.0.0:80->80/tcp

因为我们确认可以通过本地端口80访问,所以尝试使用curl命令访问localhost:80。

curl localhost:80

["Blog post #0","Blog post #1","Blog post #2","Blog post #3","Blog post #4"]

如愿以偿,输出了预期的结果。

而且,你还可以使用finch compose logs命令来像docker-compose命令一样,对日志进行tail的操作。

finch compose logs -f

proxy_1   |/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
proxy_1   |/docker-entrypoint.sh: Configuration complete; ready for start up
backend_1 |10.4.4.3 - - [24/Dec/2022:10:35:37 +0000] "GET / HTTP/1.1" 200 77
proxy_1   |10.4.4.1 - - [24/Dec/2022:10:35:37 +0000] "GET / HTTP/1.1" 200 77 "-" "curl/7.79.1" "-"

虽然有些杂乱,但我成功地确认了finch compose命令的操作。最后,使用以下命令停止并删除容器。

finch compose down -v

INFO[0000] Removing container nginx-golang-mysql_proxy_1
INFO[0000] Removing container nginx-golang-mysql_backend_1
INFO[0000] Removing container nginx-golang-mysql_db_1
INFO[0001] Removing network nginx-golang-mysql_default
INFO[0001] Removing volume nginx-golang-mysql_db-data
注意事项:关于Dockerfile语法扩展
当我首次克隆awesome-compose仓库中的nginx-golang-mysql,并执行finch compose up -d命令时,出现了以下错误:
Dockerfile:1
——————–
1 | >>> # syntax=docker/dockerfile:1.4
2 | FROM –platform=$BUILDPLATFORM golang:1.18-alpine AS builder
3 |
——————–
错误:解析失败:无法创建shim任务:OCI运行时创建失败:runc创建失败:无法启动容器进程:容器初始化期间发生错误:将”/tmp/buildkit-metadata3881195025″挂载到”/run/config/buildkit/metadata”失败:mount /tmp/buildkit-metadata3881195025:/run/config/buildkit/metadata(通过/proc/self/fd/6), 标志:0x1021:操作不允许:未知
FATA[0002] 无法识别的镜像格式
FATA[0003] 构建镜像nginx-golang-mysql_backend时发生错误:退出状态1
FATA[0003] 退出状态1经过调查发现,似乎是Dockerfile中以下语法的问题,因此删除该行后重新执行finch compose up -d命令后,容器的创建和启动顺利完成。
# syntax=docker/dockerfile:1.4

根据文章 “Dockerfile v1.4.0 以降のヒアドキュメント機能を使うときにハマったこと” ,这个 # syntax=docker/dockerfile:1.4 是Dockerfile的扩展语法。当启用BuildKit时,使用带有这个语法的Dockerfile进行构建,会使用docker/dockerfile:1.4镜像作为BuildKit前端,并以v1.4的语法读取Dockerfile。因此,请注意finch compose不支持这个语法。

指定CPU架构

Finch可以使用–platform选项指定CPU架构。例如,在Apple Silicon M1系统上以x86-64 CPU架构(amd64)运行容器时,可以通过–platform选项指定为amd64。

finch run --rm --platform=amd64 public.ecr.aws/amazonlinux/amazonlinux uname -ms

芬奇的设置

Finch的设置文件位于${HOME}/.finch/finch.yama文件中,并在首次启动时创建。

cat  ~/.finch/finch.yaml

cpus: 2
memory: 4GiB

到2022年12月,仅能设置CPU和内存。有关配置文件的详细信息,请参阅此处。

印象

通过尝试使用finch命令,我发现它几乎可以作为docker或docker-compose命令使用,虽然这次只是简单试用。此外,尽管我没有详细测量,但从感觉上来说,与Docker桌面版相比,finch的内存占用量明显减少了很多。

根据Finch仓库的问题列表来看,与Docker Desktop相比,Finch存在一些无法使用的命令以及稳定性等方面的各种问题。而且目前只支持macOS,这也是一个限制。就我的使用情况而言,Finch可以充当足够替代Docker Desktop的角色,但普遍来说,将其称为Docker Desktop的替代品还为时过早。

让我们期待未来的进化吧。

广告
将在 10 秒后关闭
bannerAds