无法连接覆盖网络上的容器:[emerg] 无效主机

Cannot Connect Container on Overlay Network: [emerg] invalid host

我正在尝试通过 swarm 中的 nginx 容器将请求反向代理到共享相同覆盖网络的独立容器。

tldr;我收到以下错误:

2018/03/15 19:00:35 [emerg] 1#1: invalid host in upstream "http://nginx" in /etc/nginx/nginx.conf:96
nginx: [emerg] invalid host in upstream "http://nginx" in /etc/nginx/nginx.conf:96

独立容器包含一个具有另一个 nginx 前端的应用程序:

version: "3"
services:
  nginx:
    restart: always
    container_name: my.nginx
    build: ./nginx
    networks:
      - default
      - my-overlay-network
    depends_on:
      - another-service

... other services

networks:
   my-overlay-network:
     external: true

我用 docker-compose up -d 启动这个应用程序。

我的群包含反向代理:

version: "3"
services:
  reverseproxy:
    build: ./reverseproxy
    image: reverse_proxy
    networks:
      - my-overlay-network
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
    deploy:
      replicas: 10
      restart_policy:
        condition: on-failure

    networks:
      my-overlay-network:
        external: true

如果我启动 nginx swarm 而没有 为独立应用程序指定 proxy_pass,我可以像这样成功地 ping 其他主机:

ping http://nginx/

我可以根据nginx日志确认对方主机收到了这个请求

但是,如果我在反向代理中指定 docker 独立应用程序:

upstream standalone {
    server http://nginx/;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ... other stuff ...

    location / {
        proxy_pass http://standalone/;
    }
}

我收到以下错误:

2018/03/15 19:00:35 [emerg] 1#1: invalid host in upstream "http://nginx" in /etc/nginx/nginx.conf:96
nginx: [emerg] invalid host in upstream "http://nginx" in /etc/nginx/nginx.conf:96

尝试在上游之前添加resolver

resolver 127.0.0.11;
upstream standalone {
    server http://nginx/;
}

127.0.0.11 是嵌入式 docker DNS 服务器的地址

问题是 upstream 的语法不正确:它需要一个主机和端口,所以它应该是:

upstream standalone {
    server nginx;
}