Contêiner WSL

O recurso de contêiner do WSL tem dois componentes principais: uma CLI chamada wslc.exe para compilar, executar e interagir com contêineres do Linux e uma API de contêiner WSL, permitindo que Windows desenvolvedores de aplicativos usem contêineres do Linux como parte de sua lógica de aplicativo.

CLI de contêiner do WSL

O WSL agora inclui wslc.exe como um binário interno. Sua meta é ter uma interface familiar da CLI, permitindo que você crie, execute e interaja facilmente com contêineres do Linux.

Veja alguns dos comandos de exemplo abaixo:

# 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

Você pode saber mais sobre como começar a usar esse recurso em nosso tutorial de contêiner.

API de contêiner do WSL

Windows aplicativos também podem usar contêineres do Linux! O pacote NuGet da API de contêiner do WSL permite baixar, executar e interagir programaticamente com contêineres Linux, incluindo interações importantes como stdin e stdout, montagens de arquivos, montagens de rede, acesso à GPU e muito mais.

Para obter a superfície de API completa entre as projeções C, C#e C++, consulte a referência da API de contêiner do WSL.

Instalar a API

A API de contêineres do WSL é distribuída no pacote NuGet Microsoft.WSL.Containers, que inclui tanto a projeção para C# quanto os arquivos de cabeçalho do C++/WinRT.

Adicione o pacote ao seu projeto com a CLI do .NET:

dotnet add package Microsoft.WSL.Containers

Em seguida, importe o namespace em seu código:

using Microsoft.WSL.Containers;

Visão geral da API

A API é organizada em torno de um pequeno conjunto de objetos que espelham o ciclo de vida da execução de um contêiner:

Objeto Description
WslcService Ponto de entrada estático para operações de nível de serviço. Use-o para verificar se os componentes WSL necessários estão instalados, consultar a versão do serviço e instalar dependências ausentes.
Session Um host com suporte WSL que executa seus contêineres. Uma sessão gerencia imagens (pull, importação, carregamento, push, marca, exclusão) e cria contêineres.
Container Um contêiner criado dentro de uma sessão. Use-o para iniciar, parar, inspecionar e excluir o contêiner e executar processos adicionais dentro dele.
Process Um processo do Linux em execução em um contêiner. Use-o para ler stdout/stderr, escrever em stdin, enviar sinais e monitorar os códigos de saída por meio de eventos.

Um fluxo típico é: verificar os pré-requisitos com WslcService, criar e iniciar um Session, baixar uma imagem, configurar e criar um Container, e então iniciá-lo e interagir com seus objetos Process.

Trechos de exemplo

Os snippets abaixo mostram os mesmos blocos de construção principais em cada idioma com suporte. Use as guias para alternar entre C# e C++.

Verifique se os componentes necessários estão instalados:

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

Crie e inicie uma sessão:

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

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

Baixar uma imagem com indicação de progresso:

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;

Crie um contêiner, execute um comando e leia sua saída:

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

Quando terminar, interrompa e exclua o contêiner e encerre a sessão para liberar recursos:

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

Exemplos completos de ponta a ponta

Os snippets acima mostram os blocos de construção principais. Para obter exemplos completos e executáveis que abrangem o ciclo de vida completo do contêiner, o gerenciamento de imagens, os mapeamentos de porta, as montagens de volume, o acesso à GPU e o streaming interativo stdin/stdout , consulte os exemplos de API de contêiner do WSL.