GVKun编程网logo

在 WasmEdge 中使用 Docker 工具管理 WebAssembly 应用(docker swarm管理工具)

23

在本文中,我们将给您介绍关于在WasmEdge中使用Docker工具管理WebAssembly应用的详细内容,并且为您解答dockerswarm管理工具的相关问题,此外,我们还将为您提供关于(转)WA

在本文中,我们将给您介绍关于在 WasmEdge 中使用 Docker 工具管理 WebAssembly 应用的详细内容,并且为您解答docker swarm管理工具的相关问题,此外,我们还将为您提供关于(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、7月25日 PWL线上分享|WebAssembly 的前世今生(by Michael Yuan, WasmEdge)、Docker 与 WasmEdge 合作,发布 WebAssembly 支持的知识。

本文目录一览:

在 WasmEdge 中使用 Docker 工具管理 WebAssembly 应用(docker swarm管理工具)

在 WasmEdge 中使用 Docker 工具管理 WebAssembly 应用(docker swarm管理工具)

这篇文章将演示如何通过利用 DockerHub 和 CRI-O 等 Docker 工具在 WasmEdge 中部署、管理和运行轻量级 WebAssembly 应用程序。

WasmEdge 由 CNCF (Cloud Native Computing Foundation) 托管的 WebAssembly runtime,是边缘计算应用程序的执行沙箱。

虽然 WebAssembly 最初是作为浏览器应用程序的 runtime 而发明的,但其轻量级和高性能的沙箱设计使其成为通用应用程序容器的一个极具吸引力的选择。

如果在 2008 年已经有了 WASM + WASI,那么我们压根无需创始 Docker 这个项目了。 — Docker 联合创始人 Solomon Hykes

与 Docker 相比, WebAssembly 在启动时快一百倍 , 占用更小的内存和磁盘空间,并且具有更优定义的安全沙箱。然而,缺点是 WebAssembly 需要自己的语言 SDK 和编译器工具链,使其作为开发者环境比 Docker 更受限制。WebAssembly 越来越多地用于边缘计算场景,通常这些场景中,部署 Docker 比较困难,或是应用程序的性能至关重要。

Docker 的一大优势是其丰富的工具生态系统。我们希望为 WasmEdge 开发者带来类似 Docker 的工具。为了实现这一点,我们为 CRI-O 创建了一个名为 runw 的替代 runner 来加载并运行 WebAssembly 字节码程序,如同他们是 Docker 镜像文件一样。

在 CRI-O 中安装 WebAssembly runner

为了在 CRI-O 中支持 WebAssembly,您只需下载 runw 二进制码发布并将其安装到您的 CRI-O 中。

因为 runw 二进制码已经包括了 WasmEdge,无需单独安装 WasmEdge 或任何其它 WebAssembly VM。

首先,确保你使用的是安装了 LLVM-10 的 Ubuntu 20.04。如果你使用的是不同的平台,请参阅如何为你的操作系统创建 runw 项目文档。

sudo apt install -y llvm-10-dev liblld-10-dev

确保你安装了 cri-o、 crictl、 containernetworking-plugins 和 buildah 或者 docker 。

下一步,下载 runw binary build

wget https://github.com/second-state/runw/releases/download/0.1.0/runw

现在,你可以安装 runw 进 CRI-O 作为 WebAssembly 的备选方案。

# Get the wasm-pause utility
sudo crictl pull docker.io/beststeve/wasm-pause

# Install runw into cri-o
sudo cp -v runw /usr/lib/cri-o-runc/sbin/runw
sudo chmod +x /usr/lib/cri-o-runc/sbin/runw
sudo sed -i -e ''s@default_runtime = "runc"@default_runtime = "runw"@'' /etc/crio/crio.conf
sudo sed -i -e ''s@pause_image = "k8s.gcr.io/pause:3.2"@pause_image = "docker.io/beststeve/wasm-pause"@'' /etc/crio/crio.conf
sudo sed -i -e ''s@pause_command = "/pause"@pause_command = "pause.wasm"@'' /etc/crio/crio.conf
sudo tee -a /etc/crio/crio.conf.d/01-crio-runc.conf <<EOF
[crio.runtime.runtimes.runw]
runtime_path = "/usr/lib/cri-o-runc/sbin/runw"
runtime_type = "oci"
runtime_root = "/run/runw"
EOF

最后,重启 cri-o ,从而使新的 WebAssembly runner 开始生效。

sudo systemctl restart crio

用 Rust 构建 Wasm 应用程序

下面案例中的 Wasm 应用程序是 Rust 写的。为了让这些程序工作,确保你安装了 Rust 和 rustwasmc 工具链。

你需要 Rust 编译器和 rustwasmc 来构建 Rust 源成为 wasm 字节码文件。如果你已经有一个 wasm 字节码程序,且只是想要用 cri-o 跑一遍,你可以跳过这个部分。

应用程序源代码仅为一个 main.rs 函数。在此处。该应用程序演示了如何使用标准 Rust API 从 WasmEdge 访问文件系统和其它操作系统资源。

fn main() {
  println!("Random number: {}", get_random_i32());
  println!("Random bytes: {:?}", get_random_bytes());
  println!("{}", echo("This is from a main function"));
  print_env();
  create_file("/tmp.txt", "This is in a file");
  println!("File content is {}", read_file("/tmp.txt"));
  del_file("/tmp.txt");
}

pub fn get_random_i32() -> i32 {
  let x: i32 = random();
  return x;
}

pub fn get_random_bytes() -> Vec<u8> {
  let mut rng = thread_rng();
  let mut arr = [0u8; 128];
  rng.fill(&mut arr[..]);
  return arr.to_vec();
}

pub fn echo(content: &str) -> String {
  println!("Printed from wasi: {}", content);
  return content.to_string();
}

pub fn print_env() {
  println!("The env vars are as follows.");
  for (key, value) in env::vars() {
    println!("{}: {}", key, value);
  }

  println!("The args are as follows.");
  for argument in env::args() {
    println!("{}", argument);
  }
}

pub fn create_file(path: &str, content: &str) {
  let mut output = File::create(path).unwrap();
  output.write_all(content.as_bytes()).unwrap();
}

pub fn read_file(path: &str) -> String {
  let mut f = File::open(path).unwrap();
  let mut s = String::new();
  match f.read_to_string(&mut s) {
    Ok(_) => s,
    Err(e) => e.to_string(),
  }
}

pub fn del_file(path: &str) {
  fs::remove_file(path).expect("Unable to delete");
}

你可以通过下面的命令行将应用程序构建到一个 wasm 字节码文件中。

rustwasmc build

wasm 字节码文件 在这里。

为 Wasm app 构建并发布一个 Docker Hub 镜像

您现在可以将整个 wasm 字节码文件发布到 Docker hub 中,就好像这是一个 Docker 镜像一样。

首先,在 pkg/ 目录中创建一个 Dockerfile,如下所示。

FROM scratch
ADD wasi_example_main.wasm .
CMD ["wasi_example_main.wasm"]

创建一个镜像并发布到 Docker hub。

sudo buildah bud -f Dockerfile -t wasm-wasi-example
sudo buildah push wasm-wasi-example docker://registry.example.com/repository:tag

# Example: the following command publishes the wasm image to the public Docker hub under user account "hydai"
sudo buildah push wasm-wasi-example docker://docker.io/hydai/wasm-wasi-example:latest

现在,你可以使用 Docker 工具(例如 crictl)将发布的 wasm 文件拉为镜像。 下面是我们发布的 wasm 文件镜像的示例。

sudo crictl pull docker.io/hydai/wasm-wasi-example

使用 CRI-O 启动 Wasm app

要启动并运行 wasm 文件,您需要为 CRI-O 创建两个配置文件。 创建一个 container_wasi.json 文件,如下所示。 它告诉 CRI-O runtime 应该从 Docker 存储库的哪里提取 wasm 文件映像。

{
  "metadata": {
    "name": "podsandbox1-wasm-wasi"
  },
  "image": {
    "image": "hydai/wasm-wasi-example:latest"
  },
  "args": [
    "wasi_example_main.wasm", "50000000"
  ],
  "working_dir": "/",
  "envs": [],
  "labels": {
    "tier": "backend"
  },
  "annotations": {
    "pod": "podsandbox1"
  },
  "log_path": "",
  "stdin": false,
  "stdin_once": false,
  "tty": false,
  "linux": {
    "resources": {
      "memory_limit_in_bytes": 209715200,
      "cpu_period": 10000,
      "cpu_quota": 20000,
      "cpu_shares": 512,
      "oom_score_adj": 30,
      "cpuset_cpus": "0",
      "cpuset_mems": "0"
    },
    "security_context": {
      "namespace_options": {
        "pid": 1
      },
      "readonly_rootfs": false,
      "capabilities": {
        "add_capabilities": [
          "sys_admin"
        ]
      }
    }
  }
}

接下来,创建一个 sandbox_config.json 文件,如下所示。 它定义了运行 wasm 应用程序的沙箱环境。

{
  "metadata": {
    "name": "podsandbox12",
    "uid": "redhat-test-crio",
    "namespace": "redhat.test.crio",
    "attempt": 1
  },
  "hostname": "crictl_host",
  "log_directory": "",
  "dns_config": {
    "searches": [
      "8.8.8.8"
    ]
  },
  "port_mappings": [],
  "resources": {
    "cpu": {
      "limits": 3,
      "requests": 2
    },
    "memory": {
      "limits": 50000000,
      "requests": 2000000
    }
  },
  "labels": {
    "group": "test"
  },
  "annotations": {
    "owner": "hmeng",
    "security.alpha.kubernetes.io/seccomp/pod": "unconfined"
  },
  "linux": {
    "cgroup_parent": "pod_123-456.slice",
    "security_context": {
      "namespace_options": {
        "network": 0,
        "pid": 1,
        "ipc": 0
      },
      "selinux_options": {
        "user": "system_u",
        "role": "system_r",
        "type": "svirt_lxc_net_t",
        "level": "s0:c4,c5"
      }
    }
  }
}

现在可以创建一个 CRI-O pod 如下:

# 创建 POD,输出将会和示例不同。
sudo crictl runp sandbox_config.json
7992e75df00cc1cf4bff8bff660718139e3ad973c7180baceb9c84d074b516a4

# 设置一个辅助变量供以后使用。
POD_ID=7992e75df00cc1cf4bff8bff660718139e3ad973c7180baceb9c84d074b516a4

自 pod ,您可以创建一个容器以隔离方式运行 wasm 字节码程序。

# 创建容器实例,输出将会和示例不同。
sudo crictl create $POD_ID container_wasi.json sandbox_config.json
1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f

最后,启动容器并查看 wasm 应用程序的输出。

# 列出容器,状态应该是 `Created`
sudo crictl ps -a

CONTAINER           IMAGE                           CREATED              STATE               NAME                     ATTEMPT             POD ID
1d056e4a8a168       hydai/wasm-wasi-example:latest   About a minute ago   Created             podsandbox1-wasm-wasi   0                   7992e75df00cc

# 启动容器
sudo crictl start 1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f
1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f

# 再次检查容器状态。#如果容器没有完成工作,你会看到运行状态。 #因为这个例子很小。此时您可能会看到 Exited。
sudo crictl ps -a
CONTAINER           IMAGE                           CREATED              STATE               NAME                     ATTEMPT             POD ID
1d056e4a8a168       hydai/wasm-wasi-example:latest   About a minute ago   Running             podsandbox1-wasm-wasi   0                   7992e75df00cc

# 当容器完成。你能看到状态变为 Exited。
sudo crictl ps -a
CONTAINER           IMAGE                           CREATED              STATE               NAME                     ATTEMPT             POD ID
1d056e4a8a168       hydai/wasm-wasi-example:latest   About a minute ago   Exited              podsandbox1-wasm-wasi   0                   7992e75df00cc

# 查看容器记录 
sudo crictl logs 1d056e4a8a168f0c76af122d42c98510670255b16242e81f8e8bce8bd3a4476f

Test 1: 打印随机数
Random number: 960251471

Test 2: 打印随机字节
Random bytes: [50, 222, 62, 128, 120, 26, 64, 42, 210, 137, 176, 90, 60, 24, 183, 56, 150, 35, 209, 211, 141, 146, 2, 61, 215, 167, 194, 1, 15, 44, 156, 27, 179, 23, 241, 138, 71, 32, 173, 159, 180, 21, 198, 197, 247, 80, 35, 75, 245, 31, 6, 246, 23, 54, 9, 192, 3, 103, 72, 186, 39, 182, 248, 80, 146, 70, 244, 28, 166, 197, 17, 42, 109, 245, 83, 35, 106, 130, 233, 143, 90, 78, 155, 29, 230, 34, 58, 49, 234, 230, 145, 119, 83, 44, 111, 57, 164, 82, 120, 183, 194, 201, 133, 106, 3, 73, 164, 155, 224, 218, 73, 31, 54, 28, 124, 2, 38, 253, 114, 222, 217, 202, 59, 138, 155, 71, 178, 113]

Test 3: 调用 echo 函数
Printed from wasi: This is from a main function
This is from a main function

Test 4: 打印环境变量
The env vars are as follows.
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
TERM: xterm
HOSTNAME: crictl_host
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
The args are as follows.
/var/lib/containers/storage/overlay/006e7cf16e82dc7052994232c436991f429109edea14a8437e74f601b5ee1e83/merged/wasi_example_main.wasm
50000000

Test 5: 创建文件 `/tmp.txt` 包含内容 `This is in a file`

Test 6: 从之前文件读取内容
File content is This is in a file

Test 7: 删除之前文件

下一步是什么呢

在本文中,我们看到了如何使用类似 Docker 的 CRI-O 工具启动、运行和管理 WasmEdge 应用程序。

我们的下一步是使用 Kubernetes 来管理 WasmEdge 容器。 为此,我们需要在 Kubernetes 中安装一个 runner 二进制文件,以便它可以同时支持常规 Docker 镜像和 wasm 字节码镜像。

插播

7 月 10 日,WasmEdge 将亮相 GTOC 开源技术峰会,带来 《WebAssembly 在云原生时代的应用》的主题演讲,欢迎大家来现场交流!

GOTC 全球开源技术峰会是由开放原子开源基金会与 Linux 基金会联合开源中国发起的,面向全球开发者的一场盛大开源技术盛宴。大会将携头部开源公司和顶级开源项目一起亮相,覆盖云原生、大数据、人工智能、物联网、区块链、DevOps、开源治理等多个技术领域,在为期 2 天的时间里,为开发者带来全球最新、最纯粹的开源技术,同时传播开源文化和理念,推动开源生态的建设和发展。 报名直戳:https://gotc.oschina.net/

(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly

(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly

WebAssembly很快。您可能已经听说了。但是,使WebAssembly快速运行的原因是什么?

在本系列中,我想向您解释为什么WebAssembly能够如此快速。

什么是WebAssember?

WebAssembly是一种使用除JavaScript以外的其他编程语言编写的代码并在浏览器中运行该代码的方法。因此,当人们说WebAssembly快速时,他们通常都是与JavaScript进行比较。

实际上,我们希望开发人员将在同一应用程序中同时使用WebAssembly和JavaScript。

但是将两者进行比较很有用,因此您可以了解WebAssembly的潜在影响。

JavaScript的一点历史

JavaScript创建于1995年。设计之初,她的速度并不是很快,并且在最初的十年中,她确实表现得并不是很快。

然后,浏览器开始变得更具竞争力。

在2008年,人们称之为特效战的时期开始了。多个浏览器添加了即时编译器,也称为JIT。在运行JavaScript时,JIT可以查看模式,并根据这些模式使代码运行得更快。

这些JIT的引入导致JavaScript性能出现拐点。JS的执行速度提高了10倍。

  

随着性能的提高,JavaScript开始用于人们从未期望过的用途,例如使用Node.js进行服务器端编程。通过提高性能,可以在全新的问题类别上使用JavaScript。

现在,WebAssembly可能使我们处于另一个拐点。

因此,让我们深入研究细节以了解使WebAssembly快速运行的原因。

 转自:https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/

5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程

5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程


在 Rust 中创建一个简单的 WebAssembly 应用程序,然后从 JavaScript 调用这个程序
本文所涉及的所有代码可以在 https://github.com/second-state/wasm-learning/tree/master/browser/triple 中找到。
系列教程
1. WebAssembly 快问快答
2. Rust 的 Hello world | WebAssembly 入门教程
在本教程中,我们将创建一个非常简单但很完整的 WebAssembly 应用程序。
Webassembly 应用程序通常由两部分组成。
  • 运行在 WebAssembly 虚拟机内部以执行计算任务的字节码程序
  • 提供 UI、networking、数据库,以及调用 WebAssembly 程序以执行关键计算任务或业务逻辑的主机应用程序
在本教程中,主机应用程序是用 JavaScript 编写的,并在 web 浏览器中运行。Webassembly 字节码程序是用 Rust 编写的。
现在,先让我们看看 Rust 程序是如何编写的。

在 Rust 中的 WebAssembly 程序


在这个例子中,Rust 程序将输入数字简单地增加了三倍并返回结果。首先将 WebAssembly 工具安装到 Rust 编译器。
  
    
  
  
  
# Install Rust

$
sudo apt-get update
$ sudo apt-get -y upgrade
$ curl --proto ''=https'' --tlsv1.2 -sSf https://sh.rustup.rs | sh
$ source $HOME/.cargo/env
  
    
  
  
  
# Install WebAssembly tools

$ rustup target add wasm32-wasi
$ rustup override set nightly
$ rustup target add wasm32-wasi --toolchain nightly
接下来,创建一个新的  cargo 项目。由于这个程序是从主机应用程序调用的,而不是作为独立的可执行文件运行,因此我们将创建一个  lib 项目。
  
    
  
  
  
$ cargo new --lib triple
$ cd triple
编辑  Cargo.toml 文件以添加 [lib]节。它会告诉编译器在哪里可以找到库的源代码,以及如何生成字节码输出。
  
    
  
  
  
[lib]
name = "triple_lib"
path = "src/lib.rs"
crate-type =["cdylib"]
下面是 Rust 程序  src/lib.rs 的内容. 实际上,你可以在这个库文件中定义多个外部函数,并且所有这些函数都可以通过 WebAssembly 在 JaveScript 主机上使用。
  
    
  
  
  
#[no_mangle]
pub extern fn triple(x: i32) -> i32 {
return 3 * x;
}
接下来你可以用下面的命令行编译 Rust 的源代码到WebAssembly的字节码中。
  
    
  
  
  
$ cargo +nightly build --target wasm32-wasi --release
WebAssembly 字节码文件是  target/wasm32-wasi/release/triple_lib.wasm


JavaScript 主机


我们使用 JavaScript 加载 WebAssembly 字节码程序并调用它的函数。由于大多数浏览器已经支持 WebAssembly, JavaScript 实际上可以作为一个网页运行。
无须赘述,下面是 JavaScript 模块的相关部分,用于加载、导出和调用 WebAssembly 函数。完整的网页源文件在这里。
  
    
  
  
  
<script>
if (!(''WebAssembly'' in window)) {
alert(
''you need a browser with wasm support enabled :('');
}
(
async () => {
const response = await fetch(''triple_lib.wasm'');
const buffer = await response.arrayBuffer();
const module = await WebAssembly.compile(buffer);
const instance = await WebAssembly.instantiate(module);
const exports = instance.exports;
const triple = exports.triple;

var buttonOne = document.getElementById(''buttonOne'');
buttonOne.value =
''Triple the number'';
buttonOne.addEventListener(
''click'', function() {
var input = $("#numberInput").val();
alert(input +
'' tripled equals '' + triple(input));
},
false);
})();
</script>
可以看到 JavaScript 代码加载了 WebAssembly 虚拟机的  triple_lib.wasm 文件, 导出其外部函数,然后根据需要调用这些函数。
将这个 HTML 文件和  triple_lib.wasm 文件放在web 服务器上,你就可以访问网页,在网页上输入的任何数字会自动乘以三。
那么字符串呢?
现在你注意到了,这个例子并不是一个 hello world。WebAssembly函数计算数字,但不会像 hello world 那样操作字符串。
这是为什么呢?我们将在下一个教程中回答这个问题,并给出一个真实的 hello world 示例。

微信不支持添加原文,可点击阅读原文,查看文中所提资源

本文分享自微信公众号 - WebAssembly 中文社区(webassemblywasm)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

7月25日 PWL线上分享|WebAssembly 的前世今生(by Michael Yuan, WasmEdge)

7月25日 PWL线上分享|WebAssembly 的前世今生(by Michael Yuan, WasmEdge)

活动分享:https://zhuanlan.zhihu.com/p/391355170

本周日 7 月 25 日上午十一点(北京时间)有 Papers We Love 活动,通过腾讯会议线上进行,由 Second State 的 CEO @Michael Yuan 为我们分享主题“WebAssembly 的前世今生”,欢迎大家参与。


内容介绍:

WebAssembly (Wasm) 最初为浏览器应用而生,但随着 WASI 的出现以及开发者生态的壮大,Wasm 作为一种轻量级的软件容器在服务端的作用愈发明显。服务端的 Wasm 提供了与本地代码相媲美的速度,但又不失安全性,可移植性,与可管理性。2021年,美国计算机协会的编程语言分会将 Wasm 评为年度最佳编程语言。同年,CNCF 接受了 WasmEdge 作为沙箱项目,Wasm 在云原生领域的影响力逐渐显现。

Wasm 本身是一个很简单的语言标准。但是如果要让 Wasm 应用于复杂的计算环境中,还需要很多的生态工具,包括高级语言编译器,SDK,动态编译器,安全沙箱,本地库函数,嵌入式 SDK,编排与管理工具,等等。在这个分享中,WasmEdge 的核心贡献者 Michael Yuan 博士会以 WasmEdge 为例,讨论 Wasm 的应用场景,以及在其开发与应用中可能遇到的各种问题。


分享人介绍:

Michael Yuan 博士是 WasmEdge 的创始人和核心开发者。WasmEdge 是一个由 CNCF 托管的开源 WebAssembly 虚拟机。其主要应用于边缘计算、Service Mesh 和嵌入式函数。Michael 撰写过6 本软件工程书籍,也是长期的开源贡献者。Michael 同时也是 Second State 的联合创始人。Second State 是一家开源基础软件初创公司,致力于商业化可持续地支持 WebAssembly 和 Rust 生态系统中的企业应用。


参会信息

会议主题:Papers We Love

会议时间:2021/07/25 11:00-12:30 (GMT+08:00) 中国标准时间 - 北京

点击链接入会,或添加至会议列表:

腾讯会议

会议 ID:564 886 910


Papers We Love 简介

Papers We Love 是一个全球性的网络,主要分享计算机领域的学术论文和工程实践,包括操作系统,分布式系统,数据库,存储,网络,计算机语言,编译器等主题,欢迎参与。


文章转载自Second State点击这里阅读原文了解更多


  • 中国 Open Source Summit 演讲提案征集|截止日期:8月15日


Linux基金会诚意邀您参与:

  • 开源多样性、公平性和包容性调查

  • FINOS金融服务中的开源状态调查


联系关于Linux基金会




Linux基金会是非营利性组织,是技术生态系统的重要组成部分。 

Linux基金会通过提供财务和智力资源、基础设施、服务、活动以及培训来支持创建永续开源生态系统。在共享技术的创建中,Linux基金会及其项目通过共同努力形成了非凡成功的投资。请长按以下二维码进行关注。

本文分享自微信公众号 - LFAPAC(gh_8442c14fe49e)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Docker 与 WasmEdge 合作,发布 WebAssembly 支持

Docker 与 WasmEdge 合作,发布 WebAssembly 支持

在 KubeCon NA 2022 的 Cloud native Wasm day 活动上, Docker 与 CNCF 的 WasmEdge Runtime 项目发布了 Docker+Wasm 技术预览。 只需一个命令 docker compose up, 上千万的 Docker 开发者可以立即构建、共享并运行一个完整的 Wasm 应用。

Wasm 最初是作为 Web 浏览器中的安全沙箱而开发的。近年来,它在服务器端作为 VM 和 Linux 容器 (LXC) 的安全、轻量级、快速和可移植的替代方案,有了很多应用程序。Linux 容器这一领域最初由 Docker 开创。

Docker+Wasm 中的标准 demo 应用是由 Second State 提供的。这是一个数据库驱动的 Web 应用程序,它有一个用于整个 Web 服务(微服务)的 WasmEdge “容器”,以及两个用于支持服务的 Linux 容器:一个用于 MySQL 数据库,一个用于 Niginx,为前端 UI 提供静态 HTML 页面。 这三个容器在同一个网络中并排运行并形成一个应用程序。 微服务用 Rust 编写并编译成 Wasm。 它有一个高性能(non-blocking)HTTP 服务器、一个事件处理程序(用于处理 HTTP 请求的业务逻辑)和一个 MySQL 数据库客户端。 整个“容器化”的 Wasm 微服务只有 3MB,而数据库和 Nignix 的 Linux 容器则需要好几百 MB。

Docker Compose 不仅将这些 Wasm 应用程序与侧容器一起运行,而且还将 Rust 源代码构建到 Wasm 中。 开发者甚至不需要安装 Rust 编译器工具链,因为整个构建环境也由 Docker 容器化。 Docker+Wasm 是真正的端到端解决方案。

随着 Docker 开启了引领了云原生时代的容器革命,Docker 在当今的“多运行时”世界支持 Wasm 的承诺,重要性愈发凸显。

Docker+Wasm 的发布非常有意义。 我们不再生活在单一 runtime 的世界中:有 linux 容器、Windows 容器和 Wasm 容器。 OCI 可以将它们全部打包,我应该能够使用 docker 构建和运行它们。 — Solomon Hykes, Docker 联合创始人。

Docker+Wasm 背后的技术主要来自开源社区。 例如,Docker 依赖于一个名为 runwasi 的容器 shim,最初 由 Microsoft 的 DeisLabs 创建, 来启动 WasmEdge 并执行 Wasm 程序。

深耕开源的可能远远不止 Docker 一家。 例如,红帽团队已经将 Wasm 运行时支持集成到 OCI 运行时 crun 中。 这使得整个 Kubernetes 堆栈能够无缝支持 WasmEdge 应用程序。 事实上,Liquid Reply 团队在 KubeCon 大会几天前用 WasmEdge 演示了 Podman+Wasm。

在 KubeCon 活动中展示的其他 Wasm 应用程序包括 AI 推理应用程序、基于 Dapr 的微服务和 streaming pipeline 中的数据处理函数。 现在有了 Docker+Wasm,开发者可以轻松构建、共享和运行这些应用程序。

今天关于在 WasmEdge 中使用 Docker 工具管理 WebAssembly 应用docker swarm管理工具的分享就到这里,希望大家有所收获,若想了解更多关于(转)WASM(WebAssember)快速了解第一篇——什么是WebAssembly、5分钟实现一个简单的 WebAssembly 应用|WebAssembly 入门教程、7月25日 PWL线上分享|WebAssembly 的前世今生(by Michael Yuan, WasmEdge)、Docker 与 WasmEdge 合作,发布 WebAssembly 支持等相关知识,可以在本站进行查询。

本文标签:

上一篇中介模式Mediator(中介模式和代理模式的区别)

下一篇边缘的容器化 — WasmEdge 与 seL4 RTOS