Docker 学习总结(78)—— WebAssembly 入门简介

news2025/1/12 6:47:45

什么是 WebAssembly?

 WebAssembly 是一种定义二进制指令格式的开放标准,它支持从不同的源语言创建可移植的二进制可执行文件。这些二进制文件可以在各种环境中运行。它起源于 Web,并得到各大主流浏览器的支持。

Wasm 如何在浏览器中工作?

浏览器引擎集成了一个 Wasm 虚拟机,通常称为 Wasm 运行时,可以运行 Wasm 二进制指令。编译器工具链(如 Emscripten)可以将源代码编译为 Wasm 目标。这允许将现有的应用程序移植到浏览器,并直接与在客户端 Web 应用程序中运行的 JS 代码通信。

 这些技术能让传统的桌面应用程序在浏览器中运行。现在它们可以在任何装了浏览器的设备上运行。一些著名的例子包括 Google Earth[6] 和用于计算机视觉的 Open CV[7]库。

Wasm 如何在服务器上运行?

除了浏览器,也有可以在浏览器之外运行的 Wasm 运行时,包括 Linux、Windows 和 macOS 等传统操作系统。因为无法依赖可用的 JavaScript 引擎,所以他们使用不同的接口与外界通信,例如 WASI(WebAssembly 系统接口[8])。这些运行时允许 Wasm 应用程序以与 POSIX 类似(但不完全相同)的方式与其 host 系统交互。WASI SDK 和 wasi-libc 等项目帮助人们将现有的兼容 POSIX 的应用程序编译为 WebAssembly。你只需将应用程序编译成 Wasm 模块一次,然后这个同样的二进制文件就可以在任何地方运行。

 Wasm 有什么了不起的地方?

下面这些特性让 Wasm 在浏览器大放异彩,也使得它用在服务端开发颇具优势:

  • 开放——它是业界广泛采用的标准。与过去的浏览器争夺战相反,各大公司正积极合作,实现 WASI 和 WebAssembly 应用程序的标准化。
  • 快速——它可以通过大多数运行时的 JIT/AOT 能力提供类似原生的速度。与启动 VM 或启动容器不同的是,它没有冷启动。
  • 安全——默认情况下,Wasm 运行时是沙箱化的,允许安全访问内存。基于能力的模型确保 Wasm 应用程序只能访问得到明确允许的内容。软件供应链更加安全。
  • 可移植——几个主要的 Wasm 运行时支持大多数 CPU(x86、ARM、RISC-V)和大多数操作系统,包括 Linux、Windows、macOS、Android、ESXi,甚至非 Posix 操作系统。
  • 高效——最小的内存占用和最低的 CPU 门槛就能运行 Wasm 应用程序。
  • ️ 支持多语言——40 多种编程语言可以编译成 Wasm,有现代的、不断改进的工具链。

服务器平台发展的下一步是什么?

也许你已经看过 Solomon Hykes (Docker的创始人之一)这句话[9]:如果在2008年已经有了 WASM + WASI,我们根本不需要创建 Docker。Wasm 就有这么重要。服务端的 WebAssembly 是计算的未来。事实上,WASM+WASI 似乎的确是服务端软件基础设施发展的下一步。

  • 最早,我们有物理硬件可以使用。我们会给机房里每个服务器精心安装操作系统和应用程序,并一一维护。
  • 然后随着 VMware 开创的 VM 的采用,一切变得更容易了。人们可以跨硬件机器复制、克隆和移动虚拟机。但这仍然需要在 VM 中安装操作系统和应用程序。
  • 随后出现了由 Docker 推广的容器,这使得在最小打包的上下文下运行应用程序配置变得更加容易,而不会影响主机操作系统上的任何其他应用程序。但是,仍然需要分发与其运行时和必要的库捆绑在一起的应用程序。安全边界由 Linux 内核提供。
  • 现在有了 WebAssembly。它的技术特性和可移植性使得分发应用程序成为可能,无需 ship 操作系统级别的依赖项,并且可以在严格的安全约束下运行。

鉴于所有这些,开发者通常将 WebAssembly 视为容器的“继承者”,以及基础设施部署的自然而然的下一步。

 然而,另一种看待 WebAssembly 的方式是将其作为 Docker 工具的另一个“后端”选择。可以使用相同的命令行工具和工作流,替代 Linux 容器,使用基于 WebAssembly 的容器等同等的东西来实现。本文的其余部分探讨了这个概念,这就是标题所说的“没有容器的 Docker”。

Wasm 如何结合 Docker 运行?

Docker Desktop 现在加入了对 WebAssembly 的支持。它是通过 containerd shim 实现的,该 shim 可以使用名为 WasmEdge[10] 的 Wasm 运行时来运行 Wasm 应用程序。这意味着,现在可以在 WasmEdge 运行时(模拟容器)中运行 Wasm 应用程序,而不是用典型的 Windows 或 Linux 容器运行容器镜像中二进制文件的单独进程。因此,容器镜像不需要包含正在运行的应用程序的操作系统或运行时上下文——单个 Wasm 二进制文件就足够了。这在 Docker 的 Wasm 技术预览文章[11]中有详细解释。

WasmEdge 是什么?

WasmEdge[12] 是一个高性能的 WebAssembly 运行时:

  • 是开源的,属于 CNCF[13]
  • 支持所有主要的 CPU 架构(x86、ARM、RISC-V)。
  • 支持所有主要操作系统(Linux、Windows、macOS)以及其他操作系统,例如 seL4 RTOS、Android。
  • 针对云原生和边缘应用程序进行了优化。
  • 可扩展并支持标准和新兴技术
    • 使用 Tensorflow、OpenVINO、PyTorch 进行人工智能推理
    • Tokio 的异步网络。支持微服务、数据库客户端、消息队列等。
    • 与容器生态、Docker 和 Kubernetes 无缝集成(如本文所示!)

解释型语言呢?

到目前为止,我们只提到了 C 和 Rust 等编译语言可以编译为 WebAssembly。对于 Python、Ruby 和 PHP 等解释型语言,方法有所不同:它们的解释器是用 C 语言编写的,可以编译为 WebAssembly。然后这个解释器编译成的 Wasm 可以用来执行源代码文件,通常以 .py、.rb、.php 等结尾。一旦编译为 Wasm,任何带有 Wasm 运行时的平台都将能够运行这些解释型语言,即使实际的解释器从未为该平台原生编译过。

关于 WasmEdge

WasmEdge 是轻量级、安全、高性能、可扩展、兼容OCI的软件容器与运行环境。目前是 CNCF 沙箱项目。WasmEdge 被应用在 SaaS、云原生,service mesh、边缘计算、边缘云、微服务、流数据处理等领域。GitHub:https://github.com/WasmEdge/WasmEdge。官网:https://wasmedge.org/。‍‍ Discord 群:https://discord.gg/U4B5sFTkFc。文档:https://wasmedge.org/book/en。

参考资料

  • [1] Wasm Labs @ VMware OCTO: https://wasmlabs.dev/
  • [2] Docker+WebAssembly 的演讲: https://www.bilibili.com/video/BV1314y1w7vp/
  • [3] WasmEdge: https://wasmedge.org/
  • [4] WebAssembly: https://docs.docker.com/desktop/wasm/
  • [5] WebAssembly 端口: https://wasmlabs.dev/articles/php-wasm32-wasi-port/
  • [6] Google Earth: https://earth.google.com/
  • [7] Open CV: https://opencv.org/
  • [8] WebAssembly 系统接口: https://wasi.dev/
  • [9] 这句话: https://twitter.com/solomonstre/status/1111004913222324225
  • [10] WasmEdge: https://github.com/WasmEdge/Wasmedge
  • [11] Wasm 技术预览文章: https://www.docker.com/blog/docker-wasm-technical-preview/
  • [12] WasmEdge: https://github.com/WasmEdge/Wasmedge
  • [13] CNCF: https://cncf.io/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/131602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RCTF-pwn-diary

RCTF-pwn-diary 赛后看了一眼发现给出了源码,https://github.com/ruan777/RCTF2022/blob/main/diary/main.cpp 漏洞是erase的问题 解释一下 add(0) add(1) add(2) delete(1)这样子的话,其实就是把2给删除,把2的内容复制到1中,所…

Base64自定义编码表及破解

什么是Base64 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64并不是安全领域的加密算法,其实Base64只能算是一个编码算法,对数据内容进行编码来适合传输。标准Base64编码解码无需额外信息即完全可逆,即使你自…

基于Python + Django 开发一款学生管理系统(附源码)

文章目录1.开发环境源码分享&技术交流2.项目实战1)创建Django项目2)创建应用3)配置MySQL4)数据模型层创建5)路由配置6)增删改查视图函数7)模板页面创建8)启动web服务1.开发环境 …

最大似然和贝叶斯参数估计

统计生成模型的参数估计 – Maximum Likelihood(ML) 假设参数是某个确定的值,通过使似然度最大求出参数 – Bayesian estimation 假设参数是随机变量,估计参数分布的参数 – 最大似然求出具体的参数,贝叶斯求的是参数的分布 最大似然估计 假…

献给自己技术成长的第三年

年度总结词语:幸运 献给自己技术成长的第三年一、五州一都二、if else量产三、学技术四、用真心五、设计精产六、感恩幸运一、五州一都 1.1-1.12成都、2.23-3.19广州、4.12-7.23苏州、8.12-8.20兰州、8.23-9.20湖州、其余杭州 成都。去年年底出差到成都,…

HTTP_day01

在互联网世界里,HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协…

【数据结构】冒泡排序、快速排序(递归,非递归)、归并排序(递归,非递归),七大排序比较,

文章目录冒泡排序快速排序归并排序七大排序之间的对比冒泡排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小…

高性能web网关之Openresty相关基础知识

高性能web网关之Openresty一、Openresty 简介二、Openresty 应用场景三、lua-nginx-module3.1、Lua 模块指令顺序3.2、Lua嵌入nginx四、责任链五、cosocket后言一、Openresty 简介 openresty 是一个基于 nginx 与 lua 的高性能 web 平台,其内部集成了大量精良的 lu…

148.排序链表

148.排序链表 题目: 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:…

【论文阅读】CVPR2018-深度材料感知跨光谱立体匹配

深度材料感知跨光谱立体匹配 摘要 跨光谱成像对识别和检测任务很有帮助。通常,多个相机用于跨光谱成像,因此需要图像对齐或双目系统中的视差估计。多相机跨光谱系统逐渐被嵌入到有源RGB-D设备中(例如Kinect和iPhone X中的RGB-NIR相机&#…

2022 年度回忆

2022 年度回忆 过了今天就是2023年了,记录一下在这一年里发生的点点滴滴吧。 年度总结2022 年度回忆1.石家庄实习2.准备秋招,然后去沈阳实习3.回学校4.来北京实习了总结今年大体且分为四条故事线 1.22年上半年石家庄实习 2.实习结束回家准备秋招&#…

句子表征(各项异性等偏差):PromptBERT: Improving BERT Sentence Embeddings with Prompts

一、核心 句子表征存在不足之处,可能面临各向异性、可能受到词频的影响、可能受到子词、大小写等的影响等等。 Gao et al.(2019)和Wang et al.(2020)指出,对于语言建模,使用最大似然训练通常会产生一个各向异性的词嵌入空间。“各向异性”是…

BabaSSL:支持半同态加密算法 EC-ElGamal

01 背 景 随着大数据与人工智能的快速发展,个人隐私数据泄露和滥用时有发生,隐私安全问题也越来越被重视。 国家于 2020 年施行密码法、2021 年施行个人信息保护法,对个人隐私数据和数据安全加密有更高的要求。 因此,隐私计算也…

2022年博客之路总结

今年是不平凡的一年,IT行业 开卷 的一年,今年大多数人 都 因种种原因 被迫换了工作,再次 先感谢CSDN 这个平台,在这里 给自己了一块可以展示自己才华的空间,通过CSDN平台的各项运营数据,让我有幸 拿到了 更…

flv.js播放flv视频

flv.js是FLV视频播放器&#xff0c;纯JS开发&#xff0c;无需Flash。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

【虚幻引擎UE】UE5 制作一个元旦烟花短视频的小案例(使用sequence制作视频案例)

祝愿大家元旦快乐&#xff01; 效果预览 一、创建粒子烟花特效 可以使用现成的Niagara烟花粒子特效&#xff0c;直接跳过这一步。 1、 通过Niagara系统创建粒子特效 选择现有发射器素材。 或者也可新建空白特效&#xff0c;将发射器拖入轨道&#xff08;素材包含闪光、拖…

基于TP6+Uni-app框架开发的多端圈子社区论坛小程序H5系统,带数据库和安装教程

正文&#xff1a; 前台uni-app后台tp6开发的多端圈子社区论坛小程序H5系统,带数据库和安装教程。 系统基于TP6Uni-app框架开发&#xff1b;客户移动端采用uni-app开发&#xff0c;管理后台TH6开发。 系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步&#xff0c…

CSDN的2022和2023

前言 今天是2022年12月31日&#xff0c;今年的最后一天&#xff0c;年关已至。 又到了&#xff1a;回头看路&#xff0c;低头赶路&#xff0c;抬头望路的时候。 回顾2022 疫情中的2022 今年应该算是疫情的高峰期吧&#xff0c;各种新冠变异株横行&#xff0c;从严控到一夜…

Day845.Fork/Join -Java 并发编程实战

Fork/Join Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于Fork/Join的内容。 线程池、Future、CompletableFuture 和 CompletionService&#xff0c;仔细观察会发现这些工具类都是在帮助站在任务的视角来解决并发问题&#xff0c;而不是让纠缠在线程之间如何协作的…

深度学习:05 卷积神经网络介绍(CNN)

目录 卷积神经网络简介 为什么要用卷积神经网络 网络结构组成 卷积层 卷积计算 卷积核大小 f 边界填充 (p)adding 步长 (s)tride 计算公式 卷积层 激活函数 池化层&#xff08;pooling&#xff09; dropout层 全连接层 卷积神经网络简介 卷积神经网络由一个或多个…