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 のサンプルを参照してください。
Windows Subsystem for Linux