WSL-tároló

A WSL-tárolószolgáltatás két fő összetevővel rendelkezik: a Linux-tárolók létrehozására, futtatására és kezelésére szolgáló wslc.exe parancssori felülettel, valamint egy WSL-tároló API-val, amely lehetővé teszi, hogy Windows alkalmazásfejlesztők Linux-tárolókat használjanak az alkalmazáslogika részeként.

Important

A WSL-tároló funkcióhoz a WSL 2.9.3-s vagy újabb verziója szükséges. Ez a verzió jelenleg csak előzetes kiadásként érhető el, ezért telepítenie kell a PowerShell megnyitásával és a következő beírásával:

wsl --update --pre-release

Ellenőrizze a telepített verziót bármikor a használatával wsl --version.

WSL-tároló parancssori felülete

A WSL mostantól beépített bináris fájlként is szerepel wslc.exe . A cél egy jól ismert CLI-felület használata, amely lehetővé teszi a Linux-tárolók egyszerű létrehozását, futtatását és használatát.

Tekintse meg az alábbi példaparancsokat:

# 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

A szolgáltatás használatának megkezdéséről a tároló oktatóanyagában olvashat bővebben.

WSL-tároló API

Windows alkalmazások linuxos tárolókat is használhatnak! A WSL-tároló API NuGet-csomagja lehetővé teszi a Linux-tárolók programozott lekérését, futtatását és kezelését, beleértve az olyan kulcsfontosságú interakciókat, mint az stdin és az stdout, a fájlcsatlakozások, a hálózati csatlakoztatások, a GPU-hozzáférés stb.

A C, C# és C++ előrejelzések teljes API-felületét a WSL-tároló API-referenciája ismerteti.

Az API telepítése

A WSL container API a Microsoft.WSL.Containers NuGet-csomagban található, amely a C#-vetítést és a C++/WinRT fejléceket is biztosítja.

Adja hozzá a csomagot a projekthez a .NET parancssori felülettel:

dotnet add package Microsoft.WSL.Containers

Ezután importálja a névteret a kódba:

using Microsoft.WSL.Containers;

API – Áttekintés

Az API egy tároló futtatásának életciklusát tükröző kis objektumok köré van rendszerezve:

Objektum Leírás
WslcService Statikus belépési pont szolgáltatásszintű műveletekhez. Ezzel ellenőrizheti, hogy telepítve vannak-e a szükséges WSL-összetevők, lekérdezheti a szolgáltatás verzióját, és telepítheti a hiányzó függőségeket.
Session A tárolókat futtató, WSL-alapú gazdagép. A munkamenetek kezelik a lemezképeket (lekérés, importálás, betöltés, leküldés, címke, törlés) és tárolókat hoznak létre.
Container Munkamenetben létrehozott tároló. Ezzel elindíthatja, leállíthatja, megvizsgálhatja és törölheti a tárolót, és további folyamatokat futtathat benne.
Process Egy tárolóban futó Linux-folyamat. Segítségével olvashat a stdout/stderr elemekből, írhat ide: stdin, jeleket küldhet, és megfigyelheti a kilépési kódokat eseményeken keresztül.

Egy tipikus folyamat a következő: az előfeltételek ellenőrzése a(z) WslcService segítségével, egy Session létrehozása és elindítása, egy lemezkép letöltése, egy Container konfigurálása és létrehozása, majd annak elindítása és a Process objektumaival való interakció.

Mintatöredékek

Az alábbi kódrészletek ugyanazokat az alapvető építőelemeket jelenítik meg minden támogatott nyelven. A lapfülekkel válthat a C# és a C++ között.

Ellenőrizze, hogy a szükséges összetevők telepítve vannak-e:

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

Munkamenet létrehozása és indítása:

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

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

Kép lekérése folyamatjelentéssel:

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;

Hozzon létre egy tárolót, futtasson egy parancsot, és olvassa el a kimenetét:

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

Ha végzett, állítsa le és törölje a tárolót, majd állítsa le a munkamenetet az erőforrások felszabadításához:

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

Teljes körű minták

A fenti kódrészletek az alapvető építőelemeket mutatják. A teljes tároló-életciklust, képkezelést, portleképezéseket, kötetcsatlakozásokat, GPU-hozzáférést és interaktív stdin/stdout streamelést lefedő, futtatható példákért tekintse meg a WSL tároló API-mintáit.