https://docs.docker.com/engine/userguide/networking/get-started-overlay/

лся удокерская документация что я не могу использовать Docker DNS для поиска контейнеров, используя их имена хостов, не используя пользовательскую мостовую сеть. Я создал один с помощью команды:

docker network create --driver=overlay --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_overlay

и попытался развернуть контейнер, который использует его. составить файл выглядит так:

  version: "3.0"
    services:
      web1:
        image: "test"
        ports:
           - "12023:22"
        hostname: "mytest-web1"
        networks:
          - test
      web2:
        image: "test"
        ports:
           - "12024:22"
        hostname: "mytest-web2"
        networks:
          - test
    networks:
      test:
        external: 
          name: user_defined_overlay

моя версия докера:Docker version 17.06.2-ce, build cec0b72 и я получил следующую ошибку при попытке развертывания стека:

network "user_defined_bridge" is declared as external, but it is not in the right scope: "local" instead of "swarm"

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

NETWORK ID          NAME                       DRIVER              SCOPE
cd6c1e05fca1        bridge                     bridge              local
f0df22fb157a        docker_gwbridge            bridge              local
786416ba8d7f        host                       host                local
cuhjxyi98x15        ingress                    overlay             swarm
531b858419ba        none                       null                local
15f7e38081eb        user_defined_overlay       overlay             swarm

ОБНОВИТЬ

Я попытался создать два контейнера, работающих на двух разных узлах Swarm (первый контейнер работает на менеджере, а второй - на рабочем узле), и я указал пользовательскую оверлейную сеть, как показано в стеке выше. Я попытался пропинговать контейнер mytest-web2 из контейнера mytest-web1, используя имя хоста, но получилunknown host mytest-web2

 Tarun Lalwani07 сент. 2017 г., 20:18
Если вы используете стек Docker, тогда сеть должна быть наложена. так в чем проблема с этим
 tkyass07 сент. 2017 г., 21:12
Я не могу указать мостовую сеть в стеке? только оверлей?

Ответы на вопрос(2)

Решение Вопроса

вы можете создавать локальные сети узлов с областью роя. Сделайте это с--scope=swarm вариант, например:

docker network create --scope=swarm --driver=bridge \
  --subnet=172.22.0.0/16 --gateway=172.22.0.1 user_defined_bridge

Затем вы можете использовать эту сеть со службами и стеками, определенными в режиме роя. Для более подробной информации, вы можете увидетьPR № 32981.

Изменить: вы, кажется, значительно усложнили вашу проблему. Пока все выполняется в одном файле компоновки, нет необходимости определять сеть как внешнюю. Существует требование использовать оверлейную сеть, если вы хотите общаться между контейнерами. Обнаружение DNS включено в мостовые и оверлейные сети, за исключением сети по умолчанию «мост», которую создает докер. С составным файлом вы никогда не будете использовать эту сеть, если не будете явно настраивать ее как внешнюю сеть с таким именем. Таким образом, чтобы заставить работать сеть контейнер-контейнер, вы можете позволитьdocker-compose или жеdocker stack deploy создайте сеть для вашего проекта / стека автоматически с помощью:

version: "3.0"
   services:
     web1:
       image: "test"
       ports:
       - "12023:22"
     web2:
       image: "test"
       ports:
         - "12024:22"

Обратите внимание, что я также удалил настройку «hostname». Это не нужно для разрешения DNS. Вы можете напрямую общаться с VIP-службой с именем «web1» или «web2» из любого из этих контейнеров.

С участиемdocker-compose это создаст мостовую сеть по умолчанию. Режим Swarm создаст оверлейную сеть. Эти значения по умолчанию идеально подходят для обнаружения DNS и связи между контейнерами в каждом из сценариев.

 BMitch08 сент. 2017 г., 01:03
@tkyass DNS работает, даже не определяя имя хоста в контейнере, с наложением или мостом, но вы должны быть в одной сети. Мостовая сеть не охватывает несколько узлов докеров, поэтому, если контейнеры запускаются на разных хостах, таких как менеджер и работник, невозможно связать контейнеры с мостовой сетью.
 tkyass12 сент. 2017 г., 17:28
Спасибо за помощь!
 tkyass07 сент. 2017 г., 23:03
Еще раз спасибо @BMitch за ваш ответ. но я думаю, что мой вопрос недостаточно ясен. все, что я хочу сделать, - это иметь возможность общаться между контейнерами, созданными из одного стека, используя их имя хоста, без использования файлов хоста. Я думал, что докер имеет поддержку DNS для такого случая, если я разверну стек в определенной пользователем сети. Я внес правки в мой вопрос выше, чтобы лучше отразить мой запрос
 BMitch07 сент. 2017 г., 22:29
Узловые локальные сети, такие как мостовая сеть, не работают через несколько узлов в рое. Для этого вам понадобится оверлейная сеть. Только контейнеры, работающие на одном и том же узле, смогут общаться между контейнерами. Все, что находится вне этого, должно было бы получить доступ через опубликованные порты на хосте.
 tkyass07 сент. 2017 г., 22:11
спасибо @BMitch, команда, которую вы предоставили, запустилась без ошибок ... но я все еще не могу пропинговать контейнер из другого контейнера, используя имя хоста. Я создал 2 контейнера, один из которых работает в диспетчере, а второй - в рабочем. Я могу пропинговать друг друга, используя их псевдоним, но не могу использовать их имя хоста. Я думал, что если я укажу определенную мостовую сеть, то решу мою проблему мое предположение неверно?

которая будет использоваться в Swarm. Swarm предназначен для управления контейнерами на нескольких хостах, а оверлейные сети являются многоузловыми сетями докеров.https://docs.docker.com/engine/userguide/networking/get-started-overlay/

Ваш ответ на вопрос