Docker + WebAssembly - コンテナの新時代

2025.12.13

Docker + WebAssemblyの概要

DockerはWebAssembly(Wasm)ワークロードのネイティブサポートを開始しました。従来のコンテナとWasmコンテナを同じツールチェーンで管理でき、より軽量で高速な実行環境が利用可能になります。

なぜWasmなのか

コンテナとWasmの比較

項目LinuxコンテナWasmコンテナ
起動時間秒単位ミリ秒単位
イメージサイズ数十MB〜GB数百KB〜MB
メモリ使用量多い少ない
セキュリティ名前空間分離サンドボックス
ポータビリティOS依存完全に独立

Wasmコンテナの作成

Rustでの例

// main.rs
fn main() {
    println!("Hello from WebAssembly!");
}
# Wasmターゲットにビルド
rustup target add wasm32-wasip1
cargo build --target wasm32-wasip1 --release

Dockerfileの作成

# syntax=docker/dockerfile:1
FROM scratch
COPY ./target/wasm32-wasip1/release/hello.wasm /hello.wasm
ENTRYPOINT ["/hello.wasm"]

ビルドと実行

# Wasmイメージをビルド
docker buildx build --platform wasi/wasm -t hello-wasm .

# 実行
docker run --runtime=io.containerd.wasmedge.v1 hello-wasm

WASIp2(WASI Preview 2)

新しいWASI仕様により、より多くの機能が利用可能になりました。

// ファイルシステムアクセス
use std::fs;

fn main() {
    let content = fs::read_to_string("/data/config.txt").unwrap();
    println!("Config: {}", content);
}
# ホストディレクトリをマウント
docker run --runtime=io.containerd.wasmedge.v1 \
  -v ./data:/data \
  hello-wasm

Docker Composeとの統合

# docker-compose.yml
services:
  api:
    image: my-wasm-api
    platform: wasi/wasm
    runtime: io.containerd.wasmedge.v1
    ports:
      - "8080:8080"

  web:
    image: nginx
    depends_on:
      - api

ユースケース

エッジコンピューティング

flowchart TB
    Cloud["クラウド<br/>(フル機能)"]
    Edge["エッジ<br/>(リソース制限)<br/>← Wasmで軽量に実行"]
    Device["デバイス"]

    Cloud --> Edge --> Device

サーバーレス関数

  • コールドスタートが高速
  • メモリ効率が良い
  • マルチテナント環境で安全

プラグインシステム

  • サンドボックス化されたプラグイン実行
  • 言語に依存しないプラグイン

サポートされるランタイム

ランタイム特徴
WasmEdge高性能、AI推論対応
WasmtimeBytecode Alliance開発
SpinFermyon開発、サーバーレス向け
# ランタイムの確認
docker info | grep -i wasm

制限事項

現時点での制限:
- ネットワーク機能は限定的
- 一部のシステムコールは未サポート
- GPU/ハードウェアアクセスは制限
- 既存のLinuxバイナリは直接実行不可

まとめ

Docker + WebAssemblyは、コンテナ技術の新しい選択肢を提供します。軽量で高速起動が必要なワークロード、特にエッジやサーバーレス環境での活用が期待されます。今後、WASIの成熟に伴い、より多くのユースケースに対応していくでしょう。

← 一覧に戻る