Search

WASM + Docker를 이용한 Hello World 앱 만들기!

WebAssembly (WASM)은 브라우저에서 실행 가능하며 거의 원시 코드 속도로 코드를 실행할 수 있는 이진 명령 형식의 스택 기반 가상 머신입니다. WASM은 고수준 언어가 아니며 어셈블리 같은 저수준 언어로, 주요 브라우저 (Chrome, Firefox, Safari, Edge 등)에서 지원됩니다.
WebAssembly System Interface (WASI)는 WASM 코드가 하부 운영 체제와 파일 시스템에 액세스할 수 있도록 하는 인터페이스입니다. WASI는 웹 어셈블리 모듈이 호스트 환경과 상호 작용하기 위한 표준화된 시스템 호출을 제공합니다. 이를 통해 WASM 코드를 백엔드에서 실행할 수 있습니다.
WASM은 언어에 구애받지 않기 때문에 Rust, C++, C 등 다양한 프로그래밍 언어로 작성된 코드를 WASM으로 컴파일하고 브라우저에서 실행할 수 있습니다. 이는 개발자가 더 많은 옵션을 가지고 다양한 언어의 장점을 활용하여 웹 애플리케이션을 구축할 수 있도록 합니다.

TL;DR

이 글에서는 Rust를 사용하여 Hello World 앱을 만들고, WASM 바이너리로 컴파일하고 Docker Desktop에서 실행하는 방법을 살펴보겠습니다.

WASM + Docker Hello World!

Rust 및 WASM 패키지 설치

먼저, Rust 프로그래밍 언어를 설치해야 합니다. 공식 웹 사이트의 지침에 따라 Rust를 설치할 수 있습니다:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
Shell
복사
이 명령을 실행하면 Rust와 함께 패키지 매니저인 Cargo가 함께 설치됩니다. 설치 후에는 다음 명령을 실행하여 $PATH 변수를 업데이트해야 합니다:
source "$HOME/.cargo/env"
Shell
복사
이제 Rust가 제대로 설치되었는지 확인할 수 있습니다:
rustc --version
Shell
복사

프로젝트 생성

Rust 프로젝트를 생성하려면 먼저 Rust 프로젝트를 모아둘 디렉토리로 이동해야 합니다. 그런 다음, 다음 명령어를 실행하여 새 Rust 프로젝트를 생성합니다:
cargo new hello-wasm
Shell
복사
이 명령은 hello-wasm이라는 새 디렉토리를 만들고 Rust 라이브러리의 기본 구조를 생성합니다. Git이 이미 초기화되어 있지만 아직 커밋은 이루어지지 않은 상태입니다.
src/lib.rs에는 Hello World 코드가 이미 작성되어 있습니다.
fn main() { println!("Hello, world!"); }
Rust
복사
이 앱을 일반적인 방법으로 빌드하려면 다음 명령어를 실행합니다:
cargo build
Shell
복사
이 명령은 바이너리 파일을 생성하고 target/dev에 저장합니다. 이 바이너리 파일은 로컬 머신에서 실행 가능하며 플랫폼에 따라 달라집니다.

WASM 바이너리 빌드

WASM 런타임에 사용할 수 있는 새로운 타겟을 추가해야 합니다.
rustup target add wasm32-wasi
Shell
복사
그런 다음 다음 명령어를 사용하여 이 타겟을 빌드 명령에 추가합니다:
cargo build --target wasm32-wasi
Shell
복사
이 명령은 WASM 바이너리를 생성하고 target/wasm32-wasi에 저장합니다.

Docker 이미지 만들기

WASI와 WASM을 사용하는 Docker 컨테이너를 빌드하려면 먼저 설정에서 "컨테이너를 가져오고 저장하는 기능"을 활성화해야 합니다.
먼저, 다음 내용의 Dockerfile을 생성합니다.
# syntax=docker/dockerfile:1 FROM scratch COPY ./target/wasm32-wasi/debug/hello-wasm.wasm /hello.wasm ENTRYPOINT [ "hello.wasm" ]
Docker
복사
그런 다음 다음 명령어를 사용하여 Docker 이미지를 빌드합니다.
docker buildx build --platform wasi/wasm32 -t hello-wasm .
Shell
복사
이미지가 생성되었는지 확인하려면 다음 명령어를 실행합니다.
docker image ls
Shell
복사
종속성과 함께 520KB의 이미지가 생성됩니다. 이미지를 실행하려면 다음 명령어를 실행합니다.
docker run \ --runtime=io.containerd.wasmedge.v1 \ --platform=wasi/wasm32 \ hello-wasm
Shell
복사
이 명령은 Hello, world!라는 출력을 제공합니다.

결론

WebAssembly는 거의 원시 코드 속도로 실행되며 플랫폼 독립적입니다. Docker Desktop은 WasmEdge 런타임을 제공하며 WASM 앱을 Docker 컨테이너로 래핑하여 비-WASM 컨테이너와 함께 Docker Compose 설정에서 실행할 수 있습니다.

다른 읽을 거리들