2017-05-10 4 views
3

4 개의 스웜 노드 (ServiceA)에서 실행되는 서비스와 4 개의 노드에서 동일한 Swarm에서 실행되는 Nginx 서비스가 있습니다. Nginx 서비스는 포트 80과 443을 노출/게시합니다. 모든 서비스는 동일한 사용자 정의 오버레이 네트워크에 연결되며 가장 중요한 것은 컨테이너 내에서 서비스 이름 (ServiceA)을 컬링/핑 (ping) 할 수 있으므로 지금까지 모두 작동합니다.Nginx 업스트림에서 Docker swarm DNS/서비스 이름을 사용하는 방법

내 질문은 어떻게 서비스 이름을 작동하도록 Nginx 업스트림을 얻는가? 나는 많은 것을 읽었으며 이것을 nginx.conf resolver 127.0.0.11 ipv6=off;에 추가하려고 시도했지만 도움이되지 않았으므로 Nginx 서비스가 시작되지 않습니다. Nginx를 얻는 방법에 대한 아이디어는 Docker 네트워크 DNS 이름을 참조하십시오.

상류 용기가 이미 (만든 DNS 항목) 배포 된 경우 작동해야 resolver 제거 내 nginx.conf

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

resolver를 제거해보십시오. – Kane

답변

1

입니다. 그러나 이것은 업스트림 컨테이너가 이미 실행 중이 아니면 nginx를 시작할 수 없다는 것을 의미합니다. 것이 가능 사용자 정의 네트워크에에 : resolver를 통해 동적 접근 방식에 대한

, 당신은 용기 자체 UPDATE 인 ... 127.0.0.11를 통해 (하지 컨테이너 내에서 고정 표시기 엔진 호스트의 DNS에 액세스 할 수 있도록 할 필요가 쿼리 127.0.0.0/8 주소).

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

참고 : 호스트의 로컬 호스트 해결에 액세스해야하는 경우, 당신은 컨테이너 내에서 도달이 아닌 로컬 호스트 주소에서 수신하는 호스트에 당신의 DNS 서비스를 수정해야합니다 .

가 UPDATE : 내가 이런 고정 표시기 떼에서 사용자 지정 오버레이 네트워크에서 그것을 할 관리 :

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

나는 그것이 upstream {}의 nginx 지시어로 작동하지 않았다 ...이 동적 인 문제를 해결하지 못하거나 뭔가를 간과했다.