DockerCompose+nginx+spring-bootで400BadRequest
DockerComposeでnginxとspring-bootを同時に建てて、
nginxをリバプロとして利用しようとしたら、400BadRequestを食らってしまったので備忘も兼ねてメモ。
原因
nginxからspring-bootに流す際にホスト名としてコンテナ名を利用していたため。
DockerComposeでコンテナを起動すると、
{プロジェクト名}_{サービス名}_{連番}
という法則でコンテナ名が付き、
同一DockerComposeで立てられたコンテナ同士はこのコンテナ名をホストとしてお互いに通信できます。
が、このホスト名でSpringBootにSpringBootに対してリクエストを投げると、
以下のエラーが出て400が帰ってしまいます。
java.lang.IllegalArgumentException: The character [_] is never valid in a domain name.
Tomcat8.5以降のバージョンではhost名制限が厳格になっており、_を含むホスト名は400で弾かれてしまうようです。
なお、設定等で対応できないのでどうしても使いたかったらTomcatやSpringBootをダウングレードするしかないとのこと。
参考:
https://stackoverflow.com/questions/53504857/the-character-is-never-valid-in-a-domain-name
対応
DockerComposeで立てられたコンテナ間は、docker-compose.ymlで指定したサービス名でも名前解決できます。
こちらを使えば_なしのホスト名に出来るので問題なく通信ができます。