WSL コンテナー

WSL コンテナー機能には、Linux コンテナーのビルド、実行、操作を行う wslc.exe と WSL コンテナー API という 2 つの主要なコンポーネントがあり、アプリ開発者Windowsアプリ開発者がアプリ ロジックの一部として Linux コンテナーを使用できるようにします。

WSL コンテナー CLI

WSL には、組み込みのバイナリとして wslc.exe が含まれるようになりました。 その目的は、使い慣れた CLI インターフェイスを使用して、Linux コンテナーを簡単にビルド、実行、操作できるようにすることです。

以下のコマンド例をいくつか参照してください。

# Run a container
wslc run --rm -it ubuntu:latest bash -c "echo Hello world from WSL container!"
# List available images
wslc image ls
# Run a web server
wslc run -it --rm -d -p 8080:80 --name web nginx
# Get its content
curl localhost:8080
# List the container
wslc container ps
# Stop the container
wslc container stop web

この機能の使用を開始する方法の詳細については、 コンテナーのチュートリアルを参照してください

WSL コンテナー API

Windowsアプリケーションでも Linux コンテナーを利用できます。 WSL コンテナー API NuGet パッケージを使用すると、stdin や stdout などの主要な対話、ファイル マウント、ネットワーク マウント、GPU アクセスなど、Linux コンテナーをプログラムでプル、実行、操作できます。

C、C#、および C++ プロジェクション全体にわたる完全な API サーフェスについては、 WSL コンテナー API リファレンスを参照してください

API をインストールする

WSL コンテナー API は、C# プロジェクションと C++/WinRT ヘッダーの両方を提供する Microsoft.WSL.Containers NuGet パッケージに付属しています。

.NET CLI を使用してプロジェクトにパッケージを追加します。

dotnet add package Microsoft.WSL.Containers

次に、コードに名前空間をインポートします。

using Microsoft.WSL.Containers;

API の概要

この API は、コンテナーの実行のライフサイクルを反映する小さなオブジェクト セットを中心に構成されています。

Object Description
WslcService サービス レベルの操作の静的エントリ ポイント。 これを使用して、必要な WSL コンポーネントがインストールされていることを確認し、サービスのバージョンを照会し、不足している依存関係をインストールします。
Session コンテナーを実行する WSL ベースのホスト。 セッションは、イメージ (プル、インポート、読み込み、プッシュ、タグ、削除) を管理し、コンテナーを作成します。
Container セッション内に作成されたコンテナー。 コンテナーの開始、停止、検査、削除、およびコンテナー内の追加プロセスの実行に使用します。
Process コンテナーで実行されている Linux プロセス。 これを使用して、 stdout/stderrの読み取り、 stdinへの書き込み、シグナルの送信、イベントによる終了コードの観察を行います。

一般的なフローは次のとおりです: WslcService で前提条件を確認し、Session を作成して起動し、イメージをプルし、Container を構成して作成し、次にそれを起動して、その Process オブジェクトを操作します。

サンプル スニペット

次のスニペットは、サポートされている各言語で同じコア構成要素を示しています。 タブを使用して、C# と C++ を切り替えます。

必要なコンポーネントがインストールされていることを確認します。

ComponentFlags missing = WslcService.GetMissingComponents();
if (missing != ComponentFlags.None)
{
    Console.WriteLine($"WSL components are missing ({missing}). Run: wsl --install");
    return;
}

セッションを作成して開始します。

var sessionSettings = new SessionSettings("MyApp", @"C:\WslcData")
{
    CpuCount = 4,
    MemoryMB = 4096
};

var session = new Session(sessionSettings);
session.Start();

進行状況レポートを使用してイメージをプルします。

var pull = session.PullImageAsync(new PullImageOptions("docker.io/library/alpine:latest"));
pull.Progress = (op, progress) =>
    Console.WriteLine($"Pull: {progress.Status} {progress.CurrentBytes}/{progress.TotalBytes}");
await pull;

コンテナーを作成し、コマンドを実行し、その出力を読み取ります。

var initProcess = new ProcessSettings
{
    CmdLine = new[] { "/bin/echo", "Hello from WSL Container!" },
    OutputMode = ProcessOutputMode.Event
};

var containerSettings = new ContainerSettings("alpine:latest")
{
    Name = "hello-container",
    InitProcess = initProcess
};

var container = session.CreateContainer(containerSettings);

container.InitProcess.OutputReceived += data =>
    Console.Write(Encoding.UTF8.GetString(data));

container.Start();

完了したら、コンテナーを停止して削除してから、セッションを終了してリソースを解放します。

container.Stop(Signal.SIGTERM, TimeSpan.FromSeconds(10));
container.Delete(DeleteContainerFlags.None);
session.Terminate();

完全なエンドツーエンドのサンプル

上記のスニペットは、コア構成要素を示しています。 完全なコンテナー ライフサイクル、イメージ管理、ポート マッピング、ボリューム マウント、GPU アクセス、対話型の stdin/stdout ストリーミングをカバーする実行可能な完全な例については、 WSL コンテナー API のサンプルを参照してください。