Поделиться через


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

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

Docker Desktop для Windows предоставляет среду разработки для создания, доставки и запуска контейнеризированных приложений. Включив подсистему 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 (без флага -a, показывающего все, будут отображаться только работающие контейнеры).
  • Список системных сведений об установке Docker, включая статистику и ресурсы (ЦП и память), доступные вам в контексте WSL 2, с: docker info

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

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

  • Установите расширение WSL VS Code. Это расширение позволяет открывать ваш проект Linux, работающий посредством Windows Subsystem for 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) введите: Контейнеры разработки: повторно откройте контейнеры, так как мы используем папку, уже открываемую с помощью расширения WSL. Кроме того, используйте Dev Containers: Open Folder in Container..., чтобы выбрать папку 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 см. в документации по устранению неполадок .

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