Могу ли я запустить два отдельных приложения на порт 80 и разные имена хостов в Docker Swarm?

С новым захватывающим Docker Swarm в версии 1.12 кажется вполне возможным развернуть несколько приложений в кластере серверов.

Я ищу способ развертывания двух отдельных приложений или точек входа приложений на одном и том же порту и одном кластере. Учтите следующее:

    web.myservice.com:80 -> Swarm ->     Service[web] -> web.1
                                                      -> web.2
                                                      -> web.3

backend.myservice.com:80 -> Swarm -> Service[backend] -> backend.1
                                                      -> backend.2
                                                      -> backend.3

Где рой в этом случае только в одном кластере из нескольких хостов, выставляя порт 80. Я полагаю, вы могли бы выставить разные порты и настроить балансировщики нагрузки на proxy_pass для этого другого порта, но я бы сказал, было бы здорово иметь возможность просто выставить имя хоста: порт в кластере, поэтому, если запрос приходит на имя хоста и порт, он будет перенаправлен. Если вам нужно несколько хостов или порт, вы можете выставить несколько.

Это может быть доступно, и именно поэтому я задаю этот вопрос. Может быть, это может быть скопировано с некоторыми расширенными настройками HAProxy или Nginx. Я экспериментировал довольно много, и мне было довольно трудно сделать это расширяемым. Пожалуйста, совет по теме, если у вас есть какие-либо комментарии или предложения!

- Маркус

1 ответ

Когда вы публикуете порт, он привязывается к сетевому интерфейсу узла. Вы могли бы справиться с этим, используя ограничения размещения, чтобы гарантировать, что задачи обеих служб никогда не находятся на одном и том же узле, но я думаю, что лучше всего иметь службу nginx для прокси-трафика для вас.

Swarm делает записи DNS для ваших сервисов, чтобы вы могли легко получить к ним доступ по имени, простой пример nginx:

http {
...
  server {
    server_name web.myservice.com;

    location / {
      proxy_pass http://web:8080;
      proxy_redirect default;
    }
  }

  server {
    server_name backend.myservice.com;

    location / {
      proxy_pass http://backend:8080;
      proxy_redirect default;
    }
  }
}
Другие вопросы по тегам