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
- Rootless и rootful режимы: в чём разница
- Проблемы с localhost, 127.0.0.1 и 0.0.0.0
- Как диагностировать проблему
- Пошаговые решения для Podman на Windows
- Частые ошибки и как их избежать
Почему 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 как админ.
- Узнайте IP Podman machine:
wsl -d podman-machine-default ip addr show eth0(ищите inet 172.x.x.x). podman ps -a— контейнеры running?podman port CONTAINER_NAME— показывает 0.0.0.0:80 -> 0.0.0.0:XXXX? Запомните Windows-порт.- В WSL:
ss -tuln | grep :80— слушает ли внутри VM? - С Windows:
curl -v http://127.0.0.1:80иcurl -v http://WSL_IP:80. 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 Installation
- Podman for Windows tutorial
- Troubleshooting Podman on Windows
- GitHub Issue: WSL2 podman services can’t be seen on localhost
- GitHub Issue: Support accessing Podman services from Windows LAN
- GitHub Issue: Ports <1024 unreachable
- StackOverflow: localhost vs 127.0.0.1 in rootless Podman
- Medium: Podman Windows WSL accessible from LAN
Заключение
Podman Compose с localhost на Windows WSL оживает после rootful + netsh или mirrored networking — 10 минут, и happy.local отвечает. Диагностируйте порты и IP, применяйте forwarding, и забудьте о пустых соединениях. Если Docker казался проще, Podman даст больше контроля без демона — просто настройте сеть разок. Тестируйте на 2025-12-27 версиях, и всё полетит.