Использование хост-сети и дополнительных сетей в докере

Я пытаюсь настроить среду dev для моего проекта.

У меня есть контейнер (ms1), который нужно поместить в его собственную сеть ( "сервисы" в моем случае) и контейнер (apigateway), который должен получить доступ к этой сети, пока выставляете http-порт в сеть хоста.

В идеале мой файл для компоновки докеров будет выглядеть так:

version: '2'
services:
    ms1:
        expose:
            - "13010"
        networks:
            services:
                aliases:
                    - ms1
   apigateway:
        networks:
            services:
                aliases:
                    - api
        network_mode: "host"
networks:
    services:

docker-compose не позволяет одновременно использовать network_mode и сети.

Есть ли у меня другие альтернативы?

В данный момент я использую это:

   apigateway:
        networks:
            services:
                aliases:
                    - api
        ports:
            - "127.0.0.1:10000:13010"

а затем контейнер apigateway прослушивает 0.0.0.0:13010. Он работает, но он медленный, и он зависает, если соединение с интернет-узлом снижается.

Кроме того, я планирую использовать бродягу в будущем на докере, разрешает ли это решить чистым способом?

Ответ 1

Я бы попробовал это:

1/Найти сеть хоста docker network ls

2/Используйте этот файл докересочетания

     services:
          ms1:
              ports:
                  - "13010"
              networks:
                  - service
          apigateway:
              networks:
                  - front
                  - service

      networks:
          front:
          service:
              external:
                  name: "<ID of the network>"

Ответ 2

В docker 1.13 вы должны создать службу для соединения между двумя сетями. Я использую что-то похожее на fix еще одну проблему, и я думаю, что это также может помочь здесь:

docker service create \
--name proxy \
--network proxy \
--publish mode=host,target=80,published=80 \
--publish mode=host,target=443,published=443 \
--constraint 'node.hostname == myproxynode' \
--replicas 1 \
letsnginx

Ответ 3

expose в docker-compose не публикует порт на хосте. Поскольку вам, вероятно, больше не нужна привязка к службе (вместо этого вам следует полагаться на сети Docker, как вы это делаете), этот вариант имеет ограниченное значение в целом и, похоже, не дает вам никакой ценности в вашем сценарии.

Я подозреваю, что вы пришли к его использованию по ошибке, и, поняв, что он, похоже, не имеет никакого эффекта сам по себе, наткнулся на то, что использование драйвера хост-сети "заставило бы его работать". Имейте в виду, что это не имеет никакого отношения к свойству expose. Это просто, что драйвер сетевой сети позволяет связанным процессам напрямую связываться с сетевым интерфейсом хоста. Благодаря этому вы можете связаться со шлюзом API со стороны. Вы можете удалить свойство expose, и оно все равно будет работать.

Если это единственная причина, по которой вы выбрали драйвер сетевой сети, то вы стали жертвой проблемы X-Y:

(Tl; дг) Никогда не нужно использовать драйвер сетевой сети в обычных ситуациях, сетевой драйвер моста по умолчанию работает очень хорошо. Что вы ищете, это свойство ports, а не expose. Это устанавливает соответствующую переадресацию портов за кулисами.