2017-05-10 16 views
3

私は4つのSwarmノード(ServiceA)と4つのノードにまたがるNginxサービスを同じSwarm上で実行しています。 Nginxサービスはポート80と443を公開/公開しています。すべてのサービスは同じユーザー定義のオーバーレイネットワークに接続されていますが、最も重要なのはコンテナ内からサービス名(ServiceA)をカール/ピンすることができます。Nginx上流のDocker swarm DNS /サービス名の使用

私の質問は、どのようにサービス名で動作するためにNginx上流を取得するのですか?私は多くを読んで、これをnginx.conf resolver 127.0.0.11 ipv6=off;に追加しようとしましたが、それは役に立たず、Nginxサービスは開始しません。どのようにNginxを取得するための任意のアイデアは、DockerネットワークのDNS名を参照してください?

これは、上流のコンテナはすでに(DNSエントリが作成された)展開されている場合は、私のnginx.conf resolverを削除

events { 
    worker_connections 4096; 
} 

http { 
    include /etc/nginx/conf/*.conf; 
    include /etc/nginx/mime.types; 
    proxy_intercept_errors off; 
    proxy_send_timeout 120; 
    proxy_read_timeout 300; 

    upstream serviceA { 
     ip_hash; 
     server serviceA:8081; 
    } 

    server { 
     listen 80 default_server; 
     resolver 127.0.0.11 ipv6=off; 
     keepalive_timeout 5 5; 
     proxy_buffering off; 
     underscores_in_headers on; 

     location ~ ^/serviceA(?<section>.*) { 
      access_log /var/log/nginx/access.log nginx_proxy_upstream; 
      proxy_pass http://serviceA/$section$is_args$query_string; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 
    } 

    server { 
     listen 443 ssl; 
     resolver 127.0.0.11 ipv6=off; 
     keepalive_timeout 5 5; 
     proxy_buffering off; 
     underscores_in_headers on; 

     # allow large uploads 
     client_max_body_size 10G; 

     ssl_certificate /etc/nginx/ssl/myKey.crt; 
     ssl_certificate_key /etc/nginx/ssl/myKey.key; 

     location ~ ^/serviceA(?<section>.*) { 
      access_log /var/log/nginx/access.log nginx_proxy_upstream; 
      proxy_pass http://serviceA/$section$is_args$query_string; 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     } 

    } 
} 
+0

'--link'を使ってみましたか?リンクを作成すると、コンテナ内部から解決できるフレンドリ名になります。 – JulioHM

+0

私はdocker swarm(17.03.1-ce)を使用しています。それは群れを使って行うことができますか?私は何も言及していません - スウォームのドキュメントにリンク –

+0

リゾルバを削除してみてください。 – Kane

答えて

1

が動作するはずです。しかし、これは、アップストリームコンテナが既に実行中でない限り、nginxを起動できないことを意味します。 resolver経由ダイナミックアプローチについては

、あなたは、コンテナ自体 UPDATEあるコンテナ127.0.0.11経由ない...の中からドッカエンジンホストのDNSにアクセスできるようにする必要があります:カスタムネットワーク上でそれがすることが可能ですクエリ127.0.0.0/8アドレス)

https://docs.docker.com/engine/userguide/networking/configure-dns/

注:ホストのローカルホストリゾルバへのアクセスが必要な場合は、コンテナ内から到達可能である非localhostアドレスで待機するようにホスト上のDNSサービスを変更する必要があります。

UPDATE: 私はこのようなドッキングウィンドウの群れのカスタムオーバーレイネットワーク上でそれを行うために管理:

location/{ 
    resolver 127.0.0.11 ipv6=off; 
    set $upstream_addr <swarm_stack_name>:<port>; 
    proxy_pass https://$upstream_addr; 
    ... 
    } 

私はそれがupstream {} nginxの指示で動作するように取得できませんでした...この動的な解決を扱うように見えないか、私は何か見落としました。

関連する問題