container2wasm

container2wasm

容器到WebAssembly转换工具 实现跨平台容器部署

container2wasm是一个容器到WebAssembly的转换工具,可将容器镜像转换为WASI运行时和浏览器中可执行的WASM格式。它支持x86_64和riscv64架构,通过CPU模拟实现容器在WebAssembly环境中运行。这个项目使开发者能够将现有容器应用无需修改就直接部署到WASM平台,提高了容器的可移植性和适用范围。

container2wasmWASM容器转换虚拟化WebAssemblyGithub开源项目

[⬇️下载] [📖 命令参考] [📚 附加文档] [▶️演示]

container2wasm: 容器到WASM转换器

container2wasm是一个容器到wasm镜像的转换器,可以在WASM上运行容器。

  • 通过Bochs(用于x86_64容器)和TinyEMU(用于riscv64容器)的模拟将容器转换为WASM。
  • 可在WASI运行时上运行(如wasmtime、wamr、wasmer、wasmedge、wazero)
  • 可在浏览器上运行
  • 推荐使用x86_64或riscv64容器。其他平台(如arm64)也可以工作(但速度较慢)。

这是一个实验性软件。

浏览器上容器的演示页面(debian、python、node、vim):https://ktock.github.io/container2wasm-demo/

示例

容器镜像转WASM(WASI)

$ c2w ubuntu:22.04 out.wasm

上述命令将ubuntu:22.04容器镜像转换为WASI镜像(out.wasm)。

注1:要选择amd64以外的容器镜像架构,请使用c2w的--target-arch标志(例如:c2w --target-arch=riscv64 riscv64/ubuntu:22.04 out.wasm)。

注2:推荐使用x86_64或riscv64容器。其他平台的容器应该可以工作,但由于需要额外模拟,速度会较慢。

生成的镜像可以在WASI运行时上运行:

$ wasmtime out.wasm uname -a Linux localhost 6.1.0 #1 PREEMPT_DYNAMIC Mon Jun 5 11:57:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux $ wasmtime out.wasm ls / bin dev home lib32 libx32 mnt proc run srv tmp var boot etc lib lib64 media opt root sbin sys usr

从主机映射的目录在容器中是可访问的。

$ mkdir -p /tmp/share/ && echo hi > /tmp/share/from-host
$ wasmtime --mapdir /mnt/share::/tmp/share out.wasm cat /mnt/share/from-host
hi

请参考./examples/networking/wasi/来启用网络功能

浏览器上的容器

浏览器上的容器

你也可以在浏览器上运行容器。 在浏览器上运行容器有两种方法。

请同时参考./examples/wasi-browser(浏览器上的WASI示例)和./examples/emscripten(emscripten示例)。

请参考./examples/networking/了解启用网络功能的详细信息。

浏览器上的WASI

此示例将容器转换为WASI并在浏览器上运行。

以下命令生成WASI镜像。

$ c2w ubuntu:22.04 /tmp/out-js2/htdocs/out.wasm

以下是在浏览器上运行镜像的示例,依赖于xterm-ptybrowser_wasi_shim。 此示例使用apache http服务器在localhost:8080上提供镜像。

$ cp -R ./examples/wasi-browser/* /tmp/out-js2/ && chmod 755 /tmp/out-js2/htdocs
$ docker run --rm -p 8080:80 \
         -v "/tmp/out-js2/htdocs:/usr/local/apache2/htdocs/:ro" \
         -v "/tmp/out-js2/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \
         --entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'

你可以通过localhost:8080在浏览器上运行容器。

带网络功能的浏览器上的WASI

带浏览器网络功能的Debian容器

容器也可以执行网络操作。 本节演示在容器中使用curl命令。

仅在Chrome上测试过。该示例可能在其他浏览器上不工作。

$ cat <<EOF | docker build -t debian-curl -
FROM debian:sid-slim
RUN apt-get update && apt-get install -y curl
EOF
$ c2w debian-curl /tmp/out-js2/htdocs/out.wasm

此示例使用apache http服务器在localhost:8080上提供镜像。 以下操作还将可在浏览器上运行的网络栈放入文档根目录。

$ cp -R ./examples/wasi-browser/* /tmp/out-js2/ && chmod 755 /tmp/out-js2/htdocs
$ wget -O /tmp/out-js2/htdocs/c2w-net-proxy.wasm https://github.com/ktock/container2wasm/releases/download/v0.5.0/c2w-net-proxy.wasm
$ docker run --rm -p 8080:80 \
         -v "/tmp/out-js2/htdocs:/usr/local/apache2/htdocs/:ro" \
         -v "/tmp/out-js2/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \
         --entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'

你可以在浏览器上使用几种配置运行容器:

浏览器上的emscripten

此示例使用emscripten将容器转换为WASM。

  • 优点:WASM镜像大小可能比WASI更小。
  • 缺点:此模式下无法使用WASI特定的优化,如Wizer预初始化。因此,容器的启动可能会较慢(对于x86_64容器,可能需要>=30秒;对于riscv64容器,可能需要>=10秒)。

以下命令生成可在浏览器上运行的WASM镜像和JS文件。

$ c2w --to-js ubuntu:22.04 /tmp/out-js/htdocs/

以下是基于 xterm-pty 在浏览器中运行镜像的示例。 此示例使用 Apache HTTP 服务器在 localhost:8080 上提供镜像。

$ cp -R ./examples/emscripten/* /tmp/out-js/ && chmod 755 /tmp/out-js/htdocs $ docker run --rm -p 8080:80 \ -v "/tmp/out-js/htdocs:/usr/local/apache2/htdocs/:ro" \ -v "/tmp/out-js/xterm-pty.conf:/usr/local/apache2/conf/extra/xterm-pty.conf:ro" \ --entrypoint=/bin/sh httpd -c 'echo "Include conf/extra/xterm-pty.conf" >> /usr/local/apache2/conf/httpd.conf && httpd-foreground'

你可以通过 localhost:8080 在浏览器中运行容器。

注意:加载和启动容器可能需要一些时间。

还可以使用基于 gvisor-tap-vsock 实现的用户空间网络栈 c2w-net,通过主机(浏览器外部)上的 WebSocket 启用网络功能。 详情请参阅 ./examples/networking/websocket

入门指南

  • 要求
    • Docker 18.09+ (使用 DOCKER_BUILDKIT=1)
    • Docker Buildx v0.8+ (推荐) 或 docker build (使用 DOCKER_BUILDKIT=1)

你可以使用以下方法之一安装转换器命令 c2w

注意:输出的二进制文件还包含 c2w-net,这是一个用于控制网络功能的命令(详情请参阅 ./examples/networking)。

发布版二进制文件

可以从 https://github.com/ktock/container2wasm/releases 下载二进制文件 解压缩压缩包并将二进制文件放在 $PATH 下的某个位置。

使用 make 构建二进制文件

需要 Go 1.19+。

make
sudo make install

命令参考

c2w

将容器镜像转换为 WASM 镜像,并将其写入指定路径(默认为当前目录下的 out.wasm)。

用法:c2w [选项] 镜像名称 [输出文件]

  • 镜像名称:容器镜像名称(如果 Docker 中不存在,将从注册表拉取)
  • [输出文件]:结果 WASM 文件的路径。

子命令

  • help, h:显示命令列表或某个命令的帮助

选项

  • --assets value:构建资产的自定义位置。
  • --dockerfile value:Dockerfile 的自定义位置(默认:嵌入到此命令中)
  • --builder value:要使用的构建器命令(默认:"docker")
  • --target-arch value:要使用的源镜像的目标架构(默认:"amd64")
  • --build-arg value:附加的构建参数(请查看 Dockerfile 了解可用的构建参数)
  • --to-js:使用 emscripten 将容器转换为 WASM
  • --debug-image:在输出镜像中启用调试打印
  • --show-dockerfile:显示默认 Dockerfile
  • --legacy:使用 "docker build" 而不是 buildx(不支持 assets 标志)(默认:false)
  • --external-bundle:不将容器镜像嵌入到 Wasm 镜像中,而是在运行时挂载
  • --help, -h:显示帮助
  • --version, -v:打印版本

WASM 镜像的运行时标志

你可以为生成的 wasm 镜像指定运行时标志,以配置执行(例如,更改在容器中运行的命令)。

用法:out.wasm [选项] [命令] [参数...]

  • [命令] [参数...]:在容器中运行的命令。(默认:镜像配置中指定的命令)

选项

  • -entrypoint <命令>:入口点命令。(默认:镜像配置中指定的入口点)
  • -no-stdin:禁用标准输入。(默认:false)

示例:

以下命令将容器的入口点更改为 echo 并将 hello 传递给参数。

wasmtime -- /app/out.wasm --entrypoint=echo hello

目录映射

从主机映射的目录在容器中可访问。

$ mkdir -p /tmp/share/ && echo hi > /tmp/share/hi
$ wasmtime --mapdir /test/dir/share::/tmp/share /app/out.wasm ls /test/dir/share/
hi

动机

尽管越来越多的编程语言开始支持 WASM,但在 WASM 上运行现有程序并不容易。 这有时需要重新实现和重新编译它们,并会增加额外的开发时间。 这是一个概念验证转换器,试图通过在 WASM 上运行未经修改的容器来解决这个问题。

工作原理

container2wasm 创建一个在模拟 CPU 上运行容器和 Linux 内核的 WASM 镜像。

以下是技术细节:

  • 构建器:BuildKit 运行 Dockerfile 中编写的转换步骤。
  • 模拟器:Bochs 在 WASM 上模拟 x86_64 CPU。TinyEMU 在 WASM 上模拟 RISC-V CPU。它们使用 wasi-sdk(用于 WASI 和浏览器上)和 emscripten(用于浏览器上)编译为 WASM。
  • 客户操作系统:Linux 在模拟 CPU 上运行。runc 启动容器。非 x86 和非 RISC-V 容器通过 tonistiigi/binfmt 安装的 QEMU 进行额外的模拟运行。
  • 目录映射:WASI 文件系统 API 使主机目录对模拟器可见。模拟器通过 virtio-9p 将它们挂载到客户 Linux。
  • 打包:wasi-vfs(用于 WASI 和浏览器上)和 emscripten(用于浏览器上)用于打包依赖项。在构建过程中使用 wizer 预启动内核,以最小化启动延迟(目前仅适用于 WASI)。
  • 网络:浏览器的 Fetch API 或 WebSocket 用于浏览器上的镜像。WASI 使用 sock_* API。gvisor-tap-vsock 可用作网络栈。(文档:./examples/networking/
  • 安全性:转换后的容器在沙盒化的 WASM (WASI) 虚拟机中运行,对主机系统的访问受限。

WASI 运行时集成状态

  • :heavy_check_mark: : 支持

  • :construction: : 进行中

  • 注意:此处未列出的 WASI 功能未经测试(未来版本将支持更多功能)

x86_64 容器

运行时标准输入输出映射目录网络注意
wasmtime:heavy_check_mark::heavy_check_mark::heavy_check_mark: (使用主机端网络栈)
wamr(wasm-micro-runtime):heavy_check_mark::heavy_check_mark::construction:
wazero:heavy_check_mark::heavy_check_mark::heavy_check_mark: (使用主机端网络栈
wasmer:construction: (不支持标准输入):heavy_check_mark::construction:非阻塞标准输入似乎不工作
wasmedge:construction: (不支持标准输入):heavy_check_mark::construction:非阻塞标准输入似乎不工作

RISC-V 和其他架构的容器

运行时标准输入输出映射目录网络注意
wasmtime:heavy_check_mark::heavy_check_mark::heavy_check_mark: (使用主机端网络栈)
wamr(wasm-micro-runtime):heavy_check_mark::heavy_check_mark::construction:
wazero:heavy_check_mark::heavy_check_mark::heavy_check_mark: (使用主机端网络栈)
wasmer:construction: (不支持标准输入):heavy_check_mark::construction:非阻塞标准输入似乎不工作
wasmedge:construction: (不支持标准输入):heavy_check_mark::construction:非阻塞标准输入似乎不工作

类似项目

有几个容器运行时支持运行 WASM 应用程序,但它们不在 WASM 上运行容器。

有一些模拟器支持在 WASM 上运行 Linux,但它们不支持 WASI。

一些 WASM API 规范为应用程序提供了访问主机系统的能力。 需要重新编译(可能需要重新实现)应用程序。

其他资源

致谢

编辑推荐精选

Keevx

Keevx

AI数字人视频创作平台

Keevx 一款开箱即用的AI数字人视频创作平台,广泛适用于电商广告、企业培训与社媒宣传,让全球企业与个人创作者无需拍摄剪辑,就能快速生成多语言、高质量的专业视频。

即梦AI

即梦AI

一站式AI创作平台

提供 AI 驱动的图片、视频生成及数字人等功能,助力创意创作

扣子-AI办公

扣子-AI办公

AI办公助手,复杂任务高效处理

AI办公助手,复杂任务高效处理。办公效率低?扣子空间AI助手支持播客生成、PPT制作、网页开发及报告写作,覆盖科研、商业、舆情等领域的专家Agent 7x24小时响应,生活工作无缝切换,提升50%效率!

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

下拉加载更多