web-dev-qa-db-ja.com

リンクされたDockerコンテナーへのnginx proxy_pass

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するにはどうすればよいですか?

25
Tim-Erwin

コンテナ名の代わりに上流のブロックを直接使用する

upstream backend {
    server container1;
}
server {
    location ~ ^/some_url/(.*)$ {
        proxy_pass http://backend/$1;
    }
}

これにより、nginxでdockerリンクを簡単に使用する方法を提供して、通常の名前解決が行われるようになります。

39
Bruce Stringer

組み込みの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;
    } }
35
Thomas Decaux

/ 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;
    }
}
8
Michael