◆ WSL はネットにつながるのに Docker コンテナ内からはつながらない
◆ IP アドレスではアクセスできるので DNS 解決できてないみたい
◆ Docker に割り当てられる IP アドレス範囲を変えてみたら解決できた

ネットにつながらない

Docker コンテナ内に必要なコマンドが入っていなかったのでインストールしようとしたらエラーになります
ネットにつながってないみたいです

原因を調べようにも Docker コンテナ用だと ps や curl や ping みたいな基本なコマンドも最初から入ってないイメージもあるんですよね
調べるツールを入れようにもネットにつながってないという詰み状態

Docker 全体の問題なのかもわかりませんが 仕方なく別のコンテナを起動して試してみました
すると同じくネットに繋がりません
こっちでは調べるのに必要なコマンドが最初からあるので 調べてみると IP で指定ではアクセスできました
ドメインだとダメのようです
このタイプの問題だと DNS サーバを 8.8.8.8 にすれば解決できることが多いですが できればデフォルトのままにしておきたいです

そもそも WSL 自体が繋がらないのかと思って確認してみると ここは問題ありませんでした
WSL 内の Docker コンテナ内でのみ起きています
以前 WSL ではないところですが 似たような問題が Docker デーモンの再起動で直ったことがあったので再起動してみましたが変わりません

対処

そういえば 以前どこかでこれと似た問題が起きるみたいなことを書いた記事を見た覚えがあります
たしか WSL と Docker のネットワークが競合するようなことを書いていた気がします

「ip a」 コマンドでみてみるとたしかに重複しています
docker0 は 172.17.0.1/16 で WSL のネットワークはこの範囲の中にありました

docker に割り当てられる IP アドレスの範囲を変えてみます
調べたら 「/etc/docker/daemon.json」 の default-address-pools を指定すると良いらしいです

user@wsl-debian:~$ cat /etc/docker/daemon.json
{
"default-address-pools": [
{
"base": "172.30.0.0/16",
"size": 24
}
]
}

172.30.x.x にしてみました
これで Docker のデーモンを再起動して適当にコンテナを作ってみます
無事新しく指定した範囲内に割り当てられていました

WSL 側から 「ip a」 コマンドでみた結果も変わっています

user@wsl-debian:~$ ip a
(略)
11: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:b7:df:e8:db brd ff:ff:ff:ff:ff:ff
inet 172.30.0.1/24 brd 172.30.0.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:b7ff:fedf:e8db/64 scope link
valid_lft forever preferred_lft forever

ちなみに変更前はこれでした

user@wsl-debian:~$ ip a
(略)
6: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:59:ed:00:ac brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:59ff:feed:ac/64 scope link
valid_lft forever preferred_lft forever

肝心の DNS 解決ですが これも問題なくドメインでアクセスできるようになってました

WSL に割り当てられる IP アドレス範囲は環境によって変わるみたいなので この問題が起きる環境もあれば起きない環境もあるようです