5. wslc ou Docker Desktop ?
Comparaison
Section intitulée « Comparaison »| 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 |
Quand choisir quoi
Section intitulée « Quand choisir quoi »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).
L’API WSL container
Section intitulée « L’API WSL container »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.11Session started, storage in C:\Users\spare\AppData\Local\WslcHostImage alpine:latest (8 MB)Hello from 3.24.1 on 6.18.40.1-microsoft-standard-WSL2Container 2b900903f6c8 exited with code 0Le 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.
À retenir
Section intitulée « À retenir »wslc= conteneurs natifs WSL, sans produit tiers, encore en préversion.- Docker Desktop reste plus complet (Compose, Kubernetes, interface graphique).
- L’API
Microsoft.WSL.Containersouvre un usage que Docker Desktop ne couvre pas directement : des applications Windows qui embarquent des conteneurs Linux.
Exercice
Section intitulée « Exercice »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.
wslc volume create qdrant-datawslc run -d --name qdrant -p 16333:6333 -v qdrant-data:/qdrant/storage qdrant/qdrantcurl.exe http://127.0.0.1:16333/wslc container stop qdrantPoints à 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.