Использование хост-сети и дополнительных сетей в докере
Я пытаюсь настроить среду 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
. Это устанавливает соответствующую переадресацию портов за кулисами.