原文: Introducing the Docker+Wasm Technical Preview2022年10月24日Docker发布了WASM相关的技术预览,目前仍处于Bata阶段。我看到甚至Docker官网的Logo都加上Wasm了,可以说Docker官方很重视这项实验性特性。
Docker+Wasm的技术预览现已发布!Wasm最近引起了很多关注,这一特性将使您更容易快速构建针对Wasm运行时的应用程序。
作为此次发布的一部分,我们也很高兴地宣布Docker将作为投票成员加入Bytecode Alliance。Bytecode Alliance
是一个非营利组织,致力于创建安全的新软件基础,以WebAssembly和WebAssemply系统接口(WASI)等标准为基础。
什么是Wasm
WebAssembly(通常简称为Wasm)是一种相对较新的技术,它允许您编译用40多种语言(包括Rust、C、C++、JavaScript和Golang)编写的应用程序代码,并在沙盒环境中运行。
最初的例子侧重于在web浏览器(如Figma、AutoCAD和Photoshop)中运行本机代码。事实上,当将基于网络的DNA序列质量分析仪转换为Wasm时,fastq.bio的速度提高了20倍)。迪士尼在Wasm之上构建了他们的Disney+ Application Development Kit!浏览器的好处是显而易见的。
但是多亏了WebAssembly系统接口(WASI), Wasm正在迅速扩展到浏览器之外。Vercel, Fastly, Shopify和Cloudflare等公司都支持使用Wasm在边缘运行代码,Fermyon正在构建一个平台,在云中运行Wasm微服务。
Why Docker?
在Docker,我们的目标是帮助开发人员通过克服应用程序开发的复杂性来实现他们的想法。我们努力使构建、共享和运行应用程序变得容易,而不管底层技术是什么。通过使容器对所有人都可访问,我们证明了我们使开发人员的生活更容易的能力,并被公认为最受欢迎的开发人员工具。
我们认为Wasm是Linux容器的一种补充技术,开发人员可以根据用例选择使用哪种技术(或者两者都使用!)随着社区探索使用Wasm的可能性,我们希望利用您所了解和喜爱的经验和工具,帮助开发、构建和运行Wasm应用程序更容易。
如何获得技术预览?
准备好亲自尝试了吗?太棒了!但在你开始探索之前,有几点需要记住:
- 重要提示#1:这是Docker Desktop的技术预览版本,事情可能不会像预期的那样工作。在继续之前,请确保备份您的容器和镜像。
- 重要提示#2:此预览启用了包含的容器镜像存储不能被禁用。如果您当前没有使用容器镜像存储,则将无法访问预先存在的镜像和容器。
你可以在这里下载Docker Desktop的技术预览版本:
- macOS Apple Silicon
- macOS Intel
- Windows AMD64
- Linux Arm64 (deb)
- Linux AMD64 (deb, rpm, tar)
有什么已知的限制吗?
是的!这是一个早期的技术预览,我们仍在努力使体验尽可能流畅。但有几件事你应该注意:
当中断时,Docker Compose可能无法干净地退出
- 解决方法:通过发送SIGKILL (
killall -9 docker-compose
)来清理docker-compose
进程。
- 解决方法:通过发送SIGKILL (
- 推送到集线器可能会给出一个错误
server message: insufficient_scope: authorization failed
,即使在使用Docker Desktop登录后
- 解决方法:在命令行中执行
docker login
命令
OK,那么Wasm集成实际上是如何工作的呢?
我们很高兴你这么问!首先,我们需要提醒您,由于这是一个技术预览,事情可能会迅速变化。但它目前是这样运作的。
- 我们正在利用我们最近的工作将镜像管理迁移到容器,因为它提供了使用与兼容OCI-compatible和containerd shims的能力。
- 我们与WasmEdge合作,创造了一个containerd shim。这个shim从OCI-compatible中提取Wasm模块,并使用WasmEdge运行时运行它。
- 我们添加了对声明Wasm运行时的支持,这将支持使用这个新的shim。
让我们看一个例子!
在安装预览之后,我们可以运行以下命令来启动一个Wasm应用程序示例:
docker run -dp 8080:8080 --name=wasm-example --runtime=io.containerd.wasmedge.v1 --platform=wasi/wasm32 michaelirwin244/wasm-example
由于有些参数可能不熟悉,让我们解释一下它们的作用:
--runtime=io.containerd.wasmedge.v1
这通知Docker引擎我们想要使用Wasm containerd shim,而不是标准的Linux容器运行时--platform=wasi/wasm32
指定我们想要使用的镜像的体系结构。通过利用Wasm体系结构,我们不需要为不同的体系结构构建单独的镜像。Wasm运行时将完成将Wasm二进制代码转换为机器指令的最后一步。
在提取图像之后,运行时读取图像的ENTRYPOINT
以定位和提取Wasm模块。然后将模块加载到Wasm运行时中,启动并配置网络。现在,我们的机器上运行了一个Wasm应用程序!
这个特殊的应用程序是一个简单的web服务器,它说“Hello world!”并将数据反馈给我们。为了验证它是否工作,让我们首先查看日志。
docker logs wasm-example
Server is now running
我们可以通过打开http://localhost:8080或使用curl来获得“Hello world”消息。
curl localhost:8080
我们的响应会给我们一个Hello world信息:
Hello world from Rust running with Wasm! Send POST data to /echo to have it echoed back to you
为了将数据发送到echo端点,我们可以使用curl:
curl localhost:8080/echo -d '{"message":"Hi there"}' -H "Content-type: application/json"
我们将看到返回的数据响应:
{"message":"Hi there"}
要删除应用程序,你可以像删除任何其他Docker服务一样删除它:
docker rm -f wasm-example
新的集成意味着您可以在您的Linux容器运行Wasm应用程序(甚至与Compose一起)。要了解更多,请查看文档!
Wasm和Docker的下一步计划?
又一个好问题!Wasm正在迅速发展和发展,包括探索如何支持多线程、垃圾回收等等。还有许多仍然需要解决的挑战,包括缩短开发人员反馈循环和可能的生产路径。
所以你可以自己尝试一下,然后让我们知道你对the public roadmap的想法或反馈。我们很乐意收到你的来信!