
Ich habe:
- ein Spring BootAnwendung ausgeführtunter Windowsauf 8080Und
- AServiceläuftim Docker-Container innerhalb des WSL2Ubuntu und
Ich suche nachden 8080 des Windows-Hosts für diesen Dienst aktivieren?
DerEinschränkungist, dass der Dienst Teil des Entwicklungs-Setups ist und mit Docker-Compose erstellt wird, daher sollte die Lösung IP-unabhängig oder vollständig (maximal) automatisiert sein.
Die Anwendung ist mit erreichbar curl $(hostname).local:8080
, aber wenn ich versuche, iptables
Regeln hinzuzufügen (basierend auf diesenhier zu finden) umleiten„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
wobei 172.28.80.1
- die IP des Windows-Hosts ist, die dann curl
bis zum Timeout hängen bleibt.
Irgendwelche Vorschläge?
Antwort1
Ich habe es geschafft, von einem Docker-Container unter WSL2 aus eine Verbindung zu einem auf der Windows-Maschine geöffneten Port herzustellen (PHP-Container mit Xdebug unter Ubuntu, der eine Verbindung zu PHPstorm unter Windows herstellt), und zwar wie folgt:
- Host in docker-compose.yml oder docker-compose.override.yml zuordnen und Container neu erstellen
services:
php:
build:
context: ./
target: debug
extra_hosts:
- "host.docker.internal:host-gateway"
- Ein Ping
host.docker.internal
vom Container sollte nun die von Docker für sein Netzwerk zugewiesene IP anzeigen. Alternativ können Sie die Bridge-IP und die standardmäßigen Docker-Subnetz-IP-Bereiche manuell angeben, indem Sie eine Datei/etc/docker/daemon.json
mit der folgenden Struktur erstellen – weitere Einzelheiten hier: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}
]
}
Wo
bip
wäre der Wert, unter dem Docker Mapshost.docker.internal
default-address-pools
wird für die Zuweisung von IP-Adressen an Container verwendet
- dann definieren Sie eine neue iptable-Regel wie folgt
iptables -t nat -A PREROUTING -j DNAT -d 172.30.0.1 -p tcp --dport 9003 --to 172.24.96.1
Wo
172.30.0.1
ist das Ziel der ursprünglichen Anfrage - wo versucht wird, eine Verbindung herzustellen172.24.96.1
ist die dem WSL-Netzwerk zugewiesene IP-Adresse, an die wir die Anfrage weiterleiten müssen9003
ist der Port – derselbe für Quelle und Ziel
Weitere Quellen zur Inspiration oder zu Problemen, auf die ich gestoßen bin:
- https://forums.docker.com/t/how-to-reach-localhost-on-host-from-docker-container/113321/15Undhttps://docs.docker.com/config/containers/live-restore/ -- ist bei mir nicht passiert
- https://askubuntu.com/a/320125/1678663Und -https://askubuntu.com/questions/466445/was-ist-masquerade-im-kontext-von-iptables-- Ich habe
MASQUERADE
die beschriebene Lösung nicht verwendet und sie funktioniert für meine Anforderungen nicht gut genug - https://stackoverflow.com/a/72881373/1091730- Ich möchte die dritte Lösung ausprobieren, um die zugewiesene IP-Adresse manuell der WSL-Instanz neu zuzuordnen, indem ich den
IPAddress
SchlüsselwertComputer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
in der Registrierung ändere
Jetzt versuche ich, dies zu automatisieren und sicherzustellen, dass beim Ändern der Netzwerkverbindungen oder nach dem Aufwachen aus dem Ruhezustand/Winterschlaf keine Probleme auftreten (da dies von Zeit zu Zeit bei einer anderen Portweiterleitung über SSH vorkommt – dies könnte jedoch mit einigen Treibern auf meinem Gerät zusammenhängen).