扩展架构
扩展是在Docker Desktop内部运行的应用程序。它们被打包为Docker镜像,通过Docker Hub分发,并由用户通过Docker Desktop仪表板内的市场或Docker Extensions CLI安装。
扩展可以由三个(可选的)组件组成:
- 前端(或用户界面):在Docker Desktop仪表板的一个标签中显示的Web应用程序
- 后端:在Docker Desktop虚拟机中运行的一个或多个容器化服务
- 可执行文件:Docker Desktop 在安装扩展时复制到主机上的 Shell 脚本或二进制文件

扩展不一定需要包含所有这些组件,但至少需要一个组件,具体取决于扩展的功能。
为了配置和运行这些组件,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.json的vm部分的image选项创建容器,并将其附加到Compose项目。有关更多详细信息,请参阅ui元数据部分。
在某些情况下,可以使用compose.yml文件代替image。这在后端容器需要更具体的选项时非常有用,例如挂载卷或请求
功能
这些功能无法仅通过Docker镜像表达。compose.yml文件还可以用于添加扩展所需的多个容器,例如数据库或消息代理。
请注意,如果Compose文件定义了许多服务,SDK只能联系其中的第一个服务。
注意
在某些情况下,从后端与Docker引擎进行交互也很有用。 参见 如何从后端使用Docker套接字。
为了与后端通信,扩展SDK提供了函数来从前端发出GET、POST、PUT、HEAD和DELETE请求。在底层,通信是通过套接字或命名管道进行的,具体取决于操作系统。如果后端正在监听一个端口,那么很难防止与主机上或容器中已经运行的其他应用程序发生冲突。此外,一些用户在受限环境中运行Docker Desktop,他们无法在机器上打开端口。

最后,后端可以使用任何技术构建,只要它能在容器中运行并监听一个套接字。
了解更多关于 添加后端到您的扩展的信息。
可执行文件
除了前端和后端,扩展还可以包含可执行文件。可执行文件是在安装扩展时安装在主机上的二进制文件或 shell 脚本。前端可以使用扩展 SDK调用它们。
当扩展需要与第三方CLI工具(如AWS、kubectl等)交互时,这些可执行文件非常有用。
将这些可执行文件与扩展一起分发,可以确保用户的机器上始终有正确版本的CLI工具可用。
当Docker Desktop安装扩展时,它会根据metadata.json中的host部分定义将可执行文件复制到主机上。有关更多详细信息,请参阅ui元数据部分。

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