WSL2を使っているWindowsでは、 localhost の特定ポートへのアクセスがよしなにWSL2へ転送されます。例えば、WSL2上のUbuntuで 80番ポートをLISTENしているWebサーバに、Windows上のブラウザから localhost:80 でアクセスすることができます。それとは逆に、Windowsで動いているWebサーバにはWSL上のUbuntuからlocalhost:80 ではアクセスできません。WindowsのIPアドレスを特定して直接アクセスする必要があります。

WSL2上から見えるホストのWindowsのIPアドレスは不定です。これを取得するために、以前からip コマンドを用いた方法がありましたが、mDNSを使うと幾許か簡単に、そして動的にIPアドレスを取得できます。

参考

aem - Access a localhost running in Windows from inside WSL2? - Stack Overflow

tldr

mDNSが使える環境であればWindowsのホスト名に .local を付けたホスト名にアクセスすることで名前解決が可能。

${hostname}.local

// Windowsのホスト名がMelaの場合
Mela.local

// 一般的にWSL2上のLinuxも同じホスト名を持っているので `hostname` コマンドも使える
$ echo `hostname`.local
Mela.local

$ nslookup `hostname`.local
nslookup Mela.local
Server:         172.25.176.1
Address:        172.25.176.1#53

使用例

Windows側に簡単なWebサーバを立て、Linuxからアクセスを試す。

Windows側でサーバーを立てる

> hostname
Mela
> python -m http.server 8000
Serving HTTP on :: port 8000 (http://[::]:8000/) ...

初回時にファイアウォールの警告が出るので、パブリックネットワークでも通信を許可する。

Linux側からアクセスする

まずは localhost でアクセスできないことを確認する。

$ curl localhost:8000
curl: (7) Failed to connect to localhost port 8000: Connection refused

ホスト名を Mela.local に変更するとアクセスできる。

> curl Mela.local:8000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Directory listing for /</title>
// ...以下略

Dockerコンテナ内からアクセスする

同一のローカルネットワーク内であれば名前解決が可能なので、当たり前だがDockerコンテナ内からもアクセスすることができる。

$ sudo docker run -it ubuntu:latest bash
root@18401e4b3383:/# curl Mela.local:8000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>

以上です。