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 хостовой машины?
Решение: Например, набрав в консоли WSL2 cat /etc/resolv.conf
Этот IP меняется при каждой перезагрузки Windows, так что лучше прописать его как, допустим, winhost в /etc/hostsи внутри WSL2 везде использовать его. Например, DB_HOST=winhost
Тогда после перезагрузки Windows вам потребуется поменять ip всего в одном месте.

 

Проблема: Я использую WSL2 и не могу подключиться оттуда к БД расположенной на уровень выше, в Windows. Как починить?
Решение:

  1. Прописываем исключение для WSL2 в windows defender.
    Для этого запускае Windows Powershell от администратора и выполняем в консоли
    New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

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

 

Проблема: Как открыть для PostgreSQL на Windows доступ из 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 виндовому хосту некофликтующий ip (обычно из 192.168.0.0/16)
Некоторые ip из 172.0.0.0/8 конфликтуют с внутренней адресацией docker и он их не выпускает наружу.
Предложенные здесь https://github.com/docker/for-win/issues/9168#issuecomment-771971994 решения зачастую приводят к тому что демон докера вообще перестает запускаться

 

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

  1. Форвардим любой порт WSL2. Например локальный 5433 на 5432 на удаленном сервере.
    ssh -f -N greensight@<server-ip> -L 5433:127.0.0.1:5432

  2. Указаываем в .env выбранный порт
    DB_HOST=127.0.0.1
    DB_PORT=5433

 

Проблема: Не работает chmod (Operation not permitted)

Решение:

  1. Редактируем файл /etc/wsl.conf (либо создаем, если его не существует)

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

    1 2 [automount] options = "metadata"

     

  3. Делаем рестарт WSL (wsl --shutdown), если не помогло перезагружаем Windows