2016-10-20 6 views
2

Я создал докерный рой с веб-сайтом внутри рой, издавая порт 8080 снаружи. Я хочу использовать этот порт, используя Nginx, который запускается за пределами роя на порту 80, который будет выполнять разрешение имен серверов и статические файлы хоста.Публикация порта док-станции рой только на localhost

Проблема заключается в том, что рой автоматически публикует порт 8080 в Интернете с использованием iptables, и я не знаю, можно ли разрешить использовать только локальный экземпляр nginx? Поскольку в настоящее время пользователи могут получить доступ к сайту как на портах 80, так и 8080, а второй - сломан (без изображений).

Пробовал играть с ufw, но он не работает. Также ручное изменение iptables было бы кошмаром, так как я должен был бы сделать это на каждом роевом узле после каждого обновления. Любые решения?

EDIT: Я не могу использовать одну и ту же сеть для рой и nginx вне рой, потому что наложенная сеть несовместима с обычными контейнерами с одним хостом. Теоретически я мог бы поставить nginx на рой, но я предпочитаю держать его отдельно на том же хосте, который содержит статические файлы.

ответ

2

Да, если контейнеры находятся в одной сети, вам не нужно публиковать порты для контейнеров для доступа друг к другу.

В вашем случае вы можете опубликовать порт 80 из контейнера nginx и не публиковать какие-либо порты из контейнера веб-сайта. Nginx по-прежнему может дойти до контейнера веб-сайта на порту 8080, если оба контейнера находятся в одной сети Docker.

+1

Проблема заключается в том, что они не могут быть в одной и той же сети. Тип типа «Рой» накладывается, и если вы пытаетесь запустить обычный контейнер докеров, используя «docker run --net swarm_net», вы получаете ошибку, что сети несовместимы. Я знаю, что он работает с обычными контейнерами докеров, но рой меняет все. Кроме того, команда «docker service create» --публичная команда не поддерживает интерфейсы, поэтому ее невозможно сделать - опубликовать 127.0.0.1:8080:8080 – Valar

+0

@ Валвар, @ Элтон-Стоунман прав. Вам просто нужно запустить каждый контейнер в качестве службы, и вы можете использовать параметр -publish, если вам нужно, но вы не укажете IP-адрес с помощью службы. При обслуживании в кластере SWARM при использовании --publish PORT: PORT он устанавливает его таким образом, чтобы этот порт отображался на КАЖДОМ узле в кластере, так как вы не знаете (если вы его не заставляете), какая машина в кластере служба будет проживать. Таким образом, устраните IP-адрес при выполнении команды 'docker service create' и опубликуйте только сопоставление портов:' --publish 8080: 8080' –

+0

@Valar, например, запустите тестовую службу nginx со следующим: 'docker service create --publish 80:80 --replicas 1 --name test-nginx nginx' Подождите, пока 'docker service ls' покажет, что он запущен, а затем попробуйте http://127.0.0.1 с каждой машины в кластере или используйте свой IP-адрес адрес, и вы должны получить приветствие на странице nginx с каждой машины. ДАЖЕ, если у вас только один экземпляр. –

1

Нет, прямо сейчас вы не в состоянии связать опубликованный порт на IP (даже не к 127.0.0.1) или интерфейс (например, интерфейс обратной lo). Но есть два вопроса, касающиеся этой проблемы:

Так что вы можете подписаться на них и/или участвовать в обсуждении.

Дальнейшее чтение: