
У меня есть конфигурация docker swarm, и в ней я развернул два стека ( main
и mon
) я могу открыть порт в одном стеке и могу ссылаться на него из другого. Однако я пытался найти способ не делать этого, а вместо этого получить к нему доступ с помощью DNS 127.0.0.11.
У mon
меня есть услуга, которая называетсяgrafana
С использованиемhttps://docs.docker.com/docker-cloud/apps/service-links/#обнаружение-сервисов-или-контейнеров-в-другом-стекечто указывало на то, что я могу использовать имя стека для ссылки на него, но это не сработало, когда я попытался ping grafana.mon
это сделать, он просто вернул неверное имя хоста.
решение1
Чтобы сделать это, все, что вам нужно, это заставить его использовать ту же сеть, тогда они будут видны. В моем случае я определил сеть под названием public
, на которую ссылаются извне все мои стеки
docker network create -d overlay --attachable public
Отсюда в моем файле docker-compose.yml есть
networks:
public:
external:
name: public
Чтобы получить к нему доступ, просто используйте имя сервиса.
решение2
Вам необходимо разрешить обоим стекам подключаться через тип сети наложения, а затем разрешить обоим стекам использовать (по крайней мере, для требуемой службы) сеть наложения, созданную снаружи обоих стеков.
Оверлейную сеть следует создать до того, как будут установлены стеки, чтобы службы, которым необходимо подключение, могли «подключиться» к ней.
Создайте сеть следующим образом.
docker network create --driver overlay --attachable
Затем обратитесь к имени службы в вашем env-файле, вы можете проверить, какое имя имеет вызываемая ваша служба.
docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
vkz5vccbmce7 foo-stack_por-service replicated 1/1 por-service:1.0.0 *:33065->3306/tcp
sjpnrkm1iiha foo-stack_vic-service replicated 1/1 vic-service:1.0.0 *:8081->80/tcp
0capavl31oab bar-stack_tar-service replicated 1/1 tar-service:1.0.0 *:33066->3306/tcp
9vohh24jt6hy bar-stack_zen-service replicated 1/1 zen-service:1.0.0 *:8082->80/tcp
Теперь получите имя службы из столбца NAME. Пример:bar-stack_tar-сервис
Обратите внимание, что вашим службам предшествует имя стека, которое вы указываете при развертывании.
docker stack ls
NAME SERVICES ORCHESTRATOR
foo-stack 2 Swarm
bar-stack 2 Swarm