DevOps

Podman Compose localhost WSL: не отправляет данные

Почему Podman Compose на Windows с WSL не отправляет данные в браузер по localhost или 127.0.0.1 в rootless/rootful режимах? Диагностика, решения: rootful, netsh portproxy, mirrored networking. Пошагово для Podman Desktop 1.24.2.

Почему Podman Compose не отправляет данные в браузер при запуске сервисов на 127.0.0.1 или localhost в rootless и rootful режимах?

Описание проблемы:

  • При доступе к happy.local или localhost браузер показывает: «Соединение с сайтом happy.local было успешно установлено, но он не отправил ничего в ответ».
  • Аналогичная проблема возникает при использовании 0.0.0.0.
  • Локальные домены добавлены в файл hosts, но это не помогает.

Системная информация:

  • ОС: Windows 10 IoT Enterprise LTSC 21H2 (с последними обновлениями);
  • Podman Desktop: 1.24.2;
  • WSL: последняя версия.

Новичок в Podman, средний уровень знаний в Docker. Как решить проблему с Podman Compose на Windows с WSL?

Podman Compose на Windows с WSL часто не отправляет данные в браузер по localhost или 127.0.0.1 из-за сетевой изоляции виртуальной машины Podman machine, где порты привязываются к внутреннему IP WSL2, а не к хосту Windows. В rootless режиме slirp4netns или pasta ограничивает доступ к привилегированным портам и требует дополнительного forwarding, а в rootful — помогает mirrored networking или netsh portproxy. Быстрое решение: проверьте привязку портов командой podman port, добавьте правило netsh interface portproxy add v4tov4 listenport=80 connectport=80 connectaddress=WSL_IP и перезапустите сервисы.

Содержание

Почему Podman Compose молчит на localhost в WSL

Вы запускаете podman-compose up, контейнеры стартуют, но браузер на Windows упорно показывает “соединение установлено, но ничего не отправлено” при обращении к happy.local или localhost:80. Это классика для Podman Desktop 1.24.2 на Windows 10 IoT Enterprise LTSC 21H2 с WSL. Под капотом Podman работает не напрямую, а через Podman machine — виртуальную WSL2-дистрибутиву. Контейнеры живут внутри неё, и порты по умолчанию привязываются к IP этой VM (типа 172.XX.XX.XX), а не к вашему Windows localhost.

Представьте: ваш Nginx или другой сервис в контейнере слушает на 0.0.0.0:80 внутри WSL, но Windows не знает, куда слать трафик по 127.0.0.1. WSL2 использует NAT, и loopback forwarding иногда ломается — особенно после обновлений. Документация Podman по установке прямо говорит: каждый Podman machine — это изолированная WSL-дистрибутива, где сеть требует явного проброса. Добавьте сюда ваш hosts-файл с happy.local — он резолвится в 127.0.0.1, соединение доходит до хоста, но дальше пусто, потому что нет моста в VM.

Rootless и rootful режимы: в чём разница

Rootless Podman — ваш дефолтный режим для безопасности: контейнеры без root, сеть через slirp4netns или pasta (user-mode networking). Плюс: не нужно sudo. Минус: нельзя биндить порты ниже 1024 (типа 80/443) без хаков, и доступ с Windows-хоста ограничен. Обсуждение в GitHub по rootless портам подтверждает: rootless не позволяет биндить <1024, а localhost/127.0.0.1 часто уходит в IPv6-мираж (::1), где ничего не слушает.

Rootful меняет всё: podman machine set --rootful даёт привилегии, контейнеры биндят любые порты, и forwarding работает стабильнее. Руководство по Podman для Windows рекомендует rootful именно для таких сценариев. Переключаетесь одной командой, перезапускаете машину — и сервисы оживают. Но если вы новичок из Docker, помните: Podman compose совместим с docker-compose.yml, но сеть WSL добавляет слой.

Проблемы с localhost, 127.0.0.1 и 0.0.0.0

Почему happy.local в hosts не спасает? Потому что “localhost” на Windows резолвится в 127.0.0.1 (IPv4) или ::1 (IPv6), а Podman в WSL слушает только на VM-IP. curl localhost из Windows может дойти до loopback WSL, но если сервис биндит только IPv4 — привет, пустой ответ. StackOverflow по Podman rootless описывает: localhost работает через IPv6, 127.0.0.1 — нет, из-за mismatch.

0.0.0.0 в docker-compose.yml (ports: “80:80”) значит “слушай на всех интерфейсах контейнера”, но forwarding в Podman machine идёт на WSL-IP. GitHub issue по WSL IP показывает: nginx на -p 8888:80 доступен только по WSL-IP, не по 127.0.0.1 Windows. Для LAN или доменов типа happy.local нужен mirrored networking в .wslconfig.

Как диагностировать проблему

Не гадайте — проверьте шаг за шагом. Откройте PowerShell или CMD как админ.

  1. Узнайте IP Podman machine: wsl -d podman-machine-default ip addr show eth0 (ищите inet 172.x.x.x).
  2. podman ps -a — контейнеры running?
  3. podman port CONTAINER_NAME — показывает 0.0.0.0:80 -> 0.0.0.0:XXXX? Запомните Windows-порт.
  4. В WSL: ss -tuln | grep :80 — слушает ли внутри VM?
  5. С Windows: curl -v http://127.0.0.1:80 и curl -v http://WSL_IP:80.
  6. netstat -ano | findstr :80 на Windows — порт forwarded?

Документация по troubleshooting Podman Desktop упоминает Get-NetTCPConnection ошибки — если loopback сломан, WSL не форвардит. Логи: podman logs CONTAINER.

Пошаговые решения для Podman на Windows

Начните с простого, идите к сложному. Работает на вашей Podman Desktop 1.24.2 и WSL последней.

1. Переключитесь в rootful (5 мин)

podman machine stop
podman machine set --rootful
podman machine start
podman-compose up -d

Теперь порты биндятся свободно. Подтверждение в туториале.

2. Netsh portproxy (для rootless/LAN)

В PowerShell админ:

$WSL_IP = wsl -d podman-machine-default hostname -I | %{$_.split(" ")[0]}
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$WSL_IP
netsh interface portproxy show v4tov4

Удалить: netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0. Medium-статья с примерами.

3. Mirrored networking в .wslconfig

Создайте/отредактируйте C:\Users\%USERNAME%\.wslconfig:

[wsl2]
networkingMode=mirrored

wsl --shutdown, перезапустите Podman machine. Доступ по имени хоста/LAN. GitHub по mirrored.

4. В docker-compose.yml: network=host или pasta

services:
  web:
    network_mode: host

Или при init: podman machine init --user-mode-networking. Для happy.local добавьте в сервис extra_hosts: - "happy.local:host-gateway".

Перезапустите: podman-compose down && podman-compose up.

Частые ошибки и как их избежать

  • Firewall/антивирус: netsh advfirewall firewall add rule name="Podman 80" dir=in action=allow protocol=TCP localport=80.
  • IPv6 mismatch: В compose ports: - "80:80/tcp" явно TCP, или отключите IPv6 в сервисе.
  • Hosts для happy.local: Убедитесь 127.0.0.1 happy.local в C:\Windows\System32\drivers\etc\hosts, flush DNS: ipconfig /flushdns.
  • Версии: Обновите wsl --update, Podman Desktop. GitHub по LAN-доступу — WSL2 не форвардит по имени машины без хаков.
  • Если ничего: podman play kube или Docker Desktop как fallback — но Podman круче для rootless.

Источники

Заключение

Podman Compose с localhost на Windows WSL оживает после rootful + netsh или mirrored networking — 10 минут, и happy.local отвечает. Диагностируйте порты и IP, применяйте forwarding, и забудьте о пустых соединениях. Если Docker казался проще, Podman даст больше контроля без демона — просто настройте сеть разок. Тестируйте на 2025-12-27 версиях, и всё полетит.

Авторы
Проверено модерацией
Модерация
Podman Compose localhost WSL: не отправляет данные