Docker と Rails の組み合わせ関連
Categories:
Docker こんてな内部から Host 側の Rails にアクセスする
シーン:Rails server で開発中に、Dockerコンテナ内部のアプリからアクセスしたくなったとき
Docker for mac を利用している場合は host.docker.internal
にてアクセスができる
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 namehost.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.