Docker Desktop でローカルネットワークと通信ができない原因と default-address-pools による解決策

Docker

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機器との通信が復活しました。
この記事が、どなたかのお役に立てれば幸いです。

コメント

タイトルとURLをコピーしました