
Tengo:
- una bota de primaveraaplicación ejecutándoseen Windowsen 8080y
- aserviciocorreren el contenedor Docker dentro del WSL2ubuntu y
estoy buscando como¿Habilitar el 8080 del host de Windows para este servicio?
Ellimitaciónes que el servicio es parte de la configuración de desarrollo y está construido con docker-compose, por lo que la solución debe ser independiente de IP o estar completamente (al máximo) automatizada.
Se puede acceder a la aplicación con curl $(hostname).local:8080
, pero cuando intento agregar iptables
reglas (basadas en esasencontrado aquí) para redirigir"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
donde 172.28.80.1
- es la IP del host de Windows y luego curl
comienza a bloquearse hasta que se agota el tiempo de espera.
¿Alguna sugerencia?
Respuesta1
Logré establecer una conexión desde el interior de un contenedor Docker en WSL2 a un puerto abierto en la máquina con Windows (contenedor php con xdebug en ubuntu conectándose a phpstorm en Windows) de la siguiente manera:
- asigne el host en docker-compose.yml o docker-compose.override.yml y reconstruya el contenedor
services:
php:
build:
context: ./
target: debug
extra_hosts:
- "host.docker.internal:host-gateway"
- Hacer ping
host.docker.internal
desde el contenedor ahora debería revelar la IP asignada por Docker para su red o puede especificar manualmente la IP del puente y los rangos de IP de la subred predeterminada de Docker creando un archivo/etc/docker/daemon.json
con la siguiente estructura; más detalles aquí: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}
]
}
dónde
bip
sería el valor que Docker asigna bajohost.docker.internal
default-address-pools
se utilizará para asignar direcciones IP a contenedores
- luego defina una nueva regla iptable de la siguiente manera
iptables -t nat -A PREROUTING -j DNAT -d 172.30.0.1 -p tcp --dport 9003 --to 172.24.96.1
dónde
172.30.0.1
es el destino de la solicitud inicial, donde se intenta conectar172.24.96.1
es la dirección IP asignada a la red WSL, donde debemos reenviar la solicitud9003
es el puerto - el mismo tanto para el origen como para el destino
Más recursos de inspiración o problemas con los que me he topado:
- https://forums.docker.com/t/how-to-reach-localhost-on-host-from-docker-container/113321/15yhttps://docs.docker.com/config/containers/live-restore/ -- no me pasó a mí
- https://askubuntu.com/a/320125/1678663y -https://askubuntu.com/questions/466445/what-is-masquerade-in-the-context-of-iptables-- No he usado
MASQUERADE
y la solución descrita funciona lo suficientemente bien para lo que necesito - https://stackoverflow.com/a/72881373/1091730- Estoy buscando probar la tercera solución para reasignar manualmente la dirección IP asignada a la instancia WSL cambiando
IPAddress
el valor de la claveComputer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
en el registro.
Ahora estoy buscando automatizar esto y asegurarme de que no tenga ningún problema al cambiar las conexiones de red o después de despertar de la suspensión/hibernación (como sucede de vez en cuando con otro reenvío de puerto a través de ssh; sin embargo, esto podría estar relacionado con algunos controladores en mi dispositivo).