Windows 10 linux subsystem docker

Docker Desktop WSL 2 backend

Estimated reading time: 7 minutes

Windows Subsystem for Linux (WSL) 2 introduces a significant architectural change as it is a full Linux kernel built by Microsoft, allowing Linux containers to run natively without emulation. 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.

Prerequisites

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

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

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.
  • Download

    Install

    Ensure you have completed the steps described in the Prerequisites section before installing the Docker Desktop Stable 2.3.0.2 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.

    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 restarts, 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.
  • 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:

    Feedback

    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 Linux (WSL)

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

    Прежде чем начать, убедитесь, что ваша система имеет примерно следующую конфигурацию:

    • Windows 10 Version 1803 Build 1734 и выше
    • Ubuntu for WSL 16.0.4 LTS или что-то в этом роде (ваша версия может немного отличаться)

    Важно, чтобы версия и сборка Windows были не ниже того, что здесь указано. Дело в том, что, начиная с этих цифр, в ядро Windows ​​WSL были внесены принципиальные изменения, которые позволяют использовать cgroups (control groups — в 2008 году добавлены в ядро Linux). А они необходимы Docker’у для управления ресурсами вашей системы в контейнерах.

    Установка Docker-CE 17.09.0

    Мы будем устанавливать Docker Community Edition 17.09.0 (потому что на момент написания этой статьи более свежие версии падали при установке на WSL).

    Первое, что мы сделаем — избавимся от всех предыдущих установок Docker (если таковые были). Для этого запустим bash-терминал и напишем следующее:

    Теперь установим репозиторий для Docker CE. Через apt-get мы можем установить нужную версию, самостоятельно не занимаясь её сборкой из исходников. Следуя рекомендациям на официальном сайте Docker, мы пишем следующие команды:

    Если вы когда либо добавляли новый репозиторий с помощью apt, всё это вам в целом знакомо. Если нет — надеюсь, вы всё равно остались со мной 🙂

    Далее устанавливаем Docker:

    Если вы не используете WSL в стиле Ubuntu, список доступных версий можно посмотреть так:

    … или использовать аналогичную команду какой-то другой библиотеки, если вы отказались от APT

    В конце нужно добавить своего текущего пользователя в группу ‘docker’, чтобы получить возможность правильно использовать Docker Engine («движок»), который должен быть запущен в вашей системе с правами root.

    Запуск Docker на Windows

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

    Чтобы немного упростить процесс, создайте в /usr /local/sbin/ новый файл — скрипт, который содержит соответствующие команды для запуска сервиса Docker:

    со следующим содержимым:

    Первая команда sudo — это монтирование cgroups (оно выполнится при перезагрузке), а вторая отдает сервис docker в руки systemd (это подсистема Ubuntu для инициализации и управления службами).

    Теперь разрешите скрипту запуститься и выполните его:

    Однако сервис Docker не запустится по двум причинам:

    1. Сценарий выполняет вызовы как суперпользователь, поэтому сам скрипт должен быть запущен с правами суперпользователя, чтобы работать как задумано. По идее, сделать это так же просто, как написать любую команду sudo, но для этого пользователь должен после каждой загрузки вводить свои данные, что сильно раздражает.
    2. Первая команда для монтирования cgroups должна быть выполнена в bash с повышенными привилегиями. Чтобы запустить её без ввода данных пользователем, нам придётся использовать Windows Task Scheduler.

    Всё ясно? Тогда за дело…

    Запуск скрипта с правами root без пользовательского ввода

    В ОС семейства Linux файл /etc /sudoers определяет, кто и что может запускать с правами суперпользователя. Давайте модифицируем его так, чтобы ваш пользователь смог вызывать скрипт без необходимости постоянного ввода пароля root. (Но будьте очень осторожны с этим файлом! Очень легко выпилить себя из системы, если вы не знаете, что делаете!)

    Добавим в конец файла новую строку. При этом вы должны точно знать имя своего пользователя (запустите echo $USER, если не уверены):

    Теперь мы можем запустить сервис Docker с правами root без пользовательского ввода:

    Правильный запуск Docker при загрузке Windows

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

    Запустите Планировщик задач Windows и выберите Task Scheduler Library на левой панели. Затем выберите Create Task (создать задачу) на правой панели.

    Далее вам предложат отредактировать основные настройки задачи. Дайте вашей задаче понятное название и убедитесь, что остальные настройки соответствуют моим. Важно, чтобы вы выбрали «Запуск с повышенными привилегиями» (Run with highest privileges).

    Во вкладке Triggers добавьте новый триггер, который будет запускать задачу сразу же, как только локальный пользователь выполнит вход.

    Переключившись на вкладку Actions, создайте новое действие, которое будет запускать bash и сразу же выполнять наш скрипт с ключом -с:

    Обратите внимание, что это нужно делать с повышенными привилегиями, поэтому проверьте галочку Run with highest privileges на вкладке General.

    Остальные параметры в основном зависят от индивидуальных предпочтений, но я покажу свои настройки. Если хотите — можете их скопировать. Некоторые параметры питания могут не отображаться, если вы сидите на стационарной машине. Лично я пользуюсь ноутбуком.

    Ну вот, всё идёт так, как мы задумали. Если вы на предыдущих этапах еще не запускали Docker, используя команды с повышенными привилегиями, просто щёлкните правой кнопкой мыши по задаче, созданной нами в Планировщике задач, и выберите «Выполнить»! Вот и всё!

    Проверьте, что всё работает

    Если хотите перестраховаться — перезагрузите свою машину (да, ради этого вам придётся в кое веки закрыть вкладки вашего браузера), запустите bash и введите:

    Если всё пройдёт хорошо, то вы увидите стандартное приветствие Docker’а. Сервис запустится автоматически и прямо в WSL! Мои поздравления!

    Закругляемся

    Вы только что установили и запустили Docker в WSL. Это означает, что ваши контейнеры теперь могут совместно использовать ​​Ubuntu, уже работающую в вашей системе. Таким образом отпадает необходимость разворачивать новую (виртуализированную) ОС, как это делает обычный Docker для Windows.

    Производительность работы Docker в WSL пока [на момент написания оригинальной статьи] оставляет желать лучшего, но по мере развития платформы и выпуска обновлений Windows она будет только улучшаться.

    Источник

    Еще один способ установки и использования Docker в Windows 10

    В этой статье мы подготовим окружение для запуска контейнеров в Windows 10 и создадим простое контейнеризированное .NET приложение

    Чтобы все описанные ниже действия были успешно выполнены, потребуется 64-разрядная система с версией не меньше 2004 и сборкой не меньше 18362. Проверим версию и номер сборки, выполнив в PowerShell команду winver

    Если версия ниже требуемой, то необходимо произвести обновление и только после этого идти дальше

    Установка WSL 2

    Сначала включим компонент Windows Subsystem for Linux (WSL). Для этого запустим PowerShell с правами администратора и выполним первую команду

    Выполним следующую команду

    Чтобы завершить установку, перезагрузим компьютер shutdown -r -t 1

    Выберем WSL 2 по умолчанию для новых дистрибутивов Linux wsl —set-default-version 2

    Для целей этой статьи это необязательно, но установим дистрибутив Linux через Microsoft Store, например, Ubuntu 20.04 LTS

    При первом запуске установленного дистрибутива введем имя пользователя и пароль

    Чтобы увидеть запущенные дистрибутивы Linux, выполним в PowerShell команду wsl —list —verbose

    Чтобы завершить работу дистрибутива Linux, выполним команду wsl —terminate Ubuntu-20.04

    Файловая система запущенного дистрибутива Linux будет смонтирована по этому пути \\wsl$

    Установка Docker

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

    После установки запустим приложение Docker Desktop и установим интеграцию Docker с дистрибутивом Linux (WSL 2)

    Теперь отправлять команды Docker можно как через PowerShell, так и через Bash. Выполним команду docker version

    Запуск контейнеров

    Чтобы убедиться, что Docker правильно установлен и работает должным образом, запустим простой контейнер busybox, который всего лишь выведет в консоль переданное сообщение и завершит свое выполнение

    Хорошо. Давайте сделаем что-то более интересное. Например, запустим контейнер rabbitmq

    Разберем выполненную команду:

    docker run — запускает контейнер из образа. Если данный образ отсутствует локально, то предварительно он будет загружен из репозитория Docker Hub

    —name rabbit1 — присваивает запускаемому контейнеру имя rabbit1

    -p 8080:15672 — пробрасывает порт с хоста в контейнер. 8080 — порт на хосте, 15672 — порт в контейнере

    rabbitmq:3.8.9-management — имя образа и его тег/версия, разделенные двоеточием

    Теперь мы можем извне контейнера взаимодействовать с сервером RabbitMQ через порт 5672 и получить доступ к управлению из браузера через порт 8080

    Посмотреть статус контейнеров, в том числе остановленных, можно с помощью команд docker container ls —all или docker ps -a

    Чтобы остановить наш контейнер: docker stop rabbit1 . Запустить вновь: docker start rabbit1

    Отладка .NET приложения запущенного в контейнере

    Для нашего примера нам понадобится отдельная сеть, т.к. мы запустим целых два контейнера, которые будут взаимодействовать между собой. На самом деле все запускаемые контейнеры по умолчанию попадают в уже существующую сеть с именем bridge, но т.к. в своей сети мы без лишних проблем сможешь обращаться из одного контейнера к другому прямо по имени, создадим сеть с названием mynet типа bridge

    Далее запустим redis и подключим его к ранее созданной сети. Благодаря параметру -d процесс в контейнере будет запущен в фоновом режиме

    Далее с помощью Visual Studio 2019 создадим новый проект ASP.NET Core Web API, который будет использован для демонстрации отладки

    Добавим для взаимодействия с Redis пакет StackExchange.Redis через Package Manager Console

    Мы не будем акцентироваться на правильности и красоте дизайна, а быстро создадим рабочий пример

    Добавим в проект файл RandomWeatherService.cs, где будет находится служба для выдачи не очень точного прогноза

    Добавим файл RedisRepository.cs, где будет находится служба кеширования сформированных прогнозов

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

    И наконец, изменим созданный автоматически единственный контроллер WeatherForecastController следующим образом

    Помимо прочего в проект автоматически был добавлен файл Dockerfile с инструкциями для Docker. Оставим его без изменений

    В результате получим следующую структуру проекта

    Если по какой-то невероятной причине Вам понадобятся исходники, то они здесь

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

    После того как контейнер будет запущен, также подключим его к сети mynet

    После убедимся, что все необходимые контейнеры находятся в одной сети

    Далее установим Breakpoint в единственном методе контроллера и пошлем запрос через Postman, или через любой браузер

    Кстати, используемый порт в Вашем случае может отличаться и его можно посмотреть в окне Containers

    Результат в окне Postman

    Дополнительно убедимся, что значение зафиксировано в redis, подключившись с помощью консоли redis-cli

    Источник

    Читайте также:  Клавиатурные тренажеры для mac os
    Оцените статью