我有:
- Spring Boot应用程序运行在 Windows 上在 8080和
- A服务跑步在 WSL2 中的 Docker 容器中Ubuntu,以及
我想知道怎样将Windows主机的8080启用到此服务吗?
这局限性该服务是开发设置的一部分,并使用 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
- 是 Windows 主机 IP,然后curl
开始挂起直至超时。
有什么建议么?
答案1
我已设法从 WSL2 下的 Docker 容器内部连接到 Windows 机器上打开的端口(ubuntu 上带有 xdebug 的 php 容器连接到 Windows 上的 phpstorm),如下所示:
- 在 docker-compose.yml 或 docker-compose.override.yml 中映射主机并重建容器
services:
php:
build:
context: ./
target: debug
extra_hosts:
- "host.docker.internal:host-gateway"
- 从容器执行 ping 操作
host.docker.internal
现在应该会显示 Docker 为其网络分配的 ip,或者您可以通过创建具有/etc/docker/daemon.json
以下结构的文件来手动指定桥接 ip 和默认 docker 子网 IP 范围 - 更多详细信息请见此处: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
是分配给 WSL 网络的 IP 地址 - 我们需要将请求转发到该地址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/what-is-masquerade-in-the-context-of-iptables-- 我还没有使用过
MASQUERADE
,也没有描述过解决方案是否能满足我的需要 - https://stackoverflow.com/a/72881373/1091730- 希望尝试第三种解决方案,通过更改注册表中
IPAddress
的键值,手动将分配的 ipaddress 重新映射到 WSL 实例Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
现在,我希望实现这一自动化,并确保在更改网络连接或从睡眠/休眠状态唤醒后不会出现任何问题(因为它有时会通过 ssh 进行另一个端口转发 - 但这可能与我的设备上的某些驱动程序有关)。