Kontainer WSL

Fitur kontainer WSL memiliki dua komponen utama: CLI yang dipanggil wslc.exe untuk membangun, menjalankan, dan berinteraksi dengan kontainer Linux dan API kontainer WSL yang memungkinkan pengembang aplikasi Windows menggunakan kontainer Linux sebagai bagian dari logika aplikasi mereka.

CLI kontainer WSL

WSL sekarang termasuk wslc.exe sebagai biner bawaan. Tujuannya adalah untuk memiliki antarmuka CLI yang familier, memungkinkan Anda untuk dengan mudah membangun, menjalankan, dan berinteraksi dengan kontainer Linux.

Lihat beberapa contoh perintah di bawah ini:

# 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

Anda dapat mempelajari lebih lanjut tentang cara memulai fitur ini di tutorial kontainer kami.

API kontainer WSL

Windows aplikasi juga dapat menggunakan kontainer Linux! Paket NuGet API kontainer WSL memungkinkan Anda untuk menarik, menjalankan, dan berinteraksi secara terprogram dengan kontainer Linux, termasuk interaksi utama seperti stdin dan stdout, pemasangan file, pemasangan jaringan, akses GPU, dan banyak lagi.

Untuk permukaan API lengkap di seluruh proyeksi C, C#, dan C++, lihat referensi API kontainer WSL.

Menginstal API

API kontainer WSL dikirim dalam Microsoft.WSL.Containers paket NuGet, yang menyediakan proyeksi C# dan header C++/WinRT.

Tambahkan paket ke proyek Anda dengan CLI .NET:

dotnet add package Microsoft.WSL.Containers

Kemudian impor namespace dalam kode Anda:

using Microsoft.WSL.Containers;

Ringkasan API

API diatur di sekitar sekumpulan kecil objek yang mencerminkan siklus hidup menjalankan kontainer:

Objek Deskripsi
WslcService Titik masuk statis untuk operasi tingkat layanan. Gunakan untuk memeriksa apakah komponen WSL yang diperlukan diinstal, mengkueri versi layanan, dan menginstal dependensi yang hilang.
Session Host yang didukung WSL yang menjalankan kontainer Anda. Sesi mengelola gambar (menarik, mengimpor, memuat, mendorong, menandai, menghapus) dan membuat kontainer.
Container Kontainer yang dibuat di dalam sesi. Gunakan untuk memulai, menghentikan, memeriksa, dan menghapus kontainer, dan untuk menjalankan proses tambahan di dalamnya.
Process Proses Linux yang berjalan dalam kontainer. Gunakan ini untuk membaca stdout/stderr, menulis ke stdin, mengirim sinyal, dan memantau kode keluar melalui event.

Alur umumnya adalah: memverifikasi prasyarat dengan WslcService, membuat dan memulai Session, menarik gambar, mengonfigurasi dan membuat Container, lalu memulainya dan berinteraksi dengan objeknya Process .

Contoh cuplikan

Cuplikan di bawah ini menunjukkan blok penyusun inti yang sama dalam setiap bahasa yang didukung. Gunakan tab untuk beralih antara C# dan C++.

Periksa apakah komponen yang diperlukan diinstal:

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

Membuat dan memulai sesi:

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

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

Tarik gambar dengan pelaporan kemajuan:

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;

Buat kontainer, jalankan perintah, dan baca outputnya:

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();

Setelah selesai, hentikan dan hapus kontainer, lalu hentikan sesi untuk merilis sumber daya:

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

Contoh lengkap menyeluruh

Cuplikan di atas menunjukkan blok penyusun inti. Untuk contoh lengkap dan dapat dijalankan yang mencakup siklus hidup kontainer lengkap, manajemen gambar, pemetaan port, pemasangan volume, akses GPU, dan streaming interaktif stdin/stdout , lihat sampel API kontainer WSL.