WSL Containers в работе на Windows 11
WSL Containers в работе на Windows 11

Windows 11 теперь умеет самостоятельно собирать, запускать и управлять Linux-контейнерами без фонового Docker Desktop. Microsoft называет эту функцию WSL Containers. Мы установили предварительную версию, прогнали через неё несколько реальных задач и готовы рассказать, что работает, где всё ещё нужен Docker и как запустить всё на своём ПК.

WSL Containers не следует путать со следующей версией WSL 2: мы уже рассказывали, как Microsoft опровергла слухи о WSL 3. Функция вышла в публичное превью, поэтому мы установили её, с нуля собрали собственный образ контейнера и прогнали его через несколько сценариев, чтобы понять, насколько всё стабильно.

Запуск WSLCd на Windows 11
Запуск WSLCd на Windows 11

Что такое WSL Container в Windows 11

WSL Container это встроенная функция Windows Subsystem for Linux, позволяющая создавать, запускать и управлять Linux-контейнерами напрямую из Windows без установки Docker Desktop, Podman Desktop или других сторонних сред выполнения. Решение поставляется в двух компонентах:

  • Первый компонент: утилита командной строки wslc.exe, которая добавляется в PATH после обновления WSL. Microsoft также предоставляет псевдоним container.exe, так что обе команды указывают на один исполняемый файл. Те, кто работал с Docker, узнают синтаксис: команды wslc run, wslc build и wslc container list выглядят почти как их аналоги в Docker.

  • Второй компонент: WSL Container API, распространяемый в виде NuGet-пакета с поддержкой C, C++ и C#. Разработчики Windows-приложений могут использовать его для интеграции Linux-контейнеров непосредственно в свои программы.

Вместо того чтобы требовать от пользователей установки отдельной среды выполнения, Windows-приложение может незаметно запустить Linux-контейнер в фоновом режиме для выполнения кода, доступного только под Linux, а затем уничтожить его после завершения задачи. Microsoft продемонстрировала это на примере Moonray: открытого движка рендеринга для Linux, который использовался при создании фильма “Дикий робот”: он работал внутри исполняемого файла Windows, и ничто не указывало на участие Linux.

Moonray - это движок рендеринга на базе Linux, который может запускаться внутри Windows через WSL Container
Moonray - это движок рендеринга на базе Linux, который может запускаться внутри Windows через WSL Container
Запуск Moonray в контейнере WSL
Запуск Moonray в контейнере WSL
Результат рендеринга
Результат рендеринга

Каждое Windows-приложение, использующее API, получает собственную виртуальную машину на основе Hyper-V, изолированную от контейнеров других приложений. Интерфейс командной строки также работает в своей виртуальной машине. Docker Desktop, напротив, запускает все контейнеры внутри одной общей ВМ, что, как и следовало ожидать, более эффективно.

WSL Containers жертвует частью ресурсной эффективности ради строгой изоляции между приложениями, чем и объясняется позиционирование Microsoft как решения, готового для корпоративного использования.

Тем не менее, оба варианта взаимодействуют с одним и тем же сервисом WSL, который уже управляет обычными дистрибутивами, а внутри Linux-виртуальной машины за работу контейнеров отвечает Moby: тот же открытый движок, что лежит в основе Docker. WSL Containers не изобретает контейнеры заново, а предоставляет Windows нативный интерфейс для работы с ними.

Как установить WSL Container на Windows 11

Пока WSL Container доступен только в предварительном канале WSL, поэтому для появления wslc на вашем ПК потребуется его включить.

  • Откройте Windows Terminal или PowerShell от имени администратора.

  • Выполните wsl –update –pre-release и дождитесь завершения загрузки.

Обновление Windows Subsystem for Linux
Обновление Windows Subsystem for Linux
  • Перезапустите WSL командой wsl –shutdown, затем закройте и снова откройте терминал.

    shutdown WSL
    shutdown WSL

  • Проверьте установку командой wslc –version. Вы должны увидеть номер версии 2.9.3.0, что подтверждает успешную установку WSL Container.

WSLC version 2.9.3.0 установлена
WSLC version 2.9.3.0 установлена
  • Выполните wslc –help, чтобы увидеть полный список команд и убедиться, что утилита работает.
wslc команды
wslc команды

На тестовой машине обновление заняло меньше двух минут при нормальном соединении. Если после обновления wslc не распознаётся, перезапустите терминал, а если не поможет — перезагрузите ПК. Поскольку это предварительная версия, могут встречаться шероховатости: несколько разработчиков в официальном блоге Microsoft сообщали о «Catastrophic failure, Error code: E_UNEXPECTED» при первом запуске контейнера. К счастью, мы не столкнулись с этой проблемой.

Если вы задаётесь вопросом, нужен ли для этого ПК с Copilot+, то ответ — нет: WSL Container поставляется как обычный компонент WSL. Однако модель изоляции на базе Hyper-V требует поддержки современной виртуализации, поэтому здесь важнее наличие современного процессора с включённой в BIOS или UEFI виртуализацией, чем для обычного дистрибутива WSL.

Создание и запуск контейнера с помощью wslc

После того как wslc заработал, мы пропустили стандартный пример hello-world и сразу перешли к более приближенному к реальной работе сценарию: собрали собственный образ из Containerfile и запустили в нём сервис.

Создание папки проекта для тестирования контейнера WSL
Создание папки проекта для тестирования контейнера WSL

Для начала быстрая проверка. Мы загрузили и интерактивно запустили контейнер с Debian:

wslc run -it debian:latest

Загрузка Debian
Загрузка Debian
Папка root
Папка root

Внутри контейнера команда uname -a вывела строку, связанную с ядром Linux из WSL2, подтверждая, что мы находимся в настоящем Linux-окружении, а не в прослойке совместимости.

Запуск uname -a внутри контейнера WSL подтверждает, что это настоящее ядро Linux, а не уровень трансляции
Запуск uname -a внутри контейнера WSL подтверждает, что это настоящее ядро Linux, а не уровень трансляции

Отключившись комбинацией Ctrl+P, Ctrl+Q и выполнив wslc ps -a, мы увидели контейнер с автоматически сгенерированным именем (mossy_sawtooth), временем запуска и текущим статусом.

wslc ps -a содержит список всех контейнеров, независимо от того, запущен он или уже остановлен
wslc ps -a содержит список всех контейнеров, независимо от того, запущен он или уже остановлен

Повторное подключение командой wslc attach mossy_sawtooth сразу вернуло нас в тот же сеанс оболочки.

повторное присоединение к имени контейнера mossy_sawtooth
повторное присоединение к имени контейнера mossy_sawtooth

Затем мы написали Containerfile, работающий аналогично Dockerfile, для упаковки небольшой утилиты инспекции Linux-файлов, которая запускает file, exiftool и binutils для любого переданного файла.

Containerfile содержит небольшой инструмент проверки Linux, работающий так же, как и Dockerfile
Containerfile содержит небольшой инструмент проверки Linux, работающий так же, как и Dockerfile

Вот как примерно выглядел этот файл:

FROM python:3.12-slim*
RUN apt-get update && \*

apt-get install -y –no-install-recommends \*
file exiftool binutils bsdmainutils coreutils && \*
rm -rf /var/lib/apt/lists/**

WORKDIR /app*

COPY requirements.txt .*
RUN pip install –no-cache-dir -r requirements.txt*
COPY app.py .*

EXPOSE 5000*

CMD [“python”, “app.py”]*

Сборка выполняется одной командой:

wslc build -t my-linux-inspector .
Создание пользовательского образа с помощью wslc build
Создание пользовательского образа с помощью wslc build

Сборка закешировала базовые слои, поэтому повторная сборка заняла считанные секунды, а не минуты. Команда wslc image ls подтвердила наличие образа с новым временем создания.

wslc-изображение ls подтверждает успешное создание пользовательского образа
wslc-изображение ls подтверждает успешное создание пользовательского образа

После этого мы запустили контейнер с пробросом порта, чтобы к Flask-серверу внутри Linux можно было обращаться из Windows:

wslc run -d -p 5000:5000 –name inspector my-linux-inspector

Открытие 127.0.0.1:5000 в браузере на стороне Windows привело к отображению веб-интерфейса утилиты без дополнительной настройки сети.

Сервер Flask внутри контейнера Linux, доступ к которому осуществляется через localhost в Windows без дополнительной настройки сети
Сервер Flask внутри контейнера Linux, доступ к которому осуществляется через localhost в Windows без дополнительной настройки сети

Сервис на ядре Linux, доступный через localhost в Windows, и всё это без стороннего ПО. Так кратко можно описать WSL Container.

Тестирование доступа к GPU внутри WSL-контейнера

Проброс GPU — это функция, которая больше всего интересует разработчиков в области ИИ и машинного обучения, поскольку от неё зависит, сможет ли Linux-контейнер использовать графическую карту, а не только процессор. WSL Container поддерживает её через флаг --gpus all, синтаксис которого знаком пользователям Docker:

wslc run --rm --gpus all pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime \
 python -c "import torch; print(torch.cuda.is_available())"

WSL Container в корпоративной среде

Microsoft позиционирует WSL Container как решение для предприятий уже на этапе предварительной версии.

Существующий плагин Microsoft Defender для конечных точек теперь понимает события контейнеров, поэтому команды безопасности, отслеживающие WSL-дистрибутивы, получают ту же видимость контейнеров без развёртывания отдельных инструментов. Правда, эта возможность пока ограничена закрытым предварительным тестированием с отдельной регистрацией.

ИТ-администраторы уже сейчас могут управлять WSL Container через групповые политики и шаблоны ADMX, и вот две ключевые возможности для контролируемого парка устройств:

  • Во-первых, администраторы могут решать, разрешено ли сотрудникам использовать дистрибутивы WSL, контейнеры или и то, и другое.

  • Во-вторых (и Microsoft отмечает, что это постоянно просили клиенты), администраторы могут создавать список разрешённых реестров контейнеров, ограничивая загрузку образов внутренним или одобренным реестром, а не оставляя Docker Hub полностью открытым.

Мы ожидаем полноценную поддержку этих настроек в панели Intune в течение нескольких недель после выхода предварительной версии.

Расширение Dev Containers для VS Code также получило поддержку wslc начиная с версии 0.462.0-pre-release. Чтобы переключиться на него, достаточно открыть настройки Dev Container, найти поле Docker Path и изменить его на wslc. Переустанавливать расширения или перенастраивать проекты не потребуется.

Чего пока не хватает в WSL Container

На данный момент WSL Container не имеет аналога Docker Compose, поэтому проекты из нескольких сервисов, поднимающих базу данных, бэкенд и кэш через compose.yaml, пока не поддерживаются. Все протестированные контейнеры приходилось запускать по отдельности.

docker scout
docker scout

Конечно, самым большим упущением является отсутствие графической панели управления или чего-то вроде Docker Scout для сканирования образов. Многочисленная экосистема плагинов Docker Desktop также отсутствует. WSL Container не призван заменить Docker Desktop, Podman Desktop или Rancher Desktop, и все эти инструменты могут выиграть от той же низкоуровневой работы над платформой, включая новую файловую систему virtiofs, которая, по заявлениям Microsoft, вдвое ускоряет доступ к файлам Windows внутри контейнеров.

Также была переработана сетевая подсистема: появился экспериментальный режим Consomme, который передаёт трафик Linux через сетевой стек Windows вместо старой схемы NAT. Это призвано решить проблемы совместимости с VPN и прокси, которые годами раздражали пользователей WSL. Пока и virtiofs, и Consomme доступны только в WSL Container, но Microsoft заявила, что в будущем планирует добавить их и в обычные дистрибутивы WSL.

Стоит ли переходить с Docker Desktop прямо сейчас

Если вам нужен один контейнер с базой данных или небольшим сервисом при локальной разработке, WSL Container уже справляется без требования отдельной лицензии. Но для сценариев с Compose-файлами, несколькими связанными сервисами или экосистемой расширений Docker Desktop пока остаётся более функциональным инструментом.

Docker
Docker

Microsoft планирует выпустить WSL Container в общую доступность осенью 2026 года, и, учитывая, насколько синтаксис CLI уже близок к Docker, большинство недостающих функций, судя по всему, лишь вопрос времени.

Если вы уже используете Linux-контейнеры в Windows, запуск предварительной версии параллельно с Docker Desktop ничего не стоит и даёт WSL Container фору, прежде чем он станет вариантом по умолчанию.