Начало работы с удаленными контейнерами 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, — еще одна причина популярности контейнеров. Это позволяет создавать несколько версий контейнера приложения в разное время. Вместо того чтобы останавливать всю систему для обновления или обслуживания, каждый контейнер (и определенные микрослужбы) можно заменить на лету. Вы можете подготовить новый контейнер со всеми обновлениями, настроить его для рабочей среды и просто указать новый контейнер после его готовности. Можно также архивировать различные версии вашего приложения, используя контейнеры, и при необходимости поддерживать их работу в качестве резервного ресурса.

Дополнительные сведения см. в статье "Общие сведения о контейнерах Docker".

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

Примечание

WSL может запускать дистрибутивы в режиме WSL версии 1 или WSL 2. Чтобы проверить это, откройте PowerShell и введите: wsl -l -v Убедитесь, что для дистрибутива задано использование WSL 2, введя: wsl --set-version <distro> 2. Замените <distro> именем дистрибутива (например, 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):

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

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

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

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

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

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

Совет

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

  • Перечислить команды, доступные в интерфейсе командной строки Docker, можно, выполнив команду docker.
  • Просмотреть сведения о конкретной команде можно, выполнив команду docker <COMMAND> --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.

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

    Примечание

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

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

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

    code .
    

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

    Индикатор удаленного доступа WSL VS Code

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

    Команда

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

    Папка

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

    Определения конфигурации контейнеров разработки VS Code

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

    Папка VS Code .devcontainer

  8. Чтобы убедиться, что проект по-прежнему подключен к WSL и в контейнере, откройте интегрированный терминал VS Code (CTRL+SHIFT+~). Проверьте операционную систему, введя: uname и версию Python с помощью: python3 --version. Вы увидите, что имя uname вернулось как Linux, поэтому вы все еще подключены к подсистеме WSL 2, и номер версии Python будет основан на конфигурации контейнера, которая может отличаться от версии Python, установленной в дистрибутиве WSL.

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

    Конфигурация отладки запуска VS Code

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

    VS Code, выполняющий контейнер Docker

Теперь вы успешно настроили контейнер удаленной разработки с помощью 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 в системе Windows для Linux (WSL2) на Windows 10.

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

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

  • \wsl$\docker-desktop
  • \wsl$\docker-desktop-data

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

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

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

Дополнительные ресурсы