Контейнер WSL

Компонент контейнера WSL имеет два основных компонента: интерфейс командной строки, который вызывается wslc.exe для сборки, запуска и взаимодействия с контейнерами Linux и API контейнера WSL, позволяя разработчикам приложений Windows использовать контейнеры Linux в рамках логики приложения.

Интерфейс командной строки контейнеров WSL

WSL теперь включает в себя wslc.exe как встроенный двоичный файл. Его цель — иметь знакомый интерфейс командной строки, позволяющий легко создавать, запускать и взаимодействовать с контейнерами Linux.

См. некоторые из приведенных ниже примеров команд:

# 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

Дополнительные сведения о начале работы с этой функцией см. в руководстве по контейнерам.

API контейнеров WSL

Windows приложения также могут использовать контейнеры Linux! Пакет NuGet для API контейнеров WSL позволяет программно загружать, запускать контейнеры Linux и взаимодействовать с ними, включая такие важные возможности, как stdin и stdout, монтирование файловых систем, сетевое монтирование, доступ к GPU и многое другое.

Полный интерфейс API для проекций C, C#и C++ см. в справочнике по API контейнеров WSL.

Установка API

API контейнеров для WSL входит в состав пакета NuGet Microsoft.WSL.Containers, который предоставляет как проекцию для C#, так и заголовки C++/WinRT.

Добавьте пакет в проект с помощью интерфейса командной строки .NET:

dotnet add package Microsoft.WSL.Containers

Затем импортируйте пространство имен в вашем коде:

using Microsoft.WSL.Containers;

Обзор API

API организован вокруг небольшого набора объектов, которые отражают жизненный цикл запуска контейнера:

Object Description
WslcService Статическая точка входа для операций на уровне службы. Используйте его, чтобы проверить, установлены ли необходимые компоненты WSL, запрашивать версию службы и устанавливать отсутствующие зависимости.
Session Хост на базе WSL, на котором запускаются ваши контейнеры. Сеанс управляет изображениями (вытягиванием, импортом, загрузкой, отправкой, тегом, удалением) и создает контейнеры.
Container Контейнер, созданный внутри сеанса. Используйте его для запуска, остановки, проверки и удаления контейнера, а также для выполнения дополнительных процессов внутри него.
Process Процесс Linux, выполняющийся в контейнере. Используйте его для чтения stdout/stderr, записи в stdin, отправки сигналов и отслеживания кодов завершения через события.

Типичный порядок действий: проверка предварительных требований с помощью WslcService, создание и запуск Session, загрузка образа, настройка и создание Container, а затем его запуск и взаимодействие с его объектами Process.

Примеры фрагментов

В приведенных ниже фрагментах показаны одни и те же основные стандартные блоки на каждом поддерживаемом языке. Используйте вкладки для переключения между C# и C++.

Убедитесь, что установлены необходимые компоненты:

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

Создайте и запустите сеанс:

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

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

Загрузка образа с отображением хода выполнения:

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;

Создайте контейнер, выполните команду и прочитайте его выходные данные:

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

По завершении остановите и удалите контейнер, а затем завершите сеанс, чтобы освободить ресурсы:

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

Полные комплексные примеры

Приведённые выше фрагменты показывают ключевые базовые компоненты. Полные готовые к запуску примеры, охватывающие весь жизненный цикл контейнера, управление образами, сопоставление портов, монтирование томов, доступ к GPU и интерактивную потоковую передачу stdin/stdout, см. в примерах API контейнеров WSL.