Docker from windows to linux

Docker Desktop WSL 2 backend

Estimated reading time: 8 minutes

Windows Subsystem for Linux (WSL) 2 introduces a significant architectural change as it is a full Linux kernel built by Microsoft, allowing Linux distributions to run without having to manage Virtual Machines. With Docker Desktop running on WSL 2, users can leverage Linux workspaces and avoid having to maintain both Linux and Windows build scripts. In addition, WSL 2 provides improvements to file system sharing, boot time, and allows access to some cool new features for Docker Desktop users.

Docker Desktop uses the dynamic memory allocation feature in WSL 2 to greatly improve the resource consumption. This means, Docker Desktop only uses the required amount of CPU and memory resources it needs, while enabling CPU and memory-intensive tasks such as building a container to run much faster.

Additionally, with WSL 2, the time required to start a Docker daemon after a cold start is significantly faster. It takes less than 10 seconds to start the Docker daemon when compared to almost a minute in the previous version of Docker Desktop.


Before you install the Docker Desktop WSL 2 backend, you must complete the following steps:

  1. Install Windows 10, version 1903 or higher or Windows 11.
  2. Enable WSL 2 feature on Windows. For detailed instructions, refer to the Microsoft documentation.
  3. Download and install the Linux kernel update package.



Ensure you have completed the steps described in the Prerequisites section before installing the Docker Desktop release.

  1. Follow the usual installation instructions to install Docker Desktop. If you are running a supported system, Docker Desktop prompts you to enable WSL 2 during installation. Read the information displayed on the screen and enable WSL 2 to continue.
  2. Start Docker Desktop from the Windows Start menu.

From the Docker menu, select Settings > General.

Select the Use WSL 2 based engine check box.

If you have installed Docker Desktop on a system that supports WSL 2, this option will be enabled by default.

  • Click Apply & Restart.
  • That’s it! Now docker commands will work from Windows using the new WSL 2 engine.

    Enabling Docker support in WSL 2 distros

    WSL 2 adds support for “Linux distros” to Windows, where each distro behaves like a VM except they all run on top of a single shared Linux kernel.

    Docker Desktop does not require any particular Linux distros to be installed. The docker CLI and UI all work fine from Windows without any additional Linux distros. However for the best developer experience, we recommend installing at least one additional distro and enabling Docker support by:

    Ensure the distribution runs in WSL 2 mode. WSL can run distributions in both v1 or v2 mode.

    To check the WSL mode, run:

    To upgrade your existing Linux distro to v2, run:

    wsl.exe —set-version (distro name) 2

    To set v2 as the default version for future installations, run:

    wsl.exe —set-default-version 2

    When Docker Desktop starts, go to Settings > Resources > WSL Integration.

    The Docker-WSL integration will be enabled on your default WSL distribution. To change your default WSL distro, run wsl —set-default .

    For example, to set Ubuntu as your default WSL distro, run wsl —set-default ubuntu .

    Optionally, select any additional distributions you would like to enable the Docker-WSL integration on.

    The Docker-WSL integration components running in your distro depend on glibc. This can cause issues when running musl-based distros such as Alpine Linux. Alpine users can use the alpine-pkg-glibc package to deploy glibc alongside musl to run the integration.

    Click Apply & Restart.

    Docker Desktop installs 2 special-purpose internal Linux distros docker-desktop and docker-desktop-data . The first ( docker-desktop ) is used to run the Docker engine ( dockerd ) while the second ( docker-desktop-data ) stores containers and images. Neither can be used for general development.

    Best practices

    To get the best out of the file system performance when bind-mounting files, we recommend storing source code and other data that is bind-mounted into Linux containers (i.e., with docker run -v : ) in the Linux file system, rather than the Windows file system. You can also refer to the recommendation from Microsoft.

    • Linux containers only receive file change events (“inotify events”) if the original files are stored in the Linux filesystem. For example, some web development workflows rely on inotify events for automatic reloading when files have changed.
    • Performance is much higher when files are bind-mounted from the Linux filesystem, rather than remoted from the Windows host. Therefore avoid docker run -v /mnt/c/users:/users (where /mnt/c is mounted from Windows).
    • Instead, from a Linux shell use a command like docker run -v

    is expanded by the Linux shell to $HOME .

  • If you have concerns about the size of the docker-desktop-data VHDX, or need to change it, take a look at the WSL tooling built into Windows.
  • If you have concerns about CPU or memory usage, you can configure limits on the memory, CPU, Swap size allocated to the WSL 2 utility VM.
  • To avoid any potential conflicts with using WSL 2 on Docker Desktop, you must uninstall any previous versions of Docker Engine and CLI installed directly through Linux distributions before installing Docker Desktop.
  • Develop with Docker and WSL 2

    The following section describes how to start developing your applications using Docker and WSL 2. We recommend that you have your code in your default Linux distribution for the best development experience using Docker and WSL 2. After you have enabled WSL 2 on Docker Desktop, you can start working with your code inside the Linux distro and ideally with your IDE still in Windows. This workflow can be pretty straightforward if you are using VSCode.

      Open VSCode and install the Remote — WSL extension. This extension allows you to work with a remote server in the Linux distro and your IDE client still on Windows.

    Now, you can start working in VSCode remotely. To do this, open your terminal and type:

    This opens a new VSCode connected remotely to your default Linux distro which you can check in the bottom corner of the screen.

    Alternatively, you can type the name of your default Linux distro in your Start menu, open it, and then run code .

  • When you are in VSCode, you can use the terminal in VSCode to pull your code and start working natively from your Windows machine.
  • GPU support

    Starting with Docker Desktop 3.1.0, Docker Desktop supports WSL 2 GPU Paravirtualization (GPU-PV) on NVIDIA GPUs. To enable WSL 2 GPU Paravirtualization, you need:

    • A machine with an NVIDIA GPU
    • The latest Windows Insider version from the Dev Preview ring
    • Beta drivers from NVIDIA supporting WSL 2 GPU Paravirtualization
    • Update WSL 2 Linux kernel to the latest version using wsl —update from an elevated command prompt
    • Make sure the WSL 2 backend is enabled in Docker Desktop

    To validate that everything works as expected, run the following command to run a short benchmark on your GPU:


    Your feedback is very important to us. Please let us know your feedback by creating an issue in the Docker Desktop for Windows GitHub repository and adding the WSL 2 label.


    Разработка с Docker на Windows Subsystem for Linux (WSL)

    Для полноценной работы с проектом на docker’е в WSL необходима установка WSL 2. На момент написания заметки ее использование возможно только в рамках участия в программе предварительной оценки Windows (WSL 2 доступна в сборках 18932 и выше). Так же отдельно стоит упомянуть, что необходима версия Windows 10 Pro для установки и настройки Docker Desktop.

    Важно! В WSL 2 пропала острая необходимость в Docker Desktop для Windows 10. Как обходиться без него описано в пункте Про Docker в Ubuntu.

    Первые шаги

    После вступления в программу предварительной оценки и установки обновлений необходимо установить дистрибутив Linux (в данном примере используется Ubuntu 18.04) и Docker Desktop с WSL 2 Tech Preview:

    В обоих пунктах следуем всем инструкциям по установке и настройке.

    Установка дистрибутива Ubuntu 18.04

    Перед запуском Ubuntu 18.04 необходимо включить Windows WSL и Windows Virtual Machine Platform посредством выполнения двух команд в PowerShell:

    1. Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux (потребует перезагрузку компьютера)
    2. Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

    После необходимо удостовериться, что мы будем использовать WSL v2. Для этого в терминале WSL или PowerShell последовательно выполняем команды:

    • wsl -l -v — смотрим, какая версия установлена в данный момент. Если 1, то движемся далее по списку
    • wsl —set-version ubuntu 18.04 2 — для обновления до версии 2
    • wsl -s ubuntu 18.04 — устанавливаем Ubuntu 18.04 в качестве дистрибутива по-умолчанию

    Теперь можно запустить Ubuntu 18.04, провести настройку (указать имя пользователя и пароль).

    Установка Docker Desktop

    Важно! В WSL 2 пропала острая необходимость в Docker Desktop для Windows 10. Как обходиться без него описано в пункте Про Docker в Ubuntu.

    В процессе установки следуем указаниям. Компьютер потребует перезапуск после установки и при первом запуске для включения Hyper-V (из-за поддержки которого и требуется версия Windows 10 Pro).

    Важно! Если Docker Desktop сообщит о блокировке со стороны firewall’а, идем в настройки антивируса и вносим следующие изменения в правила сетевого экрана (в данном примере в качестве антивируса используется Kaspersky Total Security):

    • Проходим в Настройки -> Защита -> Сетевой экран -> Настроить пакетные правила -> Local Service (TCP) -> Изменить
    • Из списка локальных портов удаляем порт 445
    • Сохранить

    После запуска Docker Desktop в его контекстном меню выбираем пункт WSL 2 Tech Preview.

    В открывшемся окне нажимаем кнопку Start.

    Теперь docker и docker-compose доступны внутри дистрибутива WSL.

    Важно! В обновленном Docker Desktop теперь вкладка с WSL внутри окна настроек. Там включается поддержка WSL.

    Важно! Помимо галочки активации WSL также необходимо в вкладке Resources->WSL Integration активировать Ваш WSL дистрибутив.


    Неожиданностью стали те многие проблемы, которые возникли при попытке поднять контейнеры проектов, расположенных в директории пользователя Windows.

    Ошибки различного рода, связанные с запуском bash-скриптов (которые как правило стартуют при сборке контейнеров для установки необходимых библиотек и дистрибутивов) и прочих, обычных для разработки на Linux, вещей, заставили задуматься о размещении проектов непосредственно в директории пользователя Ubuntu 18.04.

    Из решения предыдущей проблемы вытекает следующая: как работать с файлами проекта через IDE, установленную на Windows. В качестве «best practice» я нашел для себя только один вариант — работа посредством VSCode (хотя являюсь поклонником PhpStorm).

    После скачивания и установки VSCode обязательно устанавливаем в расширение Remote Development extension pack.

    После установки выше упомянутого расширения достаточно просто выполнить команду code . в директории проекта при запущенной VSCode.

    В данном примере для обращения к контейнерам через браузер необходим nginx. Установить его через sudo apt-get install nginx оказалось не так просто. Для начала потребовалось обновить дистрибутив WSL посредством выполнения sudo apt update && sudo apt dist-upgrade , и только после этого запустить установку nginx.

    Важно! Все локальные домены прописываются не в файле /etc/hosts дистрибутива Linux (его там даже нет), а в файле hosts (обычно расположенном C:\Windows\System32\drivers\etc\hosts) Windows 10.

    Про Docker в Ubuntu

    Как подсказали знающие пользователи в комментариях к заметке, docker внутри дистрибутива WSL 2 абсолютно работоспособен. Это позволяет не устанавливать Docker Desktop на Windows 10 и решает проблему с наличием версии Windows 10 Pro (необходимость в Pro возникает именно в связи с использованием Docker Desktop). Устанавливается согласно инструкциям с родного сайта:

    Если при выполнении команды docker начнет ругаться на демона, проверьте статус сервиса — в моем случае как и nginx он не запускается автоматически. Запустите его командой sudo service docker start .

    Если в момент сборки вывалится ошибка «Service failed to build: cgroups: cannot find cgroup mount destination: unknown» попробуйте следующее решение (не мое, найдено мною, ссылка в источниках): sudo mkdir /sys/fs/cgroup/systemd ; sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd .

    Работа с проектом через PhpStorm

    Чтобы обеспечить возможность работы с проектом в WSL через PhpStorm, необходимо сделать следующее:

    • Запускаем командную строку Windows 10 от имени администратора;
    • В командной строке Windows 10 выполняем команду mklink /D C:\project_directory \\wsl$\Ubuntu\home\user\project_directory , которая создаст символьную ссылку на папку проекта.

    После этого в IDE можно открыть проект по пути C:\project_directory

    P.S. Дмитрий Симагин, спасибо за решение.


    Более подробное описание каждого шага можно найти тут:


    Начало работы с удаленными контейнерами Docker в WSL 2

    Это пошаговое руководство поможет вам приступить к разработке с удаленными контейнерами, настроив Docker Desktop для Windows с помощью WSL 2 (подсистема Windows для Linux версии 2).

    Docker Desktop для Windows предоставляет среду разработки для создания, доставки и запуска dockerized приложений. Включив подсистему на основе WSL 2, вы можете запускать контейнеры Linux и Windows в Docker Desktop на одном компьютере. (Docker Desktop является бесплатным для личного использования и малого бизнеса, для получения сведений о ценах на Pro, Team или Business, см. в часто задаваемых вопросы о сайте Docker).

    Мы рекомендуем использовать Docker Desktop из-за интеграции с Windows и подсистема Windows для Linux. Однако в то время как Docker Desktop поддерживает работу как linux, так и контейнеров Windows, одновременно работать нельзя . Для одновременного запуска контейнеров Linux и Windows необходимо установить и запустить отдельный экземпляр Docker в WSL. Если вам нужно запустить одновременные контейнеры или просто предпочесть установить модуль контейнеров непосредственно в дистрибутиве Linux, следуйте инструкциям по установке Linux для этой службы контейнеров, например install Docker Engine on Ubuntu или Install Podman для запуска контейнеров Linux.

    Общие сведения о контейнерах Docker

    Docker — это средство для создания, развертывания и запуска приложений с использованием контейнеров. Контейнеры позволяют разработчикам упаковывать приложения с использованием всех необходимых компонентов (библиотек, платформ, зависимостей и т. п.) и поставлять все это как один пакет. Использование контейнера дает возможность приложению работать одинаково, независимо от настроенных параметров или ранее установленных библиотек на компьютере, где оно запускается, так как он может отличаться от компьютера, который использовался для написания и тестирования кода приложения. Это позволяет разработчикам сосредоточиться на написании кода, не беспокоясь о том, в какой системе он будет выполняться.

    Контейнеры Docker похожи на виртуальные машины, но не создают всю виртуальную операционную систему. Вместо этого контейнер Docker позволяет приложению использовать то же ядро Linux, что и система, в которой оно работает. Таким образом пакету приложения требуются только те части, которых еще нет на главном компьютере. В результате размер пакета уменьшается, а производительность увеличивается.

    Постоянная доступность, которую обеспечивает использование контейнеров Docker с такими инструментами, как Kubernetes, — еще одна причина популярности контейнеров. Это позволяет создавать несколько версий контейнера приложения в разное время. Вместо того чтобы останавливать всю систему для обновления или обслуживания, каждый контейнер (и определенные микрослужбы) можно заменить на лету. Вы можете подготовить новый контейнер со всеми обновлениями, настроить его для рабочей среды и просто указать новый контейнер после его готовности. Можно также архивировать различные версии вашего приложения, используя контейнеры, и при необходимости поддерживать их работу в качестве резервного ресурса.

    Предварительные требования

    • Убедитесь, что компьютер работает Windows 10, обновлен до версии 2004, сборки 18362 или более поздней.
    • Установите WSL и настройте имя пользователя и пароль для дистрибутива Linux, работающего в WSL 2.
    • Установите Visual Studio Code(необязательно). Это обеспечит оптимальное взаимодействие, включая возможность написания кода и отладки в удаленном контейнере Docker и подключении к дистрибутиву Linux.
    • Установите Терминал Windows(необязательно). Это обеспечит оптимальный интерфейс, включая возможность настройки и открытия нескольких терминалов в одном интерфейсе (включая Ubuntu, Debian, PowerShell, Azure CLI или любой другой вариант использования).
    • Зарегистрируйтесь для получения идентификатора Docker по адресу Docker Hub(необязательно).
    • Сведения об обновлениях условий использования см. в лицензионном соглашении Docker Desktop .

    WSL может запускать дистрибутивы в режиме WSL версии 1 или WSL 2. Чтобы проверить это, откройте PowerShell и введите: wsl -l -v Убедитесь, что для дистрибутива задано использование WSL 2, введя: wsl —set-version 2 . Замените именем дистрибутива (например, Ubuntu 18.04).

    В WSL версии 1 из-за фундаментальных различий между Windows и Linux подсистема Docker не могла работать непосредственно в WSL, поэтому команда Docker разработала альтернативное решение с помощью виртуальных машин Hyper-V и LinuxKit. Однако, так как WSL 2 теперь работает в ядре Linux с полной емкостью вызова системы, Docker может полностью работать в WSL 2. Это означает, что контейнеры Linux могут работать изначально без эмуляции, что приводит к повышению производительности и взаимодействию между средствами Windows и Linux.

    Установка Docker Desktop

    С помощью серверной части WSL 2, поддерживаемой в Docker Desktop для Windows, вы можете работать в среде разработки на основе Linux и создавать контейнеры под управлением Linux, используя Visual Studio Code для редактирования и отладки кода, а также запуска контейнера в браузере Microsoft Edge в Windows.

    Чтобы установить Docker (после установки WSL):

    Скачайте Docker Desktop и следуйте инструкциям по установке.

    После установки запустите Docker Desktop из меню «Пуск» Windows, а затем выберите значок Docker в меню скрытых значков панели задач. Щелкните правой кнопкой мыши значок, чтобы отобразить меню команд Docker и выберите пункт «Параметры».

    Убедитесь, что флажок «Использовать подсистему на основе WSL 2» установлен в разделе «Общие параметры>».

    Выберите из установленных дистрибутивов WSL 2, для которых необходимо включить интеграцию Docker, перейдя к разделу «Настройка>ресурсов>WSL Integration«.

    Чтобы убедиться, что Docker установлен, откройте дистрибутив WSL (например, Ubuntu) и отобразите версию и номер сборки, введя следующую команду: docker —version

    Проверьте правильность работы установки, запустив простой встроенный образ Docker с помощью: docker run hello-world

    Ниже приведены несколько полезных команд Docker, которые необходимо знать:

    • Перечислить команды, доступные в интерфейсе командной строки Docker, можно, выполнив команду docker .
    • Просмотреть сведения о конкретной команде можно, выполнив команду docker —help .
    • Перечислить образы Docker на вашем компьютере (сейчас только образ Hello-World) можно, используя следующие команды docker image ls —all .
    • Вывод списка контейнеров на компьютере с помощью: docker container ls —all или docker ps -a (без флага -a show all, будут отображаться только запущенные контейнеры).
    • Вывод списка системных сведений об установке Docker, включая статистику и ресурсы (память ЦП & ), доступные в контексте WSL 2, с помощью следующих средств: docker info

    Разработка в удаленных контейнерах с помощью VS Code

    Чтобы приступить к разработке приложений с помощью Docker с WSL 2, рекомендуется использовать VS Code вместе с расширениями WSL, Dev Containers и Docker.

    Установите расширение WSL VS Code. Это расширение позволяет открыть проект Linux, работающий в WSL в VS Code (не нужно беспокоиться о проблемах с путем, совместимости двоичных файлов или других проблемах, связанных с несколькими ОС).

    Установите расширение «Контейнеры разработки для VS Code». Это расширение позволяет открывать папку проекта или репозиторий в контейнере, используя полный набор функций Visual Studio Code для выполнения разработки в контейнере.

    Установите расширение Docker VS Code. Это расширение добавляет функциональные возможности для создания, управления и развертывания контейнерных приложений из VS Code. (Вам потребуется расширение «Контейнеры разработки», чтобы фактически использовать контейнер в качестве среды разработки.)

    Давайте создадим контейнер разработки для существующего проекта приложения с помощью Docker.

    В этом примере мы будем использовать исходный код из моего руководства по Hello World для Django в среде разработки Python, настроенной документацией. Этот шаг можно пропустить, если вы предпочитаете использовать собственный исходный код проекта. Чтобы скачать веб-приложение HelloWorld-Django из GitHub, откройте терминал WSL (например, Ubuntu) и введите: git clone

    Всегда храните код в той же файловой системе, в которую вы используете средства. Это приведет к повышению производительности доступа к файлам. В этом примере мы используем дистрибутив Linux (Ubuntu) и хотим хранить файлы проекта в файловой системе \\wsl\ WSL. Хранение файлов проекта в файловой системе Windows значительно замедлит работу при использовании средств Linux в WSL для доступа к этим файлам.

    В окне терминала WSL перейдите в папку исходного кода для этого проекта:

    Откройте проект в VS Code, запущенном на локальном сервере расширений WSL, введя следующее:

    Убедитесь, что вы подключены к дистрибутиву WSL Linux, проверив зеленый удаленный индикатор в левом нижнем углу экземпляра VS Code.

    В команде VS Code поддонте (CTRL+SHIFT+P) введите: «Контейнеры разработки: открыть папку в контейнере. Если эта команда не отображается по мере ввода, убедитесь, что вы установили расширение «Контейнеры разработки», связанное выше.

    Выберите папку проекта, которую вы хотите контейнеризировать. В моем случае, это \\wsl\Ubuntu-20.04\home\mattwojo\repos\helloworld-django\

    Появится список определений контейнеров, так как в папке проекта (репозитории) еще нет конфигурации контейнера разработки. Список отображаемых определений конфигурации контейнера фильтруется по типу проекта. Для проекта Django я выберу Python 3.

    Откроется новый экземпляр VS Code, начнется создание нового образа, и после завершения сборки запустится наш контейнер. Вы увидите, что новая .devcontainer папка появилась с информацией о конфигурации контейнера в Dockerfile файле и devcontainer.json файле.

    Чтобы убедиться, что проект по-прежнему подключен к WSL и в контейнере, откройте интегрированный терминал VS Code (CTRL+SHIFT+

    ). Проверьте операционную систему, введя: uname и версию Python с помощью: python3 —version . Вы увидите, что имя uname вернулось как Linux, поэтому вы все еще подключены к подсистеме WSL 2, и номер версии Python будет основан на конфигурации контейнера, которая может отличаться от версии Python, установленной в дистрибутиве WSL.

    Чтобы запустить и отладить приложение внутри контейнера с помощью Visual Studio Code, сначала откройте меню «Выполнить» (CTRL+SHIFT+D или выберите вкладку в левой строке меню). Затем выберите «Запуск и отладка «, чтобы выбрать конфигурацию отладки и выбрать конфигурацию, которая лучше всего подходит для проекта (в моем примере это будет «Django»). При этом будет создан launch.json файл в папке .vscode проекта с инструкциями по запуску приложения.

    В VS Code выберите «Запустить>отладку» (или просто нажмите клавишу F5 ). Откроется терминал в VS Code, и вы увидите примерно такой результат: «Запуск сервера разработки при выходе с сервера control-C». Удерживайте клавишу CONTROL и выберите адрес, отображаемый для открытия приложения в веб-браузере по умолчанию, и просмотрите проект, выполняемый внутри контейнера.

    Теперь вы успешно настроили контейнер удаленной разработки с помощью Docker Desktop на базе серверной части WSL 2, которую можно кодировать, выполнять, выполнять, развертывать или отлаживать с помощью VS Code!

    Устранение неполадок

    Нерекомендуемый контекст Docker WSL

    Если вы использовали ранний выпуск Tech Preview Docker для WSL, возможно, у вас есть контекст Docker с именем wsl, который теперь не рекомендуется и больше не используется. Вы можете проверить с помощью команды: docker context ls . Вы можете удалить этот контекст wsl, чтобы избежать ошибок с помощью команды: docker context rm wsl так как вы хотите использовать контекст по умолчанию для Windows и WSL2.

    Возможные ошибки, которые могут возникнуть при использовании этого устаревшего контекста wsl: docker wsl open //./pipe/docker_wsl: The system cannot find the file specified. error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_wsl/v1.40/images/json?all=1: open //./pipe/docker_wsl: The system cannot find the file specified.

    Проблемы с поиском папки хранилища образов Docker

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

    Эти папки можно найти, открыв дистрибутив WSL Linux и введя: explorer.exe . чтобы просмотреть папку в Windows проводник. Введите: \\wsl\ \mnt\wsl замена именем дистрибутива (т. е. Ubuntu-20.04) для просмотра этих папок.

    Дополнительные сведения о поиске расположений хранилища Docker в WSL см. в этой проблеме из репозитория WSL или этой записи StackOverlow.

    Дополнительные сведения об общих проблемах устранения неполадок в WSL см. в документации по устранению неполадок .


    Читайте также:  Wordpress get all pages with template
    Поделиться с друзьями