
Eu tenho:
- uma bota de primaveraaplicativo em execuçãono Windowsem 8080e
- aserviçocorrendono contêiner Docker dentro do WSL2Ubuntu, e
estou querendo saber como fazerhabilitar o 8080 do host Windows para este serviço?
Olimitaçãoé que o serviço faz parte da configuração de desenvolvimento e é construído com o docker-compose, portanto a solução deve ser independente de IP ou totalmente (máxima) automatizada.
O aplicativo pode ser acessado com curl $(hostname).local:8080
, mas quando tento adicionar iptables
regras (com base nessasencontrado aqui) para redirecionar"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
onde 172.28.80.1
- é o IP do host do Windows e curl
começa a travar até o tempo limite.
Alguma sugestão?
Responder1
Consegui fazer a conexão de dentro de um contêiner Docker no WSL2 para uma porta aberta na máquina Windows (contêiner php com xdebug no Ubuntu conectando-se ao phpstorm no Windows) da seguinte maneira:
- mapeie o host em docker-compose.yml ou docker-compose.override.yml e reconstrua o contêiner
services:
php:
build:
context: ./
target: debug
extra_hosts:
- "host.docker.internal:host-gateway"
- O ping
host.docker.internal
do contêiner agora deve revelar o IP alocado pelo docker para sua rede ou você pode especificar manualmente o IP da ponte e o(s) intervalo(s) de IP da sub-rede do docker padrão criando um arquivo/etc/docker/daemon.json
com a seguinte estrutura - mais detalhes aqui: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}
]
}
onde
bip
seria o valor que o docker mapeia sobhost.docker.internal
default-address-pools
será usado para alocar endereços IP para contêineres
- então defina uma nova regra iptable como segue
iptables -t nat -A PREROUTING -j DNAT -d 172.30.0.1 -p tcp --dport 9003 --to 172.24.96.1
onde
172.30.0.1
é o destino da solicitação inicial - onde está tentando se conectar172.24.96.1
é o endereço IP atribuído à rede WSL - para onde precisamos encaminhar a solicitação9003
é a porta - a mesma para origem e destino
Mais recursos para inspiração ou problemas que encontrei:
- https://forums.docker.com/t/how-to-reach-localhost-on-host-from-docker-container/113321/15ehttps://docs.docker.com/config/containers/live-restore/ - não aconteceu comigo
- https://askubuntu.com/a/320125/1678663e -https://askubuntu.com/questions/466445/what-is-masquerade-in-the-context-of-iptables- Não usei
MASQUERADE
e a solução descrita funciona bem o suficiente para o que preciso - https://stackoverflow.com/a/72881373/1091730- procurando tentar a terceira solução para remapear manualmente o endereço IP atribuído à instância WSL, alterando
IPAddress
o valor da chaveComputer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
no registro
Agora estou procurando automatizar isso e garantir que não haja problemas ao alterar as conexões de rede ou após despertar do modo de suspensão/hibernação (como acontece de tempos em tempos com outro encaminhamento de porta por ssh - no entanto, isso pode estar relacionado a alguns drivers no meu dispositivo).