扩展架构

扩展是在Docker Desktop内部运行的应用程序。它们被打包为Docker镜像,通过Docker Hub分发,并由用户通过Docker Desktop仪表板内的市场或Docker Extensions CLI安装。

扩展可以由三个(可选的)组件组成:

  • 前端(或用户界面):在Docker Desktop仪表板的一个标签中显示的Web应用程序
  • 后端:在Docker Desktop虚拟机中运行的一个或多个容器化服务
  • 可执行文件:Docker Desktop 在安装扩展时复制到主机上的 Shell 脚本或二进制文件
Overview of the three components of an extension

扩展不一定需要包含所有这些组件,但至少需要一个组件,具体取决于扩展的功能。 为了配置和运行这些组件,Docker Desktop 使用一个 metadata.json 文件。更多详情请参见 metadata 部分。

前端

前端基本上是一个由HTML、Javascript和CSS组成的网页应用程序。它可以通过一个简单的HTML文件、一些原生Javascript或任何前端框架(如React或Vue.js)来构建。

当Docker Desktop安装扩展时,它会从扩展镜像中提取UI文件夹,如metadata.json中的ui部分所定义。更多详情请参见ui元数据部分

每次用户点击扩展标签时,Docker Desktop 都会像第一次一样初始化扩展的用户界面。当他们离开该标签时,用户界面本身及其启动的所有子进程(如果有的话)都会被终止。

前端可以调用docker命令,与扩展后端通信,或者调用部署在主机上的扩展可执行文件,通过扩展 SDK

提示

docker extension init 生成一个基于 React 的扩展。但你仍然可以将其作为你自己扩展的起点,并使用任何其他前端框架,如 Vue、Angular、Svelte 等,或者继续使用原生 JavaScript。

了解更多关于 构建前端 为您的扩展。

后端

除了前端应用程序,扩展还可以包含一个或多个后端服务。在大多数情况下,扩展不需要后端,功能可以通过SDK调用docker命令来实现。然而,在某些情况下,扩展需要一个后端服务,例如:

  • 运行必须在前端之后继续存在的长时间运行进程
  • 将数据存储在本地数据库中,并通过REST API提供数据
  • 为了存储扩展状态,例如当按钮启动一个长时间运行的进程时,这样如果你离开扩展并返回,前端可以从中断的地方继续
  • 要访问Docker Desktop VM中的特定资源,例如通过在compose文件中挂载文件夹

提示

docker extension init 生成一个 Go 后端。但你仍然可以将其作为你自己扩展的起点,并使用任何其他语言,如 Node.js、Python、Java、.Net 或任何其他语言和框架。

通常,后端由一个在Docker Desktop虚拟机中运行的容器组成。在内部,Docker Desktop创建一个Docker Compose项目,从metadata.jsonvm部分的image选项创建容器,并将其附加到Compose项目。有关更多详细信息,请参阅ui元数据部分

在某些情况下,可以使用compose.yml文件代替image。这在后端容器需要更具体的选项时非常有用,例如挂载卷或请求 功能 这些功能无法仅通过Docker镜像表达。compose.yml文件还可以用于添加扩展所需的多个容器,例如数据库或消息代理。 请注意,如果Compose文件定义了许多服务,SDK只能联系其中的第一个服务。

注意

在某些情况下,从后端与Docker引擎进行交互也很有用。 参见 如何从后端使用Docker套接字

为了与后端通信,扩展SDK提供了函数来从前端发出GETPOSTPUTHEADDELETE请求。在底层,通信是通过套接字或命名管道进行的,具体取决于操作系统。如果后端正在监听一个端口,那么很难防止与主机上或容器中已经运行的其他应用程序发生冲突。此外,一些用户在受限环境中运行Docker Desktop,他们无法在机器上打开端口。

Backend and frontend communication

最后,后端可以使用任何技术构建,只要它能在容器中运行并监听一个套接字。

了解更多关于 添加后端到您的扩展的信息。

可执行文件

除了前端和后端,扩展还可以包含可执行文件。可执行文件是在安装扩展时安装在主机上的二进制文件或 shell 脚本。前端可以使用扩展 SDK调用它们。

当扩展需要与第三方CLI工具(如AWS、kubectl等)交互时,这些可执行文件非常有用。 将这些可执行文件与扩展一起分发,可以确保用户的机器上始终有正确版本的CLI工具可用。

当Docker Desktop安装扩展时,它会根据metadata.json中的host部分定义将可执行文件复制到主机上。有关更多详细信息,请参阅ui元数据部分

Executable and frontend communication

然而,由于它们在用户的机器上执行,因此它们必须可用于它们运行的平台。 例如,如果您想要分发kubectl可执行文件,您需要为Windows、Mac和Linux提供不同的版本。多架构镜像还需要包含为正确架构(AMD / ARM)构建的二进制文件。

详情请参见 主机元数据部分

学习如何 调用主机二进制文件