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


扩展不一定需要包含所有这些组件,但至少需要其中一个,具体取决于扩展的功能。为了配置和运行这些组件,Docker Desktop 使用 metadata.json
文件。有关更多详细信息,请参阅元数据章节。
前端
前端本质上是一个由 HTML、Javascript 和 CSS 构建的 Web 应用程序。它可以使用简单的 HTML 文件、纯 Javascript 或任何前端框架(如 React 或 Vue.js)构建。
当 Docker Desktop 安装扩展时,它会根据 metadata.json
文件中的 ui
部分定义,从扩展镜像中提取 UI 文件夹。有关更多详细信息,请参阅ui 元数据章节。
每当用户点击扩展选项卡时,Docker Desktop 都会初始化扩展的 UI,就像首次使用一样。当用户离开该选项卡时,UI 本身及其启动的所有子进程(如有)都会被终止。
前端可以通过 Extensions SDK 调用 docker
命令,与扩展后端通信,或调用部署在主机上的扩展可执行文件。
提示
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 VM 中运行的容器组成。在内部,Docker Desktop 会创建一个 Docker Compose 项目,根据 metadata.json
文件的 vm
部分的 image
选项创建容器,并将其附加到 Compose 项目。有关更多详细信息,请参阅ui 元数据章节。
在某些情况下,可以使用 compose.yaml
文件代替 image
选项。当后端容器需要更具体的选项时,这很有用,例如挂载卷或请求仅凭 Docker 镜像无法表达的能力。compose.yaml
文件还可以用于添加扩展所需的多个容器,例如数据库或消息队列。请注意,如果 Compose 文件定义了多个服务,SDK 只能联系其中的第一个。
注意
在某些情况下,从后端与 Docker engine 交互也很有用。请参阅如何从后端使用 Docker socket。
为了与后端通信,Extension 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)构建的二进制文件。
有关更多详细信息,请参阅host 元数据章节。
了解如何调用主机二进制文件。