快速上手 Docker 最新 WebAssembly 技术预览版

news2024/9/26 1:24:48

本文为译文,原文见:https://nigelpoulton.com/getting-started-with-docker-and-wasm/
轻松体验 Docker 和 Wasm ——编写一个应用,将其编译为 Wasm,将其打包为 OCI 镜像,将之存储在 Docker Hub 中,使用 Docker 运行它......

Docker 最近发布了支持 WebAssembly 的 Docker Desktop 技术预览版。 他们还宣布了 Docker Hub 对 WebAssembly artifacts 的支持。

因为我觉得 WebAssembly 非常有意思,所以我想我应该把它们都试一试,然后写一篇文章来帮助其他任何想亲身体验 Docker 和 Wasm 的人。

宏观视角

WebAssembly (又称 Wasm) 创建非常小、非常快的二进制文件,这些二进制文件在任何地方的安全沙箱中执行,只要有一个 WebAssembly Runtime。说实话……它们比容器更小、更快、更安全,而且更加跨平台—— 这话是我说的,我承认我是容器的超级粉丝。

关于体积大小的例子……Michael Yuan 最近分享了有着完整的 HTTP 服务器 + MySQL 客户端“app服务器”,只有 2MB!其他人也分享了 Size 更小的 Example。

无论如何,WebAssembly 正成为云原生领域的一件大事,而 Docker 也想在此有一席之地。

体验 Docker 和 Wasm

我将一步一步带领你编写一个 hello world Wasm 应用,将其打包为 OCI 镜像以及推送到 Docker Hub,并使用 Docker 运行它。如果你想跟我一起做,你需要做下面两个准备,但如果你只是想阅读,那也没关系。

  • Docker Desktop
  • Rust 编程语言

可以从此页面上的链接安装 Docker Desktop 技术预览版,并从这里安装 Rust。Docker Desktop 和 Rust 安装后,我们将完成以下步骤:

  1. 配置 Rust 将代码编译成 Wasm
  2. 编写 app
  3. 将 app 编译成 Wasm 二进制文件
  4. 将 app 打包成 OCI 镜像
  5. 将镜像推送到 Docker Hub
  6. 使用 Docker 运行 Wasm app

下文的所有任务都将使用命令行执行。 你会需要 Docker Desktop 和 Rust 。

配置 Rust 将代码编译成 Wasm

运行下面的 rustup 命令,安装 wasm32-wasi target。这样 Rust 就可以将源代码编译成 Wasm 二进制文件。

rustup target add wasm32-wasi

如果你运行 rustup target list ,发现 wasm32-wasi (installed) 出现在列表里, Rust 就配置好了,你就可以创建这个app了。

写 app

运行以下命令来构建一个简单的 Rust app。 它将创建一个简单的 Hello World 应用 hello-docker/src/main.rs

cargo new hello-docker

检查 hello-docker/src/main.rs 文件并更改打印到屏幕上的文字。 我更改为打印“Hello, Docker Hub!” 了。如下。

fn main() {
    println!("Hello, Docker Hub!");
}

此时,Rust app 已编写好,并可以编译为 Wasm 二进制文件了。

将 app 编译为一个 Wasm 二进制码

运行以下 cargo 命令将 Rust app 为 wasm32-wasi 二进制文件。 这将创建一个 Wasm 字节码二进制文件,它可以在任何有 WebAssembly 运行时的系统上运行。

cargo 命令作为 Rust 的一部分已经安装。 它还知道在哪里可以找到源代码以及如何将其编译为 Wasm 二进制文件。

cargo build --target wasm32-wasi --release

该命令将 hello-docker.wasm Wasm 二进制文件输出到 hello-docker/target/wasm32-wasi/release 文件夹中。

我们将在接下来的步骤中借助 Docker 执行它。 然而,在此之前,我们会将其构建到 OCI 镜像中,以便它可以存储在 Docker Hub 中并由 Docker 执行。

将 Wasm app 构建到 OCI 镜像中

Docker 可以将 Wasm 模块打包到 OCI 镜像中( Docker 镜像的别名)。

现在执行此操作的方式感觉有点过时,我希望将来会有所改变。 但是,你从一个临时基础镜像开始,复制 Wasm 模块,并将程序设置为作为 Wasm 二进制文件执行。

以下的 Dockerfile 对此进行了描述。 在你的当前目录中创建它(你应该在你的 hello-docker 目录中)。

FROM scratch
COPY ./target/wasm32-wasi/release/hello-docker.wasm /hello-docker.wasm
ENTRYPOINT [ "hello-docker.wasm" ]

创建 Dockerfile 后,运行以下命令来构建镜像。 该命令假定你与 Dockerfile 位于同一目录中。

docker buildx build --platform wasi/wasm32 -t docker-wasm:0.1 .

--platform wasi/wasm32 flag 将镜像的目标操作系统设置为 wasi 并将目标架构设置为 wasm32。 -t docker-wasm:0.1 标记/命名镜像“docker-wasm:0.1”,最后的句点告诉 Docker 使用当前目录中的 Dockerfile。

运行以下命令以验证新镜像是否存在。

docker image ls

REPOSITORY      TAG    IMAGE ID        CREATED   SIZE
docker-wasm     0.1    6b43e0bdf164    2 mins    501kB

此时 Wasm app 被打包在了一个 OCI 镜像。

将 Wasm 应用推送到 Docker Hub

这是一个可选步骤。 如果你不打算使用 Docker Hub,请跳过。 但是,如果执行此步骤,则需要一个 Docker ID。 它们是免费的,如果想认真学习和使用 Docker,它们就很重要。

运行以下命令以使用你自己的 Docker ID 标记镜像,以便你可以将其推送到自己的 Docker Hub 存储库。 我的 Docker ID 是 nigelpoulton,所以我将运行下面的命令。

docker image tag docker-wasm:0.1 nigelpoulton/docker-wasm:0.1

使用标记有你的 Docker ID 的镜像,运行以下命令将其推送到 Docker Hub。 请记住替换成自己的 Docker ID。 我第一次尝试时失败了,我不得不执行手动 docker login 并再次运行命令。

docker image push nigelpoulton/docker-wasm:0.1

6b43e0bdf164: Pushed
33b9d7fa88a0: Pushed
4c601df9af6e: Pushed
0.1: digest: sha256:6b43...31f8, size: 526

此时 Wasm 应用被打包为 OCI 镜像并托管在 Docker Hub 上。 注意 OS/ARCH 和 SIZE 字段。

使用 Docker 运行 Wasm app

在撰写本文时,你需要 Docker Desktop 的技术预览版才能完成此步骤。 你可以在这篇文章中找到下载链接。

运行以下命令告诉 Docker 运行打包在 OCI 镜像中的 Wasm app。 为了可读性,它是一个打包在多行上的单个命令。

docker container run --rm --name=dockerwasm \
  --runtime=io.containerd.wasmedge.v1 \
  --platform=wasi/wasm32 \
  nigelpoulton/docker-wasm:0.1

flag 是 Docker 如何告诉 containerd 使用 runwasi containerd shim ,它使用 WasmEdge 运行打包在镜像中 Wasm 模块。

输出如下。

Hello, Docker Hub!

恭喜。 你成功使用 Docker 构建、共享和运行了 Wasm app!

总结

现在还是非常早期的阶段,写作本文时(2022 年 11 月),有些内容也许会过时。 实现细节会有变化,一些 CLI flag 也会改变。 例如,--platform=wasi/wasm32 已经计划更改为 wasi/wasm

然而,方向很明确,并且能够使用熟悉的 Docker 工具和技能去创建 WebAssembly app 是意义重大的

我也确信这只是 Docker 和 Wasm 的宏伟前景的很小一步!

如果你觉得 WasmEdge 还不错,别忘了给我们一个 star

https://github.com/WasmEdge/WasmEdge

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

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

相关文章

4 JMeter 参数化常用方式

文章目录2.4 JMeter 参数化常用方式2.4.1 用户定义的变量2.4.2 用户参数2.4.3 CSV数据文件设置 CSV Data Set Config2.4.4 函数(_counter)2.4 JMeter 参数化常用方式 2.4.1 用户定义的变量 应用场景:全局参数 添加方式: 测试计划->线程组->配置…

【AcWing每日一题】4366. 上课睡觉

有 N 堆石子,每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a[1,2,3,4,5],合并第 2,3 堆石子,则石子堆集合变为 a[1,5,4,5]。 我们希望…

LeetCodeday02

977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后&am…

Java开发学习(三十五)----SpringBoot快速入门及起步依赖解析

一、SpringBoot简介 SpringBoot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化 Spring 应用的初始搭建以及开发过程。 使用了 Spring 框架后已经简化了我们的开发。而 SpringBoot 又是对 Spring 开发进行简化的,可想而知 SpringBoot 使用的简…

做报表要用什么插件?

Excel 作为大家最熟悉的报表工具,很多表哥表姐每天都在使用,为了加强 Excel 的报表功能,市面上有非常多的 Excel 增强插件,为 Excel 增加了千奇百怪的能力。今天给大家介绍一款专门用来做中国式复杂报表的Excel 插件:思…

【不一样的递归大法】

🎁递归🎅递归🦌定义🎅何时用递归:递归三板斧🦌递归递归🦌递归大法:三板斧🎅如何快速写出递归函数:宏观的角度🎅解题突破🦌整数序列相关…

一文了解什么是NFT

一、什么是NFT NFT 是我们可以用来代表独特物品所有权的代币。他们让我们对艺术品、收藏品甚至房地产等事物进行代币化。资产的所有权由以太坊区块链保护——没有人可以修改所有权记录或复制/粘贴新的 NFT。 NFT 代表不可替代的代币。Non-fungible 是一个经济学术语&#xff…

伪操作和混合汇编

目录 一、伪操作: 二、C和汇编的混合编程 三、ATPCS协议(ARM-THUMB Procedure Call Standard) 一、伪操作: 不会生成代码,只是在编译之前告诉编译器怎么编译 GNU的伪操作一般都以‘.’开头 .global symbol 将symbo…

WEB 安全,浅谈 XSS 攻击(附简单实例)

什么是 XSS XSS(Cross-Site-Scripting),跨站脚本攻击,因为缩写和 CSS 重叠,被别人抢先了,所以只能叫做 XSS。 攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。若受害者运行这些恶意代码,攻击者就可以突破网站…

电感和磁珠有哪些区别?

由于电感和磁珠,很多人会容易认错,本期内容就讲讲,有哪些相似之处! 磁珠与电感不仅在外形上相似,他们在功能上也存在很多相似之处,甚至有时候磁珠和电感可以相互代替。但是磁珠与电感也不完全等同&#xff…

开关电源环路稳定性分析(09)——环路补偿六步法

大家好,这里是大话硬件。 我们来回顾一下前面8讲的内容,主要对下面的知识点进行了分析: 系统框图 反馈环节传递函数 功率级传递函数 PWM级传递函数 传递函数计算 如果我们把开关电源看成是不同的电路模块拼接而成,现在已经知…

c++模板认识以及使用

我们都知道c有函数重载的概念,比如我们写一个相加的函数,以整数为例,我们大概率是这样写: int Add(int x,int y) {return xy; } 并且我们知道c函数重载的概念,于是我们若是想写double类型,float类型&…

centos7安装php7.1 验证码GD库扩展

php安装不推荐使用源码包安装,版本太多。线上从php5.x一直升级到php7.1 程序可兼容 配置yum源 rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 添加epel…

使用Stabel Diffusion

Stabel Diffusion是由CompVis、stabel AI和LAION的研究人员和工程师创建的文本到图像的潜在扩散模型。它由来自LAION-5B数据库子集的512x512图像进行训练。LAION-5B是目前最大的、可自由访问的多模态数据集。 在这篇文章中,将介绍如何使用diffusion库实现Stabel Di…

MAC安装jmeter以及JDK配置

JDK配置 一、检查是否安装了jdk 打开终端,输入java -version校验jdk是否安装 我这已经安装了版本1.8.0版本的 若没有安装,则去官网下载jdk并安装 1、jdk下载官网:Java Downloads | Oracle tar包或者dmg,二者区别在于:…

7、GPIO输入按键检测(外部中断)

目录 0x01、简介 0x001、EXTI 简介 0x002、EXTI 功能框图 0x003、中断/事件线 0x02、硬件设计 0x03、相关库函数 0x0001、外部中断初始化 0x0002、外部中断GPIO引脚选择 0x04、编写函数 0x001、按键外部中断初始化 0x002、中断函数 0x05、源程序下载地址 0x01、简介…

Android插件化换肤原理—— 布局加载过程、View创建流程、Resources 浅析

前言 继上次 WebView 干货分享后,本次将分享下自己在探索学习 App 换肤功能过程中的相关知识,着重分享换肤的原理以及实现思路。 由于篇幅原因分为两篇博客,本文主要分析了 Android 布局加载流程,下一篇将具体讲解插件化换肤实现…

Linux——标准IO

文件的基础 概念:一组相关数据的有序集合 文件的类型: 常规文件-r 目录文件-d 字符设备文件-c:键盘 块设备文件-b:U盘 磁盘 管道文件-p 套接字文件-s 符号链接文件-I:快捷方式 标准I/O 流 file 标准IO用一个结构体类型来保存打…

数据质量管理—理论大纲与实践(B站)

0、背景 故事的开头,是一位业务部门的同事找到我们,咨询了一个经典问题: 「需求方经常说我们做的报表看起来数据不准,有什么办法吗?」 为了解释这个问题,我以我们团队在数据质量管理中积累下来的方法&am…

决策树和随机森林的python实现

文章目录决策树实现方法测试更好地展示结果调参调整max_depthscoring利用GridSearchCV确定最佳max_depthmin_samples_splitmin_impurity_decreasemax_features多参数同时选优采用最优参数特征重要性排序随机森林测试调参n_estimators调整max_depth调整max_features调整min_samp…