
我有:
- 彈簧靴應用程式運行在 Windows 上在8080上和
- A服務跑步在 WSL2 內的 Docker 容器中烏班圖和
我正在尋找如何啟用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
的鍵值來手動將分配的 IP 位址重新映射到 WSL 實例Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
現在我正在尋求自動化此操作,並確保在更改網路連接時或從睡眠/休眠狀態喚醒後不會出現任何問題(因為透過 ssh 進行另一個連接埠轉發時不時會發生這種情況——但這可能與我的設備上的一些驅動程式)。