У меня есть два отдельных docker-compose.yml
файла в двух разных папках:
~/front/docker-compose.yml
~/api/docker-compose.yml
Как я могу убедиться, что контейнер front
может отправлять запросы в контейнер api
?
Я знаю, что эта --default-gateway
опция может быть установлена с использованием docker run
отдельного контейнера, так что этому контейнеру может быть назначен определенный IP-адрес, но кажется, что эта опция недоступна при использовании docker-compose
.
В настоящее время я делаю docker inspect my_api_container_id
и смотрю на шлюз в выводе. Это работает, но проблема в том, что этот IP-адрес присваивается случайным образом, поэтому я не могу на него полагаться.
Таким образом, другой формой этого вопроса может быть:
- Могу ли я присвоить фиксированный IP-адрес конкретному контейнеру с помощью docker-compose?
Но в итоге я присматриваю за:
- Как два разных проекта, создаваемых в Docker, могут общаться друг с другом?
networking
docker
docker-compose
Дживан
источник
источник
Ответы:
Вам просто нужно убедиться, что контейнеры, с которыми вы хотите общаться друг с другом, находятся в одной сети. Сети представляют собой первоклассную конструкцию докера и не предназначены для создания.
...
Затем они могут общаться друг с другом, используя имя службы. От
front
тебя можно сделатьping api
и наоборот.источник
name
свойство, которое отключит автоматическое добавление с именем проекта. Тогда любой проект может использовать эту сеть и автоматически создать ее, если она еще не существует.ОБНОВЛЕНИЕ: Начиная с версии 3.5 файла:
Теперь это работает:
docker-compose up -d
присоединится к сети под названием «custom_network». Если его не существует, он будет создан!Теперь вы можете сделать это:
Это создаст контейнер, который будет во внешней сети.
Я не могу найти никаких ссылок в документах, но это работает!
источник
Просто небольшое замечание к отличному ответу @ johnharris85: когда вы запускаете файл компоновки Docker, создается
default
сеть " ", так что вы можете просто добавить его в другой файл компоновки как внешнюю сеть:...
Для меня этот подход был более подходящим, потому что у меня не было первого файла docker-compose, и я хотел с ним связаться.
источник
services:
теге,networks:
затем синтаксис будет вложенfront_default:
(удалите «-»), а затем мы вложим статический IP:ipv4_address: '172.20.0.44'
Все контейнеры из
api
могут присоединиться к сети поfront
умолчанию со следующей конфигурацией:См. Руководство по созданию докера: использование предварительно существующей сети (см. Внизу)
источник
Информация предыдущих постов верна, но не содержит подробностей о том, как связывать контейнеры, которые должны быть связаны как "external_links".
Надеюсь, этот пример прояснит вам:
Предположим, у вас есть app1 / docker-compose.yml с двумя службами (svc11 и svc12) и app2 / docker-compose.yml с еще двумя службами (svc21 и svc22), и предположим, что вам нужно соединиться перекрестным образом:
svc11 должен подключиться к контейнеру svc22
Итак, конфигурация должна быть такой:
это app1 / docker-compose.yml:
это app2 / docker-compose.yml:
источник
Начиная с Compose 1.18 (спецификация 3.5), вы можете просто переопределить сеть по умолчанию, используя собственное имя для всех необходимых вам файлов Compose YAML. Это так же просто, как добавить к ним следующее:
Другие ответы указывают на то же самое; это упрощенное резюме.
источник
ОБНОВЛЕНИЕ: Начиная с версии 3.5 файла:
Я столкнулся с подобной проблемой и решил ее, добавив небольшое изменение в один из моих проектов docker-compose.yml.
Например, у нас есть два API
scoring
иner
.Scoring
API должен отправить запрос вner
API для обработки входного запроса. Для этого они оба должны использовать одну и ту же сеть.Примечание. Каждый контейнер имеет свою собственную сеть, которая автоматически создается во время запуска приложения в Docker. Например, будет создана сеть ner api, а сеть
ner_default
api будет названа какscoring default
. Это решение будет работать для версии: «3».Так как в приведенном выше сценарии мой API скоринга хочет связаться с NER API, то я добавлю следующие строки. Это означает, что всякий раз, когда я создаю контейнер для ner api, он автоматически добавляется в сеть scoring_default.
Нер / Докер-compose.yml
скоринг / докер-compose.yml
Мы можем видеть это, как вышеперечисленные контейнеры теперь являются частью одной сети, вызываемой
scoring_default
с помощью команды:источник
Я хотел бы убедиться, что все контейнеры
docker-compose
подключены к одной и той же сети, составив их одновременно, используя:источник
link
илиdepends_on
из одного контейнера спереди одного контейнера апи?build path ~/front/api either does not exist or is not accessible
или наоборот,build path ~/api/front either does not exist or is not accessible
Вы можете добавить
.env
файл во все ваши проекты, содержащиеCOMPOSE_PROJECT_NAME=somename
.COMPOSE_PROJECT_NAME переопределяет префикс, используемый для именования ресурсов, поэтому все ваши проекты будут использовать
somename_default
их в качестве своей сети, что позволяет службам взаимодействовать друг с другом, как они были в одном проекте.NB. Вы получите предупреждения об «осиротевших» контейнерах, созданных из других проектов.
источник
источник
второй docker-compose.yml
источник
Другой вариант - просто запустить первый модуль с помощью 'docker-compose', проверить ip, связанный с этим модулем, и подключить второй модуль к предыдущей сети, как внешний, и указать внутренний ip.
пример app1 - новая сеть, созданная в служебных строках, пометить как внешнюю: true в нижней части app2 - указать «новую сеть», созданную app1 при повышении, пометить как внешнюю: true в нижней части и установить в конфигурации для подключения, ip, который app1 есть в этой сети.
При этом вы сможете разговаривать друг с другом
* этот способ предназначен только для локального тестирования, чтобы не выполнять слишком сложную настройку ** Я знаю, что это очень «патч-способ», но он работает для меня, и я думаю, что он настолько прост, что некоторые другие могут воспользоваться этим
источник
Если ты
Connection refused
при попытке общаться между двумя контейнерамиИ вы хотите
api_a
взаимодействуетapi_b
(или наоборот) без той же «сети докеров»(пример ниже)
Вы можете использовать «хост» второго контейнера в качестве IP-адреса вашего компьютера и порта, который отображается изнутри контейнера Docker. Вы можете получить IP-адрес вашего компьютера с помощью этого сценария (из: Нахождение локальных IP-адресов с помощью stdlib Python ):
Пример:
project_api_a/docker-compose.yml
:внутри
api_a
контейнера вы запускаете приложение Django:manage.py runserver 0.0.0.0:8000
и второй docker-compose.yml из другого проекта:
project_api_b/docker-compose-yml
:внутри
api_b
контейнера вы запускаете приложение Django:manage.py runserver 0.0.0.0:8001
И при попытке подключения из контейнера
api_a
кapi_b
URL-адресуapi_b
контейнера будет:http://<get_ip_from_script_above>:8001/
Это может быть особенно ценно, если вы используете даже более двух (трех или более) проектов, создающих Docker, и сложно обеспечить общую сеть для всего этого - это хороший обходной путь и решение
источник