Skip to main content

WSL2 и Docker. Известные проблемы

Проблема:Docker Engine Starting мертво висит, хотя внутри wsl2 docker доступен.
Решение:У этой проблемы миллион причин и способов устранения.
Начать стоит с того что добавить
%ProgramFiles%\Docker\Docker\resources\com.docker.proxy.exe`
%ProgramFiles%\Docker\Docker\resources\vpnkit.exe`
в исключения Windows Defender

Проблема: Как мне узнать IP WSL2 виртуалки?
Решение: Выполнить в любой виндовой консоли wsl hostname -I
Этот IP меняется при каждой перезагрузки Windows, так что лучше прописать его в как, допустим, wslhost в C:\Windows\System32\drivers\etc\hosts
Тогда после перезагрузки Windows вам потребуется поменять ip всего в одном месте.

Проблема: Как мне узнать для WSL2 IP хостовой машины?
Решение: Например, набрав в консоли WSL2cat /etc/resolv.conf
Этот IP меняется при каждой перезагрузки Windows, так что лучше прописать его как, допустим, winhost в /etc/hostsи внутри WSL2 везде использовать его. Например, DB_HOST=winhost
Тогда после перезагрузки Windows вам потребуется поменять ip всего в одном месте.

Проблема: Как мне из Windows подключиться к PostgreSQL серверу запущенному внутри WSL2 через Ensi Local Ctl?
Решение:
SSH Tunnel: No
Host: localhost
Port: 5432
Username: postgres
Password: example

Разные проекты могут быть запушены на разных портах, смотрите конфиги Ensi Local Ctl

Проблема: Я использую WSL2 и не могу подключиться оттуда к БД расположенной на уровень выше, в Windows. Как починить?
Решение: Рекомендуется использовать БД внутри WSL2, но если очень хочется то:
  1. Прописываем исключение для WSL2 в windows defender. Для этого запускае Windows Powershell от администратора и выполняем в консоли New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

  2. Убедитесь что программа к которой вы пытаетесь подключиться готова принимать соединения из wsl2 (не из localhost). Для используемого в платформе софта могут быть описаны решения в других пунктах данной доки, почитайте.

Проблема: Как открыть для PostgreSQL на Windows доступ из WSL2?
Решение: Рекомендуется использовать БД внутри WSL2, но если очень хочется то:
  1. Находим файл pg_hba.conf. Обычно он лежит где-то в C:\Program Files\PostgreSQL\11\data
  2. Прописываем в него host all all wslhost md5 Это с учётом что вы прописали wslhost в hosts
  3. Перезагружаем PostgreSQL Server. Например win + r -> services.msc -> ищем postgresql -> right click -> restart. Каждый раз после изменения /etc/hosts перезагружать сервер не нужно.
Проблема: Не работает коннект к БД в windows из докер контейнера внутри WSL2 Коннект просто из WSL2 без докера работает нормально.
Решение:

Рекомендуется использовать БД внутри WSL2, но если очень хочется то: ребутаем Винду пока она не выдаст в WSL2 виндовому хосту некофликтующий ip (обычно из 192.168.0.0/16) Некоторые ip из 172.0.0.0/8 конфликтуют с внутренней адресацией docker и он их не выпускает наружу. Предложенные здесь Docker container cannot connect to WSL 2 Distro - no route to host · Issue #9168 · docker/for-win решения зачастую приводят к тому что демон докера вообще перестает запускаться

Проблема: Нужно подключиться из WSL к базе на удаленном сервере. По ssh туда доступ с локалки есть, но порт базы не открыт и сама она не готова ни с кем кроме localhost общаться.
Решение:
  1. Форвардим любой порт WSL2. Например локальный 5433 на 5432 на удаленном сервере.

ssh -f -N greensight@<server-ip> -L 5433:127.0.0.1:5432

  1. Указаываем в .env выбранный порт
DB_HOST=127.0.0.1
DB_PORT=5433
Проблема: Не работает chmod (Operation not permitted)
Решение:
  1. Редактируем файл /etc/wsl.conf (либо создаем, если его не существует)

  2. Добавляем следующие строки:

[automount]
options = "metadata"
  1. Делаем рестарт WSL (wsl --shutdown), если не помогло перезагружаем Windows