※ この話はDocker固有の話ではありません。雑文です。
1週間前まで正常に動いていたのに、急に動かなくなったのでびっくりしました。
環境
- Windows
- 11
結論
localhostがIPv6の::1に変換されていた。
状態
- Dockerでローカル環境を構築していた
- localhostでDocker Containerに対して接続していた
- APIに接続できなくなった
- DBは接続できた
- APIのコンテナにログインして、「localhost」でcurlを実行すると正常に返却される
- ホストのWindowsから「localhost」にアクセスすると、アクセスログすら出てこない
- ホストのWindowsから「127.0.0.1」にアクセスすると正常な応答が返却される
対策
IPv6よりもIPv4の優先度が低いため、IPv4の優先度を上げる。
管理者権限のコマンドプロンプトで実行する必要があります。起動後に次のコマンドを実行してください。詳細は理解していないので、参考記事を見てください。
# 状態確認 netsh interface ipv6 show prefixpolicies # 50 0 ::1/128 ← IPv6の設定 # 40 1 ::/0 ←IPv6の設定 # 35 4 ::ffff:0:0/96 ← IPv4の設定 # 30 2 2002::/16 # 5 5 2001::/32 # 3 13 fc00::/7 # 1 11 fec0::/10 # 1 12 3ffe::/16 # 1 3 ::/96
# IPv4の優先度を上げるコマンド netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 60 4
試していないけど対策できそう
hostsファイルで明示的に記載しておけば、意図的にIPv4だけに変換できるかも。
# hostsファイルのディレクトリ C:\windows\system32\drivers\etc\hosts
…設定したはずだけど、再起動が必要なんだっけ…?よくわかりません。
127.0.0.1 localhost
理由
急に発生した理由は分かりません。
ただ、Windows10からIPv6を優先して解決する設定が入っていたようなので、遅かれ早かれこの挙動は踏んだと思います。
終わりに
5時間くらいこの件にハマってました。ネットワークに強い人ならすぐに解決できるんですかね…。
混乱する原因となったのは、APIは接続できないのに、DBには接続できるという状況になってしまったからでした。ちなみに、なぜDBは接続できたかというとGUIアプリ側がちゃんと対応していたからでした。
しかも、普段はLinuxコマンドをWindowsで使いたいので、ターミナルはGit Bashで実行していたのですが、WSL2で起動するGit BashだとIPv4で解決されるからまた混乱する要因に…。画像は左からコマンドプロンプト、PowerShell、Git Bashです。WSL2を深く理解していなかったから、ハマりました。
もっとネットワーク強くなりたい。