きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Dockerで起動していたAPIにlocalhostで接続できなくなった

※ この話は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を深く理解していなかったから、ハマりました。

もっとネットワーク強くなりたい。

類似情報

参考情報