null

Windows + WSL2 + Docker. Жизнь после Linux

Часто в своей работы мы пользуемся Linux, как рабочим локальным окружением. Это довольно привычная среда для нашей команды, а значит средства разработки, утилиты, терминалы и конечно же Docker - это то, без чего работа не ладится :)

 

Однако, оказавшись пользователем Windows (не от хорошей жизни) после нескольких лет работы с Linux, перестаешь понимать людей, которые организуют все свои рабочие процессы "мышкокликаньем". По каждой мелочи надо отрывать руки от клавиатуры и путем "тыцканья" в бесконечные визарды и кнопочки делать совершенно утилитарные вещи, которые раньше сводились к алгоритму "открыл терминал" -> "выполнил команду" -> "все работает".  Хотя такой алгоритм недоступен пользователям Windows в некоторых задачах (но попытки есть), но в этой статье мы попробуем настроить наше окружение таким образом, чтобы:

1. Нам были доступны привычные команды для работы в терминале Linux

2. Настроим окружение, используемое чаще всего в наших проектах (работа с БД в docker)

3. Организуем возможность открыть терминал, чтобы не тянуться к мышке smiley

 

1. Linux как подсистема Windows (WSL)

 

Для начала нам нужно настроить подсистему WSL версии 2, которая доступна только на Windows 10 (достаточно Home версии) для 64-разрядных систем версии 1903 и больше со сборкой 18362 или больше. Все дальшейшие инструкции в первом разделе необходимо выполнять в оболочке PowerShell, запущенной от имени администратора.

1.1. Включаем подсистему WSL

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

1.2. Перезагружаем компьтер

1.3. Включаем компонент виртуальных машин

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

1.4. Перезагружаемся снова

1.5. Далее надо скачать и установить пакет обновлений от Microsoft (для 64-разрядных систем или для ARM64)

1.6. Угадайте, что надо сделать дальше? Да! Перезагрузиться не будет лишним (это же Windows)

1.7. Устанавливаем версию по умолчанию для WSL 

wsl --set-default-version 2

1.8. Итак, победа близка. Мы почти достигли первой цели - использовать привычные команды в привычном терминале. Остается посетить магазин, как бы странно это не звучало... На самом деле идем в Microsoft Store и ставим там приложение Ubuntu 20.04 (Вы можете выбрать любой интересующий Вас дистрибутив - они имеют место быть в магазине). После установки запустите приложение и... взгляду будет представлен знакомый диалог создания пользователя в linux (возможно придется подождать некоторое время, пока будут проведены все настройки при первом запуске терминала). Введите имя пользователя и пароль и... готово. На экране появится что-то вроде этого:

 

 

Сейчас, чтобы запустить в CMD ubuntu (звучит прекрасно), нужно просто ввести команду 

ubuntu2004

Какжется пункт 1 готов. Можно пользоваться. Если потребуется доступ к дискам C:\ или D:\ или каким то еще, то в оболочке linux они доступны в /mnt/c или /mnt/d соответственно.

 

2. Настроим окружение для работы в БД

 

2.1. Без лирических отступлений - мы любим и используем docker в любой непонятной ситуации. Изучать Kubernets и прочие штучки не было желания и возможности. Очень хотелось для настройки БД очередного проекта сделать привычный набор шагов "открыть терминал" -> "выполнить команду" -> "окружение готово к использованию". Так и было сделано для docker'а. Идем в CMD, набираем ubuntu2004 и далее привычным образом:

$> sudo apt update
$> sudo apt install apt-transport-https ca-certificates curl software-properties-common
$> curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
$> sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release) -cs) stable"
$> sudo apt update
$> sudo apt install docker-ce
$> sudo service docker start

2.2. Докер готов и сервис запущен. Ставим postgres с нужными настройками командой:

docker run -d --name new_project_container_name -p5432:5432 \
    -e POSTGRES_USER=new_project_user \
    -e POSTGRES_PASSWORD=new_project_user_password \
    -e POSTGRES_DB=new_project_db_name postgres

 

Отлично! 
Теперь, если попробовать достучаться из Windows к PostgresQL на 0.0.0.0:5432 то ничего не выйдет. Тут придется сделать небольшие медицинские процедури при помощи костылей (мы ведь все еще на Windows и иначе тут просто не выйдет). Первая мысль в сложившейся ситуации: "порт из винды в линух не проброшен. сделаю это через ssh -L". Но спешу успокоить Ваш пыл - так не выйдет. Серфинг интернетов дает подсказку, за которую огромное спасибо сообществу (ссылки на источники приведу в конце статьи).

 2.3. Создадим новый файлик в Windows и назовем его как угодно (я назвал ports.ps1). Его содержимое:

$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]

#All the ports you want to forward separated by coma
$ports=@(5432,8090);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

 

Тут мы пробрасываем порты 5432 и 8090 с хостовой системы в linux. Чтобы это добро отработало и жить стало легче надо открыть PowerShell от администратора, разрешить выполнение скриптов и запустить наш только что созданный файлик:

Set-ExecutionPolicy RemoteSigned

# тут надо выбрать A (yes, for all)
# далее оно нам что-то ответит
# после этого пускаем наш ports.ps1

.\ports.ps1

Теперь можно насладиться прохладными напитками достучаться с хостового Windows до Postgresql, который живет в докере, который живет в linux, который живет в WSL...

 

3. Немного о терминалах и хоткеях в Windows

 

В принципе все основное мы сделали. Windows готова для того, чтоб на ней жить после linux, и даже настроен докер и поднята БД для работы с ней. Можно начинать реализовывать проект. Но все равно, как то нет "доманшей атмосферы и пингвиньего уюта". В этом разделе поделюсь что еще помогло Windows стать на чуточку ближе к привычному рабочему окружению. 

Это трминал для Windows. Его можно поставить в магазине по ссылке.

Чем он удобен? Нет пляски с кодировками (что бывает в CMD), легко настраивается (правкой json файла), выглядит приятнее, а спустя время даже не провоцирует кровопускание из глаз :) Терминал работает со всеми оболочками: CMD, PowerShell, Ubuntu. В настройках можно указать, чтобы при старте приложения вкладкой по умолчанию была оболочка ubuntu - это будет прям как в советском союзе linux.

Что еще хотелось добавить? Хочется открывать терминал "горячими клавишами", не страдая мышкокликаньем. К сожалению тут не все так здорово настраивается, но варинты есть.

1. Можно расположить Terminal на панели приложений (закрепить на панели) первым и тогда его можно запускать сочетаним клавиш Win+1. Удобно, но не "ubuntu classic Ctrl+Shift+T"

2. Второй вариант - это создать ярлык на приложение и в свойствах ярлыка указать "Shortcut key" задав там наше привычное сочетание. Этот вариант веселее, хотя придется иметь ярлык.

 

Итог

Сегодня после старта системы есть возможность "открыть терминал"->"выполнить команду" -> "наслаждаться результатом своего труда" и все это без вызывающего раздражения "мышкокликанья". Привычные команды и инструменты доступны. Хотя не стья не раскрывает новых горизонтов, но надеюсь будет хоришим собирательным материалом из статей приведенных в ссылках ниже. 

Всем успешных проектов, под какой системой бы Вы не работали!

 

Ссылки, которые могут быть полезны

Документация по инсталляции WSL от microsoft

Добрый люди, рассказавшие про port forwarding

Терминал Windows

Оболочка Ubuntu 20.04 для Windows

Способы запуска приложений через "горячие клавиши" в Windows

Документация по инсталляции Docker в Ubuntu

Картинка с матрешкой :)

Вперед