作者:Asen Alexandrov,Wasm Labs 工程師,文中的我們均指作者或 Wasm Labs。
上篇文章我們了解了服務(wù)端 Wasm 為什么有著重要的作用、什么是 WasmEdge 以及如何讓解釋型語(yǔ)言編寫(xiě)的程序在 Wasm 里運(yùn)行。這篇文章,我們將通過(guò)動(dòng)手示例了解在 Docker + Wasm 背景下的 Wasm container 有什么好處以及如何運(yùn)行一個(gè)服務(wù) WordPress 的 php.wasm 鏡像。
動(dòng)手示例
讓我們開(kāi)始吧!在動(dòng)手示例中,我們將使用編譯為 Wasm 的 PHP 解釋器。我們會(huì):
構(gòu)建一個(gè) Wasm 容器。
比較 Wasm 和原生二進(jìn)制文件。
比較傳統(tǒng)容器和 Wasm 容器。
展示 Wasm 的可移植性
前期準(zhǔn)備
如果想在本地重現(xiàn)這些示例,你需要使用以下部分或全部?jī)?nèi)容來(lái)準(zhǔn)備你的環(huán)境:
WASI SDK - 從構(gòu)建 C 代碼構(gòu)建 WebAssembly 應(yīng)用程序
PHP - 為了比較而運(yùn)行本機(jī) PHP 二進(jìn)制文件
WasmEdge Runtime - 運(yùn)行 WebAssembly 應(yīng)用程序
Docker Desktop + Wasm (本文寫(xiě)作時(shí),作為穩(wěn)定 beta 版在 Docker Desktop4.15版[3]可用) - 能夠運(yùn)行 Wasm 容器
我們還充分運(yùn)用 webassembly-language-runtimes[4] repo,它提供了將 PHP 解釋器構(gòu)建為 WebAssembly 應(yīng)用程序的方法。可以像這樣查看 demo 分支:
?
?
git?clone?--depth=1?-b?php-wasmedge-demo? ???https://github.com/vmware-labs/webassembly-language-runtimes.git?wlr-demo cd?wlr-demo
?
?
構(gòu)建一個(gè) Wasm 容器
第一個(gè)示例,我們將展示如何構(gòu)建基于 C 的應(yīng)用程序,例如 PHP 解釋器。
該構(gòu)建使用 WASI-SDK 工具集。它包括一個(gè)可以構(gòu)建到 wasm32-wasi 目標(biāo)的 clang 編譯器,以及在 WASI 之上實(shí)現(xiàn)基本 POSIX 系統(tǒng)調(diào)用接口的 wasi-libc。使用 WASI SDK,我們可以從 PHP 的代碼庫(kù)中構(gòu)建一個(gè)用 C 編寫(xiě)的 Wasm 模塊,。之后,我們需要一個(gè)非常簡(jiǎn)單的基于 scratch 的 Dockerfile 來(lái)制作一個(gè)可以使用 Docker+Wasm 運(yùn)行的 OCI 鏡像。
構(gòu)建一個(gè) WASM 二進(jìn)制碼
假設(shè)你現(xiàn)在位于 wlr-demo ?文件夾,這是前期準(zhǔn)備工作的一部分,可以運(yùn)行以下命令來(lái)構(gòu)建 Wasm 二進(jìn)制文件。
export?WASI_SDK_ROOT=/opt/wasi-sdk/ export?WASMLABS_RUNTIME=wasmedge ./wl-make.sh?php/php-7.4.32/?&&?tree?build-output/php/php-7.4.32/bin/ ...?(?a?few?minutes?and?hundreds?of?build?log?lines)幾分鐘和數(shù)百行構(gòu)建日志 build-output/php/php-7.4.32/bin/ ├──?php-cgi-wasmedge └──?php-wasmedge
PHP 是用 autoconf 和 make 構(gòu)建的。 所以如果你看一眼腳本 ?scripts/wl-build.sh ,你會(huì)注意到我們?cè)O(shè)置了所有相關(guān)變量,如 CC、LD、 CXX 等,以使用來(lái)自 WASI_SDK 的編譯器。
export?WASI_SYSROOT="${WASI_SDK_ROOT}/share/wasi-sysroot" export?CC=${WASI_SDK_ROOT}/bin/clang export?LD=${WASI_SDK_ROOT}/bin/wasm-ld export?CXX=${WASI_SDK_ROOT}/bin/clang++ export?NM=${WASI_SDK_ROOT}/bin/llvm-nm export?AR=${WASI_SDK_ROOT}/bin/llvm-ar export?RANLIB=${WASI_SDK_ROOT}/bin/llvm-ranlib
然后,進(jìn)一步深入查看 ?php/php-7.4.32/wl-build.sh,可以看到像通常一樣,我們使用 autoconf 構(gòu)建過(guò)程。
./configure?--host=wasm32-wasi?host_alias=wasm32-musl-wasi? ???--target=wasm32-wasi?target_alias=wasm32-musl-wasi? ???${PHP_CONFIGURE}?||?exit?1 ... make?-j?${MAKE_TARGETS}?||?exit?1
WASI 是一項(xiàng)正在進(jìn)行的工作,許多 POSIX 調(diào)用仍然不能在它之上實(shí)現(xiàn)。因此,要構(gòu)建 PHP,我們必須在原始代碼庫(kù)之上應(yīng)用多個(gè)補(bǔ)丁。
我們?cè)谏厦婵吹捷敵龆M(jìn)制文件會(huì)轉(zhuǎn)到 build-output/php/php-7.4.32。在下面的示例中,我們將使用專(zhuān)門(mén)為 WasmEdge 構(gòu)建的 php-wasmedge 二進(jìn)制文件,因?yàn)樗峁┓?wù)端 socket 支持,服務(wù)端 socket 支持還不是 WASI 的一部分。
優(yōu)化二進(jìn)制碼
Wasm 是一個(gè)虛擬指令集,因此任何運(yùn)行時(shí)的默認(rèn)行為都是即時(shí)解釋這些指令。當(dāng)然,這在某些情況下可能會(huì)讓速度變慢。因此,為了通過(guò) WasmEdge 獲得兩全其美的效果,你可以創(chuàng)建一個(gè) AOT(提前編譯)優(yōu)化的二進(jìn)制文件,它可以在當(dāng)前機(jī)器上原生運(yùn)行,但仍然可以在其他機(jī)器上進(jìn)行解釋。
要?jiǎng)?chuàng)建優(yōu)化的二進(jìn)制文件,請(qǐng)運(yùn)行以下命令:
wasmedgec?--enable-all?--optimize?3? ???build-output/php/php-7.4.32/bin/php-wasmedge? ???build-output/php/php-7.4.32/bin/php-wasmedge-aot
我們?cè)谙旅娴睦又惺褂眠@個(gè) build-output/php/php-7.4.32/bin/php-wasmedge-aot 二進(jìn)制碼。要了解有關(guān) WasmEdge AOT 優(yōu)化二進(jìn)制文件的更多信息,請(qǐng)查看這里。[5]
構(gòu)建 OCI 鏡像
現(xiàn)在我們有了一個(gè)二進(jìn)制文件,我們可以將它包裝在一個(gè) OCI 鏡像中。讓我們看一下這個(gè) images/php/Dockerfile.cli。 我們需要做的就是復(fù)制 Wasm 二進(jìn)制文件并將其設(shè)置為 ENTRYPOINT。
FROM?scratch ARG?PHP_TAG=php-7.4.32 ARG?PHP_BINARY=php COPY?build-output/php/${PHP_TAG}/bin/${PHP_BINARY}?/php.wasm ENTRYPOINT?[?"php.wasm"?]
我們還可以在鏡像添加更多內(nèi)容,當(dāng) Docker 運(yùn)行它時(shí),Wasm 二進(jìn)制文件可以訪問(wèn)這些內(nèi)容。例如,在 images/php/Dockerfile.server 中,我們還添加了一些 docroot 內(nèi)容,在容器啟動(dòng)時(shí)由 php.wasm 提供服務(wù)。
FROM?scratch ARG?PHP_TAG=php-7.4.32 ARG?PHP_BINARY=php COPY?build-output/php/${PHP_TAG}/bin/${PHP_BINARY}?/php.wasm COPY?images/php/docroot?/docroot ENTRYPOINT?[?"php.wasm"?,?"-S",?"0.0.0.0:8080",?"-t",?"/docroot"]
基于以上文件,我們可以輕松地在本地構(gòu)建我們的 php-wasm 鏡像。
docker?build?--build-arg?PHP_BINARY=php-wasmedge-aot?-t?ghcr.io/vmware-labs/php-wasm:7.4.32-cli-aot?-f?images/php/Dockerfile.cli?. docker?build?--build-arg?PHP_BINARY=php-wasmedge-aot?-t?ghcr.io/vmware-labs/php-wasm:7.4.32-server-aot?-f?images/php/Dockerfile.server?.
原生 vs Wasm
現(xiàn)在讓我們將原生 PHP 二進(jìn)制文件與 Wasm 二進(jìn)制文件在本地和 Docker 容器中分別進(jìn)行比較。我們將使用相同的 index.php 文件并將運(yùn)行它時(shí)得到的結(jié)果與以下內(nèi)容進(jìn)行比較:
php
php-wasmedge-aot
在傳統(tǒng)容器中運(yùn)行的 php
在 Wasm 容器中運(yùn)行的 php-wasmedge-aot
在下面所有的示例中,我們使用同樣的 images/php/docroot/index.php 文件,讓我們來(lái)看一下。簡(jiǎn)而言之,該腳本將:
使用 phpversion 和 php_uname 展示解釋器版本和它運(yùn)行的平臺(tái)
打印腳本可以訪問(wèn)的所有環(huán)境變量的名稱(chēng)
打印一條包含當(dāng)前時(shí)間和日期的問(wèn)候消息
列出根文件夾的內(nèi)容 /
Hello?from?PHP??running?on?""
List?env?variable?names
?$value)?{ ????echo??$key?.?"?"; } echo?" "; ?>Hello
Contents?of?'/'
?$value)?{ ????echo??$value?.?"?"; } echo?" "; ?>
Native PHP 運(yùn)行 index.js
我們使用本地 php 二進(jìn)制碼時(shí),看到一個(gè)基于 Linux 的平臺(tái)。
58 個(gè)環(huán)境變量的列表,腳本可以在需要時(shí)訪問(wèn)
/ 中所有文件和文件夾的列表,如果需要,腳本可以再次訪問(wèn)這些文件和文件夾
$?php?-f?images/php/docroot/index.phpHello?from?PHP?7.4.3?running?on?"Linux?alexandrov-z01?5.15.79.1-microsoft-standard-WSL2?#1?SMP?Wed?Nov?23?0146?UTC?2022?x86_64"
List?env?variable?names
Running?with?58?environment?variables: SHELL?NVM_INC?WSL2_GUI_APPS_ENABLED?rvm_prefix?WSL_DISTRO_NAME?TMUX?rvm_stored_umask?TMUX_PLUGIN_MANAGER_PATH?MY_RUBY_HOME?NAME?RUBY_VERSION?PWD?NIX_PROFILES?LOGNAME?rvm_version?rvm_user_install_flag?MOTD_SHOWN?HOME?LANG?WSL_INTEROP?LS_COLORS?WASMTIME_HOME?WAYLAND_DISPLAY?NIX_SSL_CERT_FILE?PROMPT_COMMAND?NVM_DIR?rvm_bin_path?GEM_PATH?GEM_HOME?LESSCLOSE?TERM?CPLUS_INCLUDE_PATH?LESSOPEN?USER?TMUX_PANE?LIBRARY_PATH?rvm_loaded_flag?DISPLAY?SHLVL?NVM_CD_FLAGS?LD_LIBRARY_PATH?XDG_RUNTIME_DIR?PS1?WSLENV?XDG_DATA_DIRS?PATH?DBUS_SESSION_BUS_ADDRESS?C_INCLUDE_PATH?NVM_BIN?HOSTTYPE?WASMER_CACHE_DIR?IRBRC?PULSE_SERVER?rvm_path?WASMER_DIR?OLDPWD?BASH_FUNC_cr-open%%?_Hello
Today,?Wednesday,?2022-12-14,?at?1236?we?greet?you?with?this?message!Contents?of?'/'
apps?bin?boot?dev?docroot?etc?home?init?lib?lib32?lib64?libx32?lost+found?media?mnt?nix?opt?path?proc?root?run?sbin?snap?srv?sys?tmp?usr?var?wsl.localhost
php-aot-wasm 運(yùn)行 index.js
如果我們?cè)?WasmEdge 使用 php-aot-wasm 我們看到
一個(gè) wasi/wasm32 平臺(tái)
沒(méi)有環(huán)境變量,因?yàn)闆](méi)有明確暴露給 Wasm 應(yīng)用程序
Wasm 應(yīng)用程序未獲得對(duì) / 的明確訪問(wèn)權(quán)限,因此嘗試列出其內(nèi)容失敗并出現(xiàn)錯(cuò)誤
自然地,為了讓 php-wasmedge-aot 能夠讀取 index.php 文件,我們必須明確地向 WasmEdge 聲明我們想要預(yù)先打開(kāi) images/php/docroot 以便在 Wasm 應(yīng)用程序的上下文中作為 /docroot 進(jìn)行訪問(wèn)。這顯而易見(jiàn)展示了 Wasm 除了可移植性之外的最大優(yōu)勢(shì)之一。我們得到了更佳的安全性,因?yàn)槌敲鞔_說(shuō)明,否則無(wú)法訪問(wèn)任何內(nèi)容。
$?wasmedge?--dir?/docroot:$(pwd)/images/php/docroot? ???build-output/php/php-7.4.32/bin/php-wasmedge-aot?-f?/docroot/index.phpHello?from?PHP?7.4.32?running?on?"wasi?(none)?0.0.0?0.0.0?wasm32"
List?env?variable?names
Running?with?0?environment?variables:Hello
Today,?Wednesday,?2022-12-14,?at?1046?we?greet?you?with?this?message!Contents?of?'/'
Warning:?scandir(/):?failed?to?open?dir:?Capabilities?insufficient?in?/docroot/index.php?on?line?27 Warning:?scandir():?(errno?76):?Capabilities?insufficient?in?/docroot/index.php?on?line?27 Warning:?array_diff():?Expected?parameter?1?to?be?an?array,?bool?given?in?/docroot/index.php?on?line?27 Warning:?Invalid?argument?supplied?for?foreach()?in?/docroot/index.php?on?line?27
容器中的 PHP 運(yùn)行 index.js
當(dāng)我們從一個(gè)傳統(tǒng)的容器中使用 php 時(shí)我們看到
基于 Linux 的平臺(tái)
腳本有權(quán)訪問(wèn)的 14 個(gè)環(huán)境變量的列表
帶有當(dāng)前時(shí)間和日期的問(wèn)候消息
包含根文件夾內(nèi)容的列表 /
與在主機(jī)上使用 php 運(yùn)行它相比,已經(jīng)有明顯區(qū)別,表現(xiàn)更佳。由于 / 的環(huán)境變量和內(nèi)容是“虛擬的”并且僅存在于容器內(nèi)。
docker?run?--rm? ???-v?$(pwd)/images/php/docroot:/docroot? ???php:7.4.32-cli? ???php?-f?/docroot/index.phpHello?from?PHP?7.4.32?running?on?"Linux?227b2bc2f611?5.15.79.1-microsoft-standard-WSL2?#1?SMP?Wed?Nov?23?0146?UTC?2022?x86_64"
List?env?variable?names
Running?with?14?environment?variables: HOSTNAME?PHP_INI_DIR?HOME?PHP_LDFLAGS?PHP_CFLAGS?PHP_VERSION?GPG_KEYS?PHP_CPPFLAGS?PHP_ASC_URL?PHP_URL?PATH?PHPIZE_DEPS?PWD?PHP_SHA256Hello
Today,?Wednesday,?2022-12-14,?at?1035?we?greet?you?with?this?message!Contents?of?'/'
bin?boot?dev?docroot?etc?home?lib?lib64?media?mnt?opt?proc?root?run?sbin?srv?sys?tmp?usr?var
php-aot-wasm 在一個(gè)容器中運(yùn)行 index.js
如果我們?cè)?WasmEdge 使用 php-aot-wasm 我們看到
一個(gè) wasi/wasm32 平臺(tái)
只有 2 個(gè)基礎(chǔ)設(shè)施環(huán)境變量,使用在 containerd 中運(yùn)行的 WasmEdge shim 預(yù)先設(shè)置
容器中 / 內(nèi)所有文件和文件夾的列表,明確預(yù)打開(kāi)以供 Wasm 應(yīng)用程序訪問(wèn)(WasmEdge shim 中的邏輯的一部分)
注意:如果你仔細(xì)觀察,會(huì)發(fā)現(xiàn)要從這個(gè)鏡像運(yùn)行一個(gè)容器,我們必須:
通過(guò) --runtime=io.containerd.wasmedge.v1 將命令行參數(shù)直接傳遞給 php.wasm 明確聲明運(yùn)行時(shí),而不包括二進(jìn)制文件本身。拉到上面可以看到我們可以使用傳統(tǒng)的 PHP 容器明確編寫(xiě)完整的命令,包括 php 二進(jìn)制文件(不是必需的)。
最后一點(diǎn),即使使用 Docker,Wasm 也加強(qiáng)了運(yùn)行 index.php 的安全性,因?yàn)楸┞督o它的要少得多。
docker?run?--rm? ???--runtime=io.containerd.wasmedge.v1? ???-v?$(pwd)/images/php/docroot:/docroot? ???ghcr.io/vmware-labs/php-wasm:7.4.32-cli-aot? ???-f?/docroot/index.phpHello?from?PHP?7.4.32?running?on?"wasi?(none)?0.0.0?0.0.0?wasm32"
List?env?variable?names
Running?with?2?environment?variables: PATH?HOSTNAMEHello
Today,?Wednesday,?2022-12-14,?at?1110?we?greet?you?with?this?message!Contents?of?'/'
docroot?etc?php.wasm
傳統(tǒng)容器 vs Wasm 容器
我們構(gòu)建并運(yùn)行了一個(gè) Wasm 二進(jìn)制文件,并將其作為容器運(yùn)行。我們看到了 Wasm 和傳統(tǒng)容器之間的輸出差異以及 Wasm 帶來(lái)的高級(jí)“沙箱隔離”。我們可以輕松看到的兩種容器之間的其他差異。
首先,我們將運(yùn)行兩個(gè) daemon 容器,看看我們?nèi)绾谓忉層嘘P(guān)它們的一些統(tǒng)計(jì)信息。然后我們將檢查容器鏡像的差異。
容器數(shù)據(jù)
讓我們運(yùn)行兩個(gè) daemon 容器 - 一個(gè)是從傳統(tǒng)的 php 鏡像,另一個(gè)是從 php-wasm 鏡像。
docker?run?--rm?-d? ???-p?8083:8080?-v?$(pwd)/images/php/docroot:/docroot? ???php:7.4.32-cli? ???-S?0.0.0.0:8080?-t?/docroot docker?run?--rm?-d? ???--runtime=io.containerd.wasmedge.v1? ???-p?8082:8080?-v?$(pwd)/images/php/docroot:/docroot? ???ghcr.io/vmware-labs/php-wasm:7.4.32-cli-aot? ???-S?0.0.0.0:8080?-t?/docroot
但是如果我們看 docker stats,我們只看到傳統(tǒng)容器的數(shù)據(jù)。這之后可能會(huì)變化,因?yàn)?Docker+Wasm 現(xiàn)在是 beta 版特性。所以,如果真的想看看發(fā)生了什么,可以改為監(jiān)視對(duì)照組。每個(gè)傳統(tǒng)容器都有自己的控制組,如 docker/ee44...。另一方面,Wasm 容器作為 podruntime/docker 控制組的一部分包含在內(nèi),可以間接觀察它們的 CPU 或內(nèi)存消耗。
$?systemd-cgtop?-kP?--depth=10 Control?Group???????????Tasks????%CPU?????Memory podruntime??????????????145??????0.1??????636.3M podruntime/docker???????145??????0.1??????636.3M docker??????????????????2????????0.0??????39.7M docker/ee444b...????????1????????0.0??????6.7M?
鏡像大小
首先,探索鏡像,我們看到 Wasm 容器鏡像比傳統(tǒng)鏡像小得多。即使是 alpine ?版本的 php 容器也比 Wasm 容器大。
$?docker?images REPOSITORY?????????????????????TAG?????????????????IMAGE?ID???????CREATED??????????SIZE php????????????????????????????7.4.32-cli??????????680c4ba36f1b???2?hours?ago??????166MB php????????????????????????????7.4.32-cli-alpine???a785f7973660???2?minutes?ago????30.1MB ghcr.io/vmware-labs/php-wasm???7.4.32-cli-aot??????63460740f6d5???44?minutes?ago???5.35MB
這是意料之中的,因?yàn)閷?duì)于 Wasm,我們只需要在容器內(nèi)添加可執(zhí)行二進(jìn)制文件,而對(duì)于傳統(tǒng)容器,我們?nèi)匀恍枰獊?lái)自運(yùn)行二進(jìn)制文件的操作系統(tǒng)的一些基本庫(kù)和文件。這種大小差異對(duì)于第一次拉取鏡像的速度以及進(jìn)行在本地存儲(chǔ)庫(kù)中占用的空間非常有幫助。
Wasm 可移植性
Wasm 最大優(yōu)勢(shì)之一就是它的可移植性。當(dāng)人們想要一個(gè)可移植的應(yīng)用程序時(shí),Docker 已經(jīng)提供了傳統(tǒng)的容器作為一種選擇。然而,除了鏡像特別大之外,傳統(tǒng)容器還綁定到它們運(yùn)行的平臺(tái)架構(gòu)。作為程序員,相比許多人都經(jīng)歷過(guò)這種坎坷:針對(duì)不同的架構(gòu),必須構(gòu)建支持的軟件版本,并為每種架構(gòu)打包對(duì)應(yīng)鏡像。
WebAssembly 帶來(lái)了真正的可移植性。構(gòu)建一次二進(jìn)制文件,就能在任何地方運(yùn)行它。作為這種可移植性的證明,我們準(zhǔn)備了幾個(gè)通過(guò)我們?yōu)?WebAssembly 構(gòu)建的 PHP 解釋器運(yùn)行 WordPress 的示例。
當(dāng) PHP 作為獨(dú)立的 Wasm 應(yīng)用程序運(yùn)行時(shí),它會(huì)為 WordPress 提供服務(wù)。它也可以在 Docker+Wasm 容器中運(yùn)行。此外,它還能在嵌入 Wasm 運(yùn)行時(shí)的任何應(yīng)用程序中運(yùn)行。在我們的示例中,這是 apache httpd,它可以通過(guò) mod_wasm 使用 Wasm 應(yīng)用程序作為內(nèi)容處理程序。最后,PHP.wasm 也可以在瀏覽器中運(yùn)行。
通過(guò) WasmEdge 服務(wù) WordPress
我們?yōu)楸敬窝菔緶?zhǔn)備了一個(gè)緊湊的 WordPress+Sqlite 示例。由于它是 ghcr.io/vmware-labs/php-wasm:7.4.32-server-wordpress 容器鏡像的一部分,我們先將其下載到本地。
此命令將只創(chuàng)建一個(gè)臨時(shí)容器(拉取鏡像),將 WordPress 文件復(fù)制到 /tmp/wp/docroot,然后刪除容器。
container_id=$(docker?create?ghcr.io/vmware-labs/php-wasm:7.4.32-server-wordpress)?&&? ???mkdir?/tmp/wp?&&? ???docker?cp?$container_id:/docroot?/tmp/wp/?&&? ???docker?rm?$container_id
現(xiàn)在我們有了 WordPress,讓我們添加服務(wù)器:
wasmedge?--dir?/docroot:/tmp/wp/docroot? ???build-output/php/php-7.4.32/bin/php-wasmedge-aot? ???-S?0.0.0.0:8085?-t?/docroot
可以訪問(wèn) http://localhost:8085[6] ,使用由 PHP Wasm 解釋器服務(wù)的 WordPress。
通過(guò) ?Docker+Wasm ?服務(wù) WordPress
自然地,有了 Docker 會(huì)容易很多。
docker?run?--rm?--runtime=io.containerd.wasmedge.v1? ???-p?8086:8080?-v?/tmp/wp/docroot/:/docroot/? ???ghcr.io/vmware-labs/php-wasm:7.4.32-cli-aot? ???-S?0.0.0.0:8080?-t?/docroot
可以訪問(wèn) http://localhost:8086[7] 并使用由 PHP Wasm 解釋器服務(wù)的 WordPress,這回是在 Docker 容器中運(yùn)行。
通過(guò) mod_wasm in Apache HTTPD 服務(wù) WordPress
Apache HTTPD 是使用最廣泛的 HTTP 服務(wù)器之一?,F(xiàn)在有了 mod_wasm,它還可以運(yùn)行 WebAssembly 應(yīng)用程序。為了避免在本地安裝和配置它,我們準(zhǔn)備了一個(gè)容器,其中包含 Apache HTTPD、mod_wasm 和 WordPress。
docker?run?-p?8087:8080?projects.registry.vmware.com/wasmlabs/containers/php-mod-wasm:wordpress
可以訪問(wèn) http://localhost:8087[8] 并使用由 PHP Wasm 解釋器服務(wù)的 WordPress,它由 Apache HTTPD 中的 mod_wasm 加載。
直接在瀏覽器中服務(wù) WordPress
訪問(wèn) https://wordpress.wasmlabs.dev[9] 獲得示例。你將看到一個(gè)框架,其中 PHP Wasm 解釋器會(huì)現(xiàn)場(chǎng)渲染 WordPress。
結(jié)論
感謝閱讀本文。需要消化的內(nèi)容很多,但我們希望本文有助于理解 WebAssembly 的能力以及它如何與你現(xiàn)有的代碼庫(kù)和工具(包括 Docker)結(jié)合運(yùn)行。期待看到你使用 Wasm 編程!
關(guān)于?WasmEdge
WasmEdge 是輕量級(jí)、安全、高性能、可擴(kuò)展、兼容OCI的軟件容器與運(yùn)行環(huán)境。目前是 CNCF 沙箱項(xiàng)目。WasmEdge 被應(yīng)用在 SaaS、云原生,service mesh、邊緣計(jì)算、邊緣云、微服務(wù)、流數(shù)據(jù)處理等領(lǐng)域。
[1]
Wasm Labs @ VMware OCTO: https://wasmlabs.dev/
[2]
Docker+WebAssembly 的演講: https://www.bilibili.com/video/BV1314y1w7vp/
[3]
4.15版: https://docs.docker.com/desktop/release-notes/#4150
[4]
webassembly-language-runtimes: https://github.com/vmware-labs/webassembly-language-runtimes
[5]
查看這里。: https://wasmlabs.dev/articles/docker-without-containers/build-output/php/php-7.4.32/bin/php-wasmedge-aot
[6]
http://localhost http://localhost:8085/
[7]
http://localhost https://wasmlabs.dev/articles/docker-without-containers/
[8]
http://localhost https://wasmlabs.dev/articles/docker-without-containers/
[9]
https://wordpress.wasmlabs.dev: https://wordpress.wasmlabs.dev/
編輯:黃飛
?
評(píng)論
查看更多