2017-01-17 3 views
0

Я использовал докеры для создания кластера, состоящего из 1 менеджера и 2 рабочих, каждый на vm (созданный докер-машиной). Я создал «службу cdn», которая кэширует или передает запрос на бэкэнд (контейнер tomcat, на порт 8080). Моя докер версия 1,13-код2Docker swarm с nginx в качестве кеша: 502 плохой шлюз

Это конфигурационный файл моего Nginx изображения:

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; 
    } 

} 

проблема заключается в следующем: Я создал наложенной сети под названием «MyNet»

когда я создать сервис:

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 плохой шлюз, вместо запроса перенаправления на бэкэнд.

Эта проблема также относится к докерной версии 1.12.

Как решить эту проблему?

+0

Я не уверен, что ваше окружение, но 172.17.0.1, кажется, сеть моста по умолчанию и, возможно, не накладывать. Можете ли вы предоставить команду 'docker network create', которая создала' mynet' и результат 'docker network inspect mynet'? – minamijoyo

+0

Я думаю, что у вас есть право .. я бы хотел, но я не знаю, как это сделать. Я думаю, что я должен приложить контейнер tomcat (просто) к сети mynet overlay (swarm scoped), но я не знаю, как из-за узлов моего кластера находятся внутри виртуальных машин, а контейнер tomcat - в хосте. – pier92

+0

это выход DOCKER сети проверить MyNet: Config ": [{ " подсеть ": "10.0.0.0/24", "шлюз": "10.0.0.1" } ] "IPv4-адрес":" 10.0. 0,4/24 ", " Peers ": [{ " Name ":" manager-dash-b31a241cf6f1 ", " IP ":" 192.168.99.103 " }, {" Name ":" worker-dash-2- faxt1011b5c987a ", " IP ":" 192.168.99.104 "и другие материалы, которые я не могу показать здесь. из-за пространства. Вы должны знать, что эта команда находится внутри vm. От хоста я не вижу эту сеть.В mynet можно увидеть 3 сверстников (1 vm-manager и 2 vm-workers). – pier92

ответ

1

172.17.0.1, кажется, является мостовой сетью по умолчанию и, возможно, не накладывается. Если бэкэнд-контейнер работает на другом отдельном хосте, контейнер nginx может соединяться с частным или глобальным IP-адресом хоста вместо моста.

Если вы хотите присоединиться к контейнер бэкэнда к тому же роя кластеру, вы можете создавать наложенную сеть с:

docker network create --driver overlay --subnet x.x.x.x/24 foo 

, а затем создавать сервисы в одной и ту же наложенной сети:

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

You также необходимо обновить proxy_pass в nginx.conf:

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

Документы для ove rlay сети выглядит следующим образом:

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

+0

Я не могу этого. Потому что я хочу иметь 3 vm внутри моей службы cdn, а другой vm с внутренним tomcat. Я знаю, что я должен создать контейнер tomcat или службу tomcat. Для связи между этими службами мне нужно, чтобы эти службы принадлежали одной и той же сети оверлея. Но как, если из другой VM я не вижу «mynet», созданный с другой VM? – pier92

+1

Если контейнер tomcat запущен на другом одном хосте, почему бы не попытаться соединиться с частным или глобальным IP-адресом хоста вместо моста? – minamijoyo

+0

правый. Спасибо за ваши ответы. – pier92