[Перевод] WebAssembly: Docker без контейнеров
Введение
Полгода назад Docker объявил о поддержке WebAssembly на базе WasmEdge.
В этой статье расскажем, что такое WebAssembly, почему эта технология актуальна для экосистемы Docker, а также приведем несколько практических примеров. Предполагается, что вы знакомы с инструментарием Docker. Чтобы продемонстрировать, как создать интерпретатор PHP, упаковать его как часть OCI-образа и запустить с помощью Docker, воспользуемся нашим WebAssembly-портом PHP.
Обратите внимание: эта статья скорее направлена на получение практического опыта, нежели на обсуждение технических тонкостей. Вы можете воспроизвести приведенные ниже примеры сами или довериться нам — результат выполнения всех команд мы публикуем.
WebAssembly — что это и зачем?
В этом разделе приводятся базовые сведения. Его можно пропустить, если вы уже знакомы с технологией.
Что такое WebAssembly?
Открытый стандарт WebAssembly (или Wasm) определяет формат двоичных инструкций, который позволяет создавать портируемые исполняемые файлы из исходников, написанных на различных языках программирования.
Wasm есть во всех браузерах
Эти исполняемые файлы могут работать в различных окружениях. Формат поддерживают все основные браузеры.
Как Wasm работает в браузерах
В движки браузеров интегрирована виртуальная машина Wasm (обычно называемая «средой исполнения Wasm»), которая и отвечает за выполнение Wasm-инструкций. Специализированные компиляторы (например, Emscripten) могут компилировать исходный код в Wasm. Технология позволяет переносить legacy-приложения в браузер и обеспечивает их прямое взаимодействие с JS-кодом в веб-приложениях на стороне клиента.
Wasm в браузере
Таким образом, традиционные настольные приложения теперь успешно работают в браузере, то есть их можно запускать на любом устройстве, на котором есть браузер с поддержкой Wasm. Среди примечательных примеров — Google Earth и библиотека компьютерного зрения OpenCV.
Как Wasm работает на серверах
Существуют рантаймы Wasm, которые могут работать вне браузера, в том числе в классических операционных системах, таких как Linux, Windows и macOS. Поскольку в данном случае на движок Javascript рассчитывать не приходится, коммуникация с внешним миром идет через различные интерфейсы — например, WASI (WebAssembly System Interface). Такие рантаймы позволяют Wasm-приложениям взаимодействовать с хост-системой по аналогии с POSIX (хотя есть и отличия). Проекты вроде WASI SDK и wasi-libc помогают компилировать существующие POSIX-совместимые приложения в WebAssembly.
Wasm на сервере
При этом достаточно скомпилировать приложение в модуль Wasm только один раз, и его можно будет запускать где угодно.
Чем так хорош Wasm?
Некоторые из особенностей, благодаря которым Wasm отлично работает в браузерах, делают его привлекательным и для server-side-разработки: