
У меня есть:
- пружинный ботинокприложение работаетна Windowsна 8080и
- ауслугабегв контейнере Docker внутри WSL2Убунту и
Я ищу, каквключить хост-компьютер Windows 8080 для этой службы?
Theограничениезаключается в том, что сервис является частью настройки разработки и создается с помощью docker-compose, поэтому решение должно быть независимым от IP или полностью (максимально) автоматизированным.
Приложение доступно с помощью curl $(hostname).local:8080
, но когда я пытаюсь добавить iptables
правила (на основе этихнайдено здесь) для перенаправления"wsl:8080->winhost:8080":
sudo iptables -A FORWARD -i lo -o eth0 -p tcp --syn --dport 8080 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i lo -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o lo -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i lo -p tcp --dport 8080 -j DNAT --to-destination 172.28.80.1:8080
sudo iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 8080 -d 172.28.80.1 -j SNAT --to-source 127.0.0.1:8080
где 172.28.80.1
- IP хоста Windows, затем curl
начинает зависать до истечения времени ожидания.
Какие-либо предложения?
решение1
Мне удалось установить соединение из контейнера Docker под управлением WSL2 с портом, открытым на машине Windows (контейнер php с xdebug на Ubuntu, подключающийся к phpstorm на Windows) следующим образом:
- сопоставьте хост в docker-compose.yml или docker-compose.override.yml и перестройте контейнер
services:
php:
build:
context: ./
target: debug
extra_hosts:
- "host.docker.internal:host-gateway"
- Теперь пингование
host.docker.internal
из контейнера должно показывать IP-адрес, выделенный Docker для его сети, или вы можете вручную указать IP-адрес моста и диапазон(ы) IP-адресов подсети Docker по умолчанию, создав файл/etc/docker/daemon.json
со следующей структурой — более подробную информацию можно найти здесь:https://serverfault.com/a/942176/1029877
{
"bip": "172.30.0.1/16",
"default-address-pools":[
{"base":"172.32.0.0/16","size":24},
{"base":"172.33.0.0/16","size":24},
{"base":"172.34.0.0/16","size":24}
]
}
где
bip
будет значением, которое Docker сопоставляет сhost.docker.internal
default-address-pools
будет использоваться для выделения IP-адресов контейнерам
- затем определите новое правило iptable следующим образом
iptables -t nat -A PREROUTING -j DNAT -d 172.30.0.1 -p tcp --dport 9003 --to 172.24.96.1
где
172.30.0.1
является местом назначения первоначального запроса - где происходит попытка подключения172.24.96.1
это IP-адрес, назначенный сети WSL, куда нам нужно переслать запрос9003
порт - одинаков для источника и назначения
Дополнительные ресурсы для вдохновения или решения проблем, на которые я наткнулся:
- https://forums.docker.com/t/how-to-reach-localhost-on-host-from-docker-container/113321/15иhttps://docs.docker.com/config/containers/live-restore/ -- со мной этого не произошло
- https://askubuntu.com/a/320125/1678663и -https://askubuntu.com/questions/466445/что-такое-маскарад-в-контексте-iptables-- Я не использовал
MASQUERADE
и описанное решение работает достаточно хорошо для того, что мне нужно - https://stackoverflow.com/a/72881373/1091730- хочу попробовать третье решение, чтобы вручную переназначить назначенный IP-адрес экземпляру WSL, изменив
IPAddress
значение ключаComputer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
в реестре
Теперь я хочу автоматизировать этот процесс и убедиться, что не возникнет никаких проблем при смене сетевых подключений или после выхода из спящего режима/режима гибернации (как это время от времени случается при переадресации другого порта через SSH — однако это может быть связано с некоторыми драйверами на моем устройстве).