Nginxを備えた2つのdockerコンテナーがあります。 container1はcontainer2にリンクされています。 Dockerは次に、エントリを/ etc/hostsに追加します。これは、次のようにnginx構成に入力しました。
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://container1/$1;
}
}
container1からcontainer2にpingできますが、nginxはそれを解決できません:
* 1 container1を解決するために定義されたリゾルバーはありません
リクエストを別のDockerコンテナにproxy_passするにはどうすればよいですか?
コンテナ名の代わりに上流のブロックを直接使用する
upstream backend {
server container1;
}
server {
location ~ ^/some_url/(.*)$ {
proxy_pass http://backend/$1;
}
}
これにより、nginxでdockerリンクを簡単に使用する方法を提供して、通常の名前解決が行われるようになります。
組み込みのDocker DNSサービスを使用できます。有効になっている場合は、コンテナーリゾルバーを確認してください。
cat /etc/resolv.conf
する必要があります:
nameserver 127.0.0.11
このIPをリゾルバーとして使用します。
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.11;
proxy_pass http://container1/$1;
} }
/ etc/hostsをリゾルバとして使用することについて、この回答を確認する必要があります。 / etc/hostsをURLリライティングのリゾルバとして使用する
基本的に、DNSまたはリゾルバーはルックアップ中に/ etc/hostsを使用して名前を解決しませんが、dnsmasq
をインストールし、リゾルバーとして127.0.0.1
を使用することでこれを回避できます。 nginx設定に直接、リゾルバーとして127.0.0.1を追加できます。
server {
location ~ ^/some_url/(.*)$ {
resolver 127.0.0.1;
proxy_pass http://container1/$1;
}
}