
私は持っている:
- スプリングブーツアプリケーション実行中Windowsの場合8080でそして
- 1つのサービスランニング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/iptables のコンテキストにおけるマスカレードとは何か-- 使用しておらず
MASQUERADE
、説明しているソリューションは、必要な機能を十分に果たすものではありません - https://stackoverflow.com/a/72881373/1091730-レジストリの
IPAddress
キー値を変更して、割り当てられた IP アドレスを WSL インスタンスに手動で再マップする 3 番目の解決策を試してみます。Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{{wsl-network-id}}
現在、これを自動化し、ネットワーク接続を変更するときやスリープ/休止状態から復帰した後に問題が発生しないようにしたいと考えています (SSH 経由の別のポート転送で時々発生するため、ただし、これはデバイス上の一部のドライバーに関連している可能性があります)。