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的文档如下: