Начало работы с удаленными контейнерами 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".

Необходимые компоненты

Дополнительные сведения см. в статье о требованиях к системе Docker для установки Docker Desktop в Windows.

Чтобы узнать, как установить Docker на Windows Server, см. статью "Начало работы: подготовка Windows для контейнеров".

Примечание.

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". Параметры ресурса 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 (без флага -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. (Вам нужно расширение "Контейнеры разработки", чтобы фактически использовать контейнер в качестве среды разработки.)

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

  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) введите: Контейнеры разработки: повторно откройте контейнеры , так как мы используем папку, уже открываемую с помощью расширения WSL. Кроме того, используйте контейнеры разработки: открыть папку в контейнере... , чтобы выбрать папку WSL с помощью локальной \\wsl$ общей папки (с стороны Windows). Дополнительные сведения см. в кратком руководстве по Visual Studio Code : откройте существующую папку в контейнере . Если эти команды не отображаются при вводе, убедитесь, что вы установили расширение "Контейнеры разработки", связанное выше.

    Команда

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

    Папка контейнеров разработки VS Code

  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

Если вы использовали ранний технический просмотр 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 или этой записи StackOverflow.

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

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