WSL2上のサーバーに外部からアクセスする

更新日から1年以上経過しています。情報が古い可能性がございます。

諸事情でWindows10 Homeを使う機会があるのですが、Homeだと困ったことにDocker for Windowsが使えません。
これの解決策として、私はWindows Insider Programに登録し、Insider Previewを入れ、WSL2上でdockerを動かして開発環境を整えることにしました。しかし、ここで困ったことが。WSL2上に建てたnginxコンテナに、localhostからはアクセスができるものの、LAN内の他の端末からアクセスができません。それを解決します。

実施した環境は、この記事投稿時点のもので以下の通りです。

  • エディション : Windows 10 Home
  • バージョン : 2004
  • OSビルド : 19041.1

また、Docker Desktop for WSL2というものもあるのですが、この記事ではWSL2内のubuntuにLinux版のdockerを導入しています。
https://www.docker.com/blog/5-things-docker-desktop-wsl2-tech-preview/

とりあえずnginxを建ててみる

nginxを立ち上げてどうなるか確認してみます。
以下のコマンドでサクッと立ち上げてみます。

$ sudo docker run -ti --rm -p 80:80 nginx

立ち上げたらホストのWindows側からアクセスしてみます。
http://localhost

nginx

アクセスできていますね。
では続いて、IP指定でアクセスしています。
ここはそれぞれの環境に合わせてアクセスしてください。
こんなやつです。
http://192.168.1.x

error

今度は失敗してしまいました。

なぜ失敗するのか

WSL2ではホストマシンの属するネットワークからは独立したネットワークが構築され、その中に所属しています。
localhostでアクセスできるようになっているので開発用にはそこまで困らないかもしれませんが、ネットワークを介したシステムの開発には使いにくいです。

対策

ではどうするか。
こちらに書いてありました。
https://github.com/microsoft/WSL/issues/4150
要は、ホストマシンの指定したポートへのアクセスをWSL2にポートフォワーディングしてしまおうというものです。
以下のコマンドでポートフォワーディングが設定できます。
xの部分は各自のネットワークの値を指定してください。

netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.x.xx.xxx

これを実行するとIP指定でアクセスできるようになります。
また、外部からのアクセスもWSL2側に行くので、ほかの端末からも無事にnginxにアクセスできるようになりました。

以前はWindowsはプログラミングに向かない、と言われていたものですが、ここ数年でどんどん開発環境が良くなっています。僕も持ち歩いているのはMacBookProですが、Windowsでも問題なく開発できるなぁと感じています。
もっともっとWindowsの開発環境が整うと良いですね!

再起動したら

再起動したら、以前のportproxyの設定が残っているので、きちんと消してください。
上記のコマンドで設定したなら以下のコマンドで削除できます。削除しないと同じポートを再度設定できません。

netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です