Wasm 工作负载 (Beta 版)
试用版
Wasm 功能目前处于 Beta 阶段。 我们建议您不要在生产环境中使用此功能,因为 此功能可能会在未来版本中更改或删除。
Wasm(WebAssembly 的缩写)是 Linux 和 您目前在 Docker 中使用的 Windows 容器(有一些权衡)。
本页提供了有关运行 Wasm 应用程序的新功能的信息 以及 Docker 中的 Linux 容器。
开启 Wasm 工作负载
Wasm 工作负载需要开启 containerd 镜像存储功能。如果您尚未使用 containerd 镜像存储,则 然后,将无法访问预先存在的镜像和容器。
- 导航到 Docker Desktop 中的设置。
- 在 General 选项卡中,选中 Use containerd for pull and store images。
- 转到开发中的功能并选中 启用 Wasm 选项。
- 选择应用并重新启动以保存设置。
- 在确认对话框中,选择 Install (安装) 以安装 Wasm 运行时。
Docker Desktop 下载并安装以下您可以使用的运行时 要运行 Wasm 工作负载:
io.containerd.slight.v1
io.containerd.spin.v2
io.containerd.wasmedge.v1
io.containerd.wasmtime.v1
io.containerd.lunatic.v1
io.containerd.wws.v1
io.containerd.wasmer.v1
使用示例
使用docker run
以下内容docker run
command 在您的系统上启动一个 Wasm 容器:
$ docker run \
--runtime=io.containerd.wasmedge.v1 \
--platform=wasi/wasm \
secondstate/rust-example-hello
运行此命令后,您可以访问 http://localhost:8080/ 以查看此示例模块的 “Hello world” 输出。
如果您收到错误消息,请参阅故障排除部分以获取帮助。
请注意--runtime
和--platform
此命令中使用的标志:
--runtime=io.containerd.wasmedge.v1
:通知 Docker 引擎您需要 使用 Wasm containerd shim 而不是标准 Linux 容器 运行--platform=wasi/wasm
:指定要的镜像的体系结构 用。通过利用 Wasm 架构,您无需单独构建 不同机器架构的镜像。Wasm 运行时负责 将 Wasm Binaries转换为机器指令的最后一步。
使用 Docker Compose 运行 Wasm 应用程序
可以使用以下 Docker Compose 文件运行相同的应用程序:
services:
app:
image: secondstate/rust-example-hello
platform: wasi/wasm
runtime: io.containerd.wasmedge.v1
使用常规的 Docker Compose 命令启动应用程序:
$ docker compose up
使用 Wasm 运行多服务应用程序
联网的工作方式与您对 Linux 容器的预期相同,为您提供 将 Wasm 应用程序与其他容器化工作负载相结合的灵活性, 例如,在单个应用程序堆栈中。
在以下示例中,Wasm 应用程序利用 MariaDB 数据库 在容器中运行。
克隆存储库。
$ git clone https://github.com/second-state/microservice-rust-mysql.git Cloning into 'microservice-rust-mysql'... remote: Enumerating objects: 75, done. remote: Counting objects: 100% (75/75), done. remote: Compressing objects: 100% (42/42), done. remote: Total 75 (delta 29), reused 48 (delta 14), pack-reused 0 Receiving objects: 100% (75/75), 19.09 KiB | 1.74 MiB/s, done. Resolving deltas: 100% (29/29), done.
导航到克隆的项目,然后使用 Docker Compose 启动项目。
$ cd microservice-rust-mysql $ docker compose up [+] Running 0/1 ⠿ server Warning 0.4s [+] Building 4.8s (13/15) ... microservice-rust-mysql-db-1 | 2022-10-19 19:54:45 0 [Note] mariadbd: ready for connections. microservice-rust-mysql-db-1 | Version: '10.9.3-MariaDB-1:10.9.3+maria~ubu2204' socket: '/run/mysqld/mysqld.sock' port: 3306 mariadb.org binary distribution
如果您运行
docker image ls
在另一个终端窗口中,您可以看到 Wasm 镜像。$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE server latest 2c798ddecfa1 2 minutes ago 3MB
检查镜像显示镜像具有
wasi/wasm
平台、 作系统和架构的组合:$ docker image inspect server | grep -A 3 "Architecture" "Architecture": "wasm", "Os": "wasi", "Size": 3001146, "VirtualSize": 3001146,
打开 URL
http://localhost:8090
并创建几个示例 订单。所有这些都与 Wasm 服务器交互。当你都完成后,点击把所有东西都拆掉
Ctrl+C
在 终端,您启动了该应用程序。
构建和推送 Wasm 模块
创建一个 Dockerfile 来构建您的 Wasm 应用程序。
具体如何执行此作因您使用的编程语言而异。
在
Dockerfile
,提取模块并将其设置为 这ENTRYPOINT
.# syntax=docker/dockerfile:1 FROM scratch COPY --from=build /build/hello_world.wasm /hello_world.wasm ENTRYPOINT [ "/hello_world.wasm" ]
构建并推送指定
wasi/wasm
建筑。构建 使此作在单个命令中轻松完成。$ docker buildx build --platform wasi/wasm -t username/hello-world . ... => exporting to image 0.0s => => exporting layers 0.0s => => exporting manifest sha256:2ca02b5be86607511da8dc688234a5a00ab4d58294ab9f6beaba48ab3ba8de56 0.0s => => exporting config sha256:a45b465c3b6760a1a9fd2eda9112bc7e3169c9722bf9e77cf8c20b37295f954b 0.0s => => naming to docker.io/username/hello-world:latest 0.0s => => unpacking to docker.io/username/hello-world:latest 0.0s $ docker push username/hello-world
故障 排除
本节包含有关如何解决常见问题的说明。
指定的未知运行时
如果您尝试在没有 containerd 镜像的情况下运行 Wasm 容器 store 中,则会显示类似于以下内容的错误:
docker: Error response from daemon: Unknown runtime specified io.containerd.wasmedge.v1.
在 Docker Desktop 设置中打开 containerd 功能,然后重试。
Failed to start shim: 无法解析运行时路径
如果您使用不支持运行 Wasm 的旧版本的 Docker Desktop 工作负载,您将看到类似于以下内容的错误消息:
docker: Error response from daemon: failed to start shim: failed to resolve runtime path: runtime "io.containerd.wasmedge.v1" binary not installed "containerd-shim-wasmedge-v1": file does not exist: unknown.
将 Docker Desktop 更新到最新版本,然后重试。
已知问题
- Docker Compose 在中断时可能无法完全退出
- 解决方法:清理
docker-compose
进程,通过向它们发送 SIGKILL (killall -9 docker-compose
).
- 解决方法:清理
- 推送到 Hub 可能会显示错误,指出
server message: insufficient_scope: authorization failed
,即使在记录后 使用 Docker Desktop- 解决方法:运行
docker login
在 CLI 中
- 解决方法:运行
反馈
感谢您使用 Docker 试用 Wasm 工作负载。提供反馈或举报任何 您可以通过 Public Roadmap 项上的 Issues Tracker 找到的 bug。