Docker で動かしている Nginx でリバースプロキシの設定を行い、別の Docker コンテナに転送するように設定したときにちょっとはまったのでメモです。
コンテナ同士はコンテナ名を使ってアクセスできるので、Nginx の設定では以下のようにリバースプロキシの設定を行っています。
location /some_path {
proxy_pass http://container-name.docker-network:port;
}
このとき、Nginx は 起動時に upstream の名前解決を行っているので、上記の URL の名前解決ができない場合(つまり転送先のコンテナが起動していない)と host not found in upstream
というエラーが表示されて起動に失敗します。
私の場合、仕様によって起動するコンテナの数が異なったり、開発中は一部のコンテナだけ起動して確認したりするので、その都度 Nginx の設定を変えるのは面倒です。
なので、名前解決できなくても Nginx が起動できるように回避策がないかと調べた所、以下の記事に書いてありました。
resolver
のディレクティブを使って名前解決してやることで回避できるそうです。
location /some_path {
resolver 127.0.0.1 valid=30s;
# resolver 8.8.8.8 valid=30s; # or some other DNS
# resolver 127.0.0.11 valid=30s; # or Docker's DNS server
set $dummy_var http://container-name.docker-network:port;
proxy_pass $dummy_var;
}
私の場合、Nginx を Docker で動かしているので、127.0.0.11
をリゾルバに指定することで、転送先のコンテナが起動していなくても Nginx が起動できるようになりました。