Docker под Windows на WSL2

3 июн. 2021 г.

Всем привет! Сегодня хотел бы поделиться опытом использования Docker под Windows.

Возникла необходимость запустить на Windows 10 один из своих PHP проектов. Последнее время работаю в основном под Linux, большинство проектов запускаю в Docker окружении. Docker изначально создавался для Linux и работает под ним заведомо корректно.

До этого я пытался использовать Docker под Windows/Mac, но всякий раз возникали какие-то проблемы. В итоге все сводилось к установке Linux на виртуальную машину Virtualbox, и установке Docker на виртуалке.

Ситуация изменилась к лучшему, когда в Windows 10 появилась WSL. WSL создает Linux окружение в Windows 10. При этом это не совсем виртуалка, WSL интегрирована в хост систему. А WSL2 совместима с Docker для Windows.

Обновления Windows

Для корректной работы рекомендуется установить все последние обновления Windows. Мне не удалось настроить Docker + WSL на необновленной системе. Как миниум, необходимо, чтобы в системе была установлена именно WSL2.

Настройка WSL и установка Docker

Включил WSL и установил Docker по этому руководству. Последовательность действий:

1 . Запустить powershell

2 . Включить WSL

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

3 . Включить Virtual Machine

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

4 . Перезагрузить компьютер

5 . Установить обновление WSL

6 . Включить по-умолчанию 2 версии WSL

wsl --set-default-version 2

7 . Установить Ubuntu 20.04 из Microsoft Store. При установке задать имя пользователя(прим: antonshell) и пароль.

8 . Установить Docker для Windows, включить поддержку WSL2

9 . Запустить тестовый Docker образ

docker run -it --rm -p 8000:80 --name my-sample mcr.microsoft.com/dotnet/samples:aspnetapp

10 . Проверить, что все работает: http://localhost:8000/

Запуск WSL

Linux дистрибутив открывется с ярлыка, пользователь автоматически залогинен, находится в домашней директории. Можно использовать стандартные linux утилиты, например htop, mc и т.д.

Запуск тестововго PHP проекта

В качестве тестового проекта использовал placeholder-service - сервис для генерации заглушек изображений.

1 . Нужно зайти в консоль Ubuntu и создать папку с проектами.

mkdir -p /home/antonshell/Projects
cd /home/antonshell/Projects

2 . Затем установить проект

git clone https://github.com/antonshell/placeholder-service.git
cd placeholder-service
docker-compose up -d
docker-compose exec php-fpm composer install

3 . И проверить работоспособность: http://127.0.0.1:16880, http://127.0.0.1:16880/img

Производительность Docker, Файловые системы

Важно, чтобы проект находился именно в файловой системе Linux. Иначе web приложение работает на порядок медленнее.

К примеру, если проект запускается из /home/antonshell/Projects/placeholder-service, то загрузка занимает 80мс. А если из C:\Projects\placeholder-service, то целых 1180мс.

Файловая система Windows автоматически монтируется в Ubuntu в директорию /mnt/c/. Для доступа к файловой системе Ubuntu из Windows необходимо открыть проводник, ввести в адресной строке \\wsl$ и выбрать нужную директорию. Затем ее можно добавить в избранное или подключить как сетевой диск.

XDebug

К сожалению, настроить XDebug под WSL пока не получилось. Делал по этому руководству: https://blog.denisbondar.com/post/phpstorm_docker_xdebug. Под Linux работает корректно.

Итоги

Docker под Windows 10 работает вполне неплохо благодаря WSL2. Конечно, переходить с Linux на Windows нет никакого желания. Однако включить в проект разработчика, работающего под Windows становится гораздо проще.

Тестовый проект доступен на github. На этом пока все. Спасибо за внимание!

Теги: Windows, Docker, WSL