Docker と Rails の組み合わせ関連

過去対策済みのエラーに遭遇して「あれなんだっけ」と思ったときの記録

Docker こんてな内部から Host 側の Rails にアクセスする

シーン:Rails server で開発中に、Dockerコンテナ内部のアプリからアクセスしたくなったとき

Docker for mac を利用している場合は host.docker.internal にてアクセスができる

From inside of a Docker container, how do I connect to the localhost of the machine? - Stack Overflow

Railsのバージョンによっては、このままアクセスするとエラーが出る。

[ActionDispatch::HostAuthorization::DefaultResponseApp] Blocked host: host.docker.internal

理由:DNSリバインディングの対策。Guard against DNS rebinding attacks by permitting hosts by gsamokovarov · Pull Request #33145 · rails/rails

解決策:

Development 環境ではデフォルトで以下の設定がされているとのこと。

 Rails.application.config.hosts = [
   IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
   IPAddr.new("::/0"),      # All IPv6 addresses.
   "localhost"              # The localhost reserved domain.
 ]

config/environments/development.rb に以下を追記

config.hosts << "host.docker.internal"

動作確認: Docker コンテナ内部から curl -I http://host.docker.internal:3000

ネットワークモード

Rails サーバーは HostネットワークにBindingする形で起動するので、Docker コンテナ側でも network_mode: "host" (Docker Compose) の設定が必要 する必要があるものかと想定したが、結論は記載不要。

Explore networking features | Docker Documentation

I want to connect from a container to a service on the host
The host has a changing IP address (or none if you have no network access). We recommend that you connect to the special DNS name host.docker.internal which resolves to the internal IP address used by the host. This is for development purpose and does not work in a production environment outside of Docker Desktop.