Docker群集与nginx作为caching:502坏的网关

我已经使用Docker swarm来创build1个pipe理员和2个worker,每个人都在vm上(由docker-machine创build)。 我创build了一个caching的“cdn服务”,或者将请求传递给后端(一个tomcat容器,端口8080)。 我的docker版本是1.13-RC2

这是我的nginx镜像的configuration文件:

proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_zone:10m inactive=60m; proxy_cache_key "$scheme$request_method$host$request_uri"; proxy_cache_methods GET HEAD POST; proxy_cache_valid 200 206 100m; proxy_ignore_headers Set-Cookie; add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Headers' 'Range'; server { listen 80; server_name 172.17.0.1; #charset koi8-r; #access_log /var/log/nginx/log/host.access.log main; location = /example-av1.mpd { add_header 'Access-Control-Allow-Origin' '*'; proxy_cache my_zone; add_header X-Proxy-Cache $upstream_cache_status; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://172.17.0.1:8700/shaka-player-master/media/example-av1.mpd; } } 

问题如下:我创build了名为“mynet”的覆盖networking

当我创build服务:

 docker service create --name nginx-cdn --network mynet --mode global --publish mode=host,target=80,published=9500,protocol=tcp *myimage* 

假设我的集群节点是192.168.99.103-104-105,并且服务是在端口9500上,如果我指向192.168.99.103 (或104或105) :9500/example-av1.mpd有502坏的网关,而不是redirect请求到后端。

这个问题也可以通过docker版本1.12来实现。

我该如何解决这个问题?

172.17.0.1似乎是一个默认的桥梁networking,可能不覆盖。 如果后端容器在另一台主机上运行,​​则nginx容器可以连接主机的私有IP或全局IP,而不是桥接器。

如果要将后端容器join到同一个群集中,可以使用以下方法创build覆盖networking:

 docker network create --driver overlay --subnet xxxx/24 foo 

然后在同一覆盖networking中创build服务:

 docker service create --network foo ... --name nginx nginx docker service create --network foo ... --name tomcat tomcat 

您还需要在nginx.conf中更新proxy_pass:

 proxy_pass http://tomcat:8700/shaka-player-master/media/example-av1.mpd; 

覆盖networking的文档如下:

https://docs.docker.com/engine/swarm/networking/