WindowsのDocker DesktopでDjangoコンテナを作っていた時のお話しです。
いつのまにか、コンテナとローカルLANの機器が通信できなくなっていました。
コンテナからping 192.168.1.1とか curl http://192.168.1.1/ としても何も出力されないかタイムアウトするという現象でした。ここのネットワークアドレスは192.168.1.0/24で、少し前までは通信できていました。
AIに聞いてみると、「それはそういうものだよ。WSLが止めているんだ。」みたいなことを言うので、別のAIに聞いてみてもほぼ同じ答えでした。
| 実行場所 | 結果 |
|---|---|
Windows → curl http://192.168.1.x | ✅ 通る |
| コンテナ → インターネット | ✅ 通る |
コンテナ → host.docker.internal | ✅ 通る |
コンテナ → 192.168.1.x | ❌ 通らない |
いやいや、そんなはずはない。この前までできてたよ。とAIに言っても解決策が見つからず、コンテナの再作成やリビルドまでやらされて、それでもダメでした。
で、まだコンテナの「ip addr」見てなかった(もっと早く見ろと)ので見てみたのですが、なんとネットワークが29個もあって(驚)、自分ではよくわからず、結果をAIに貼り付けてもみたところ、ようやく原因がわかりました。
17: br-c12cdcb42a71: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether d2:e6:12:89:24:6d brd ff:ff:ff:ff:ff:ff
inet 192.168.0.1/20 brd 192.168.15.255 scope global br-c12cdcb42a71
valid_lft forever preferred_lft forever
原因はこれ↑の「inet 192.168.0.1/20」でした。
この/20 は 192.168.0.0 ~ 192.168.15.255 を丸ごと含みます。
すると、ローカルLANの192.168.1.0/24もこの範囲に含まれているので、内部ネットワークに流れてしまい通信ができないという事でした。
これを解決するには一旦、Docker networkを削除し再作成する必要がありました。が、また同じことが起きないようにするため、まずは、内部ネットワークがローカルLANのアドレス範囲を使わないよう、Docker Desktopの設定を変えます。
Docker Desktopの設定から「Docker Engine」を選び、右側に表示されたJSONを下記のように変更して「Apply & Restart」をクリックします。(赤色の部分が追加したものです。)(あくまで例です)
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"default-address-pools": [
{
"base": "10.200.0.0/16",
"size": 24
},
{
"base": "10.201.0.0/16",
"size": 24
}
],
"experimental": false
}
再起動完了後、下記コマンド2つで古い network を消します。
docker network prune
docker compose up -d
以上でコンテナとローカルLAN機器との通信が復活しました。
この記事が、どなたかのお役に立てれば幸いです。



コメント