Aller au contenu

5. wslc ou Docker Desktop ?

Critère wslc (WSL containers) Docker Desktop
Installation incluse dans WSL ≥ 2.9.3 produit séparé
Maturité (sept. 2026) préversion publique stable
CLI proche de Docker docker
API pour applications Windows oui — NuGet Microsoft.WSL.Containers API Docker Engine (HTTP)
Gestion en entreprise Microsoft Defender for Endpoint, Intune Docker Business
Écosystème (Compose, Kubernetes, extensions, interface graphique) pas de commande compose en 2.9.11 ; Kubernetes, extensions, interface graphique à vérifier complet
  • wslc : besoin simple (lancer une base de données, un service, un outil), envie de ne pas dépendre de Docker Desktop, ou application Windows qui doit piloter des conteneurs.
  • Docker Desktop : projets basés sur Docker Compose, Kubernetes local, équipe déjà outillée autour de Docker.
  • Les deux : possible, mais chaque outil garde sa propre VM et sa propre mémoire. Sur une machine chargée, c’est un coût réel (voir le journal).

Une application Windows peut créer ses propres conteneurs Linux. Les objets suivent le cycle de vie :

Objet Rôle
WslcService vérifier que les composants WSL sont installés, version du service
Session hôte WSL qui gère les images et crée les conteneurs
Container démarrer, arrêter, inspecter, supprimer ; lancer des processus
Process lire stdout/stderr, écrire sur stdin, envoyer des signaux

Le paquet Microsoft.WSL.Containers 2.9.9 est une projection C#/WinRT compilée contre le SDK Windows 10.0.26100, avec une DLL native pour x64 et arm64 seulement. Le projet doit l’indiquer, sinon la compilation échoue avec CS1705 :

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0-windows10.0.26100.0</TargetFramework>
<WindowsSdkPackageVersion>10.0.26100.80</WindowsSdkPackageVersion>
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.WSL.Containers" Version="2.9.9" />
</ItemGroup>
using System.Text;
using Microsoft.WSL.Containers;
var missing = WslcService.GetMissingComponents();
if (missing.Count > 0)
{
Console.WriteLine($"Missing WSL components: {string.Join(", ", missing)} (run wsl --install)");
return 1;
}
var version = WslcService.GetVersion();
Console.WriteLine($"WSL container service {version.Major}.{version.Minor}.{version.Revision}");
// La session garde ses images et conteneurs dans son propre storage.vhdx.
var storage = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "WslcHost");
using var session = new Session(new SessionSettings("wslc-host", storage)
{
CpuCount = 2,
MemorySizeInMB = 2048
});
session.Start();
Console.WriteLine($"Session started, storage in {storage}");
await session.PullImageAsync(new PullImageOptions("docker.io/library/alpine:latest"));
foreach (var image in session.GetImages())
Console.WriteLine($"Image {image.Name} ({image.Size / 1024 / 1024} MB)");
using var container = session.CreateContainer(new ContainerSettings("alpine:latest")
{
Name = "wslc-host-hello",
InitProcess = new ProcessSettings
{
CommandLine = ["/bin/sh", "-c", "echo Hello from $(cat /etc/alpine-release) on $(uname -r)"],
OutputMode = ProcessOutputMode.Event
}
});
try
{
var exited = new TaskCompletionSource<int>();
container.InitProcess.OutputReceived += data => Console.Write(Encoding.UTF8.GetString(data));
container.InitProcess.Exited += code => exited.TrySetResult(code);
container.Start();
var exitCode = await exited.Task.WaitAsync(TimeSpan.FromMinutes(2));
Console.WriteLine($"Container {container.Id[..12]} exited with code {exitCode}");
return exitCode;
}
finally
{
// Sans cela, un Start en échec laisse le conteneur dans storage.vhdx et bloque son nom.
container.Delete(DeleteContainerOption.Force);
session.Terminate();
}
WSL container service 2.9.11
Session started, storage in C:\Users\spare\AppData\Local\WslcHost
Image alpine:latest (8 MB)
Hello from 3.24.1 on 6.18.40.1-microsoft-standard-WSL2
Container 2b900903f6c8 exited with code 0

Le programme complet, qui supprime aussi un conteneur laissé par une exécution plantée, est dans code/wsl-containers/wslc-host.

Sources : WSL container — Microsoft Learn, référence de l’API. Exemples complets : aka.ms/wslc-samples.

  • wslc = conteneurs natifs WSL, sans produit tiers, encore en préversion.
  • Docker Desktop reste plus complet (Compose, Kubernetes, interface graphique).
  • L’API Microsoft.WSL.Containers ouvre un usage que Docker Desktop ne couvre pas directement : des applications Windows qui embarquent des conteneurs Linux.

Choisis un service que tu lances aujourd’hui avec Docker (par exemple qdrant ou MongoDB) et fais-le tourner avec wslc. Note dans le journal ce qui diffère.

Piste

Si Docker publie déjà qdrant sur 6333, choisis un autre port Windows : wslc prendrait 6333 sans aucune erreur et enlèverait discrètement 127.0.0.1:6333 au conteneur Docker.

Fenêtre de terminal
wslc volume create qdrant-data
wslc run -d --name qdrant -p 16333:6333 -v qdrant-data:/qdrant/storage qdrant/qdrant
curl.exe http://127.0.0.1:16333/
wslc container stop qdrant

Points à observer : l’image est-elle retéléchargée ? Est-ce la même version que le latest de Docker ? Quelle mémoire consomme la VM ? Que journalise qdrant si tu montes un dossier Windows au lieu d’un volume ? Réponses dans le journal.