2

I have an nginxplus container and a demo service running in docker swarm mode on windows 10.

I am using endpoint-mode as dnsrr for the demo service so that nginx can use the docker DNS server as resolver for the demoservice.

But I am getting an error in nginxplus logs saying "service http of demosvcalias could not be resolved (3: Host not found)"

Docker resolv.conf shows 127.0.0.11 as the name server which looks correct.

  **docker exec -it b7665155d8e0 cat /etc/resolv.conf**
  search xxx.com dev.xxx.com
  nameserver 127.0.0.11
  options ndots:0

docker-compose for demo service

version: "3.3"
services:
  demosvc:
    image: demo:latest
    deploy:
      endpoint_mode: dnsrr
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 5000M
      restart_policy:
        condition: on-failure
    #ports:
      #- "8081:8080"
    networks:
      my-swarm-network : 
           aliases:
             - demosvcalias
networks:
  my-swarm-network:
    external: true

docker-compose for nginx plus

version: "3"
services:
  nginxp:        
    image: nginxp:latest
    deploy:
      replicas: 1
      resources:
        limits:
          cpus: "0.1"
          memory: 5000M
      restart_policy:
        condition: on-failure
    ports:
      - "80:80"
    networks:
      - my-swarm-network
networks:
  my-swarm-network:
    external: true

nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    resolver 127.0.0.11 valid=60s ipv6=off;

    server {        
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index index.html;
        }
        location /demo {        
            proxy_pass http://demobackend;       
        }

    }
    upstream demobackend {
            zone backend 32k;
            server demosvcalias service=http resolve;           
    }



}

I am able to curl the http://demosvscalias:8080/demo.html from the nginx container using docker exec utility also. But nginx resolver fails to resolve the demosvc using the Docker embedded DNS server (127.0.0.11).

Am I missing anything here ?

UPDATE: After the below update , load balancing is working fine with docker embedded DNS server as resolver.

in nginx.conf

server demosvcalias service=http resolve ==> server demosvcalias:8080 resolve;

UPDATED nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    resolver 127.0.0.11 valid=60s ipv6=off;
    resolver_timeout      10s;

    server {        
        access_log /var/log/nginx/access.log upstreamlog;
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index index.html;
        }
        location /demo {        
            proxy_pass http://demobackend;       
        }

    }
    upstream demobackend {
            zone backend 32k;
            server demosvcalias:8080 resolve;           
    }

}

1 Answers1

0

After the below update , load balancing is working fine with docker embedded DNS server as resolver.

in nginx.conf

server demosvcalias service=http resolve ==> server demosvcalias:8080 resolve;

UPDATED nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    log_format upstreamlog '[$time_local] $remote_addr - $remote_user - $server_name  to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    resolver 127.0.0.11 valid=60s ipv6=off;
    resolver_timeout      10s;

    server {        
        access_log /var/log/nginx/access.log upstreamlog;
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index index.html;
        }
        location /demo {        
            proxy_pass http://demobackend;       
        }

    }
    upstream demobackend {
            zone backend 32k;
            server demosvcalias:8080 resolve;           
    }

}

I will have to look into the details of why service=http is causing issues . Not sure if its due to the version of Nginxplus I am using or something else. Will update if I find anything