Разобьем решение на части.Каждая часть пытается дать вам представление о решении и взаимосвязана друг с другом.
Контейнерная сеть Docker
Всякий раз, когда мы создаем контейнер без указания сети, Docker присоединяет его к мостовой сети по умолчанию. Согласно этому, .Обнаружение службы недоступно в сети по умолчанию.Для правильной работы службы обнаружения служб мы должны создать определенную пользователем сеть, поскольку она обеспечивает изоляцию, разрешение DNS и многие другие функции. Все это применимо, когда мы используем команду docker run
.
Когда docker-compose используется для запуска контейнера, а сеть не указана, он создает свою собственную мостовую сеть. , которая имеет все свойства пользовательских сетей.
Эти мостовые сети по умолчанию недоступны, но они позволяют подключать к ним док-контейнеры на локальном компьютере.
Сеть роя Docker
В Сеть роя Docker и сетка маршрутизации в режиме роя Всякий раз, когда мы внедряем в нее службу без указания внешней сети, к которой она подключаетсявходная сеть.
Когда вы указываете внешнюю оверлейную сеть, вы можете заметить, что созданная оверлейная сеть будет доступна только для менеджера, а не на рабочем узле, если служба не создана и не реплицирована на нее.Они также не могут быть подключены по умолчанию и не позволяют другим контейнерам вне сервисов Swarm подключаться к ним.Таким образом, вам не нужно объявлять сеть как подключаемую, пока вы не подключите к ней контейнер вне роя.
Docker Swarm
Поскольку предопределенного / официального ограничения на нет нет.рабочих / управляющих узлов , вы должны иметь возможность подключиться с третьего узла.Одна возможность состоит в том, что узел может быть подключен как рабочий узел, но вы можете попытаться развернуть контейнер в этом узле, который ограничен рабочим узлом, если оверлейная сеть не является присоединяемой.
Более того, вы не можете развернуть сервис непосредственно на рабочем узле.Все службы развернуты на узле диспетчера, и он заботится о репликации и масштабировании служб на основе предоставленных конфигурации и режима.
Брандмауэр
Как указано в Начало работы с режимом роя
- TCP-порт 2377 для связи управления кластером
- TCP и UDP-порт 7946 для связи между узлами
- UDP-порт 4789 для наложения сетевого трафика
- IP-протокол 50 (ESP) для зашифрованной оверлейной сети
Эти порты должны быть в белом списке для связи между узлами.Большинство межсетевых экранов необходимо перезагрузить после внесения изменений.Это можно сделать, передав опцию перезагрузки брандмауэру, и она зависит от дистрибутива Linux.ufw
не нужно перезагружать, но необходимо зафиксировать, если в файл добавлены правила .
Дополнительные шаги, которые необходимо выполнить в брандмауэре
Помимо внесения в белый список вышеупомянутыхпорты.Вам может понадобиться белый список IP-адресов docker0, docker_gw_bridge, br-123456 с маской сети 16. Остальное обнаружение службы не будет работать на том же хосте.то есть, если вы пытаетесь подключиться к eureka
в 192.168.0.12 , где служба eureka
находится в том же 192.168.0.12 , она не будет разрешена, поскольку брандмауэр заблокирует трафик. См. Это (НЕТ ROUTE TO HOST сетевой запрос от контейнера к host-ip: порт опубликован из другого контейнера)
Java
Иногда Java работает так странно, что выдает java.net.MalformedURLException
и аналогичные исключения.У меня есть собственный опыт такого случая с решением .Здесь пинг разрешен правильно, но Java RMI выдает ошибку.Таким образом, вы можете определить свой собственный псевдоним при подключении к определенной пользователем сети.
Обнаружение службы Docker
По умолчанию вы можете разрешить доступ к службе, используя имя контейнера.Кроме того, вы также можете разрешить услугу как <container_name>.<network_name>
.Конечно, вы также можете определить псевдоним.И даже вы можете разрешить его как <alias_name>.<network_name>
.
Решение
Поэтому вы должны создать пользовательскую оверлейную сеть после присоединения к рою, а затем развернуть сервисы.В сервисах Вы должны упомянуть внешнюю сеть, как определено здесь вместе с внесением изменений в брандмауэр.
Если вы хотите разрешить внешним контейнерам подключаться к сети, вы должны создать сетьприсоединяемый.
Поскольку вы не предоставили достаточно подробностей о том, что происходит с третьим сервером.Я предполагаю, что вы пытаетесь развернуть там контейнер, который запрещен сетью наложения Docker, так как сеть не подключаема.