Связь между несколькими проектами docker-compose
у меня есть две отдельные 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-compose общаются друг с другом?
7 ответов:
вам просто нужно убедиться, что контейнеры, которые вы хотите поговорить друг с другом, находятся в одной сети. Сети-это первоклассная конструкция docker,а не конкретная для создания.
# front/docker-compose.yml version: '2' services: front: ... networks: - some-net networks: some-net: driver: bridge...
# api/docker-compose.yml version: '2' services: api: ... networks: - front_some-net networks: front_some-net: external: trueзатем они могут разговаривать друг с другом, используя имя службы. От
frontможно сделатьping apiи наоборот.
просто небольшое дополнение к замечательному ответу @johnharris85, когда вы запускаете docker compose file, a" сеть" поэтому вы можете просто добавить его в другой файл compose в качестве внешней сети:
# front/docker-compose.yml version: '2' services: front_service: ......
# api/docker-compose.yml version: '2' services: api_service: ... networks: - front_default networks: front_default: external: trueдля меня этот подход был более подходящим, потому что я не владел первым файлом docker-compose и хотел общаться с ним.
обновление: начиная с compose file версии 3.5:
Это теперь работает:
version: "3.5" services: proxy: image: user/image:tag ports: - "80:80" networks: - proxynet networks: proxynet: name: custom_network
docker-compose up -dприсоединится к сети под названием 'custom_network'. Если он не существует, он будет создан!Теперь, вы можете сделать это:
version: "2+" services: web: image: myweb:latest networks: - my-proxy-net networks: my-proxy-net: external: name: custom_networkэто создаст контейнер, который будет находиться во внешней сети.
Я не могу найти никаких ссылок в документах, но это работает!
все контейнеры от
apiможет статьfrontпо умолчанию сеть со следующей конфигурацией:# api/docker-compose.yml ... networks: default: external: name: front_defaultсм. docker compose guide: использование уже существующей сети (см. Внизу)
информация о предыдущих сообщениях верна, но в ней нет сведений о том, как связать контейнеры, которые должны быть подключены как "external_links".
надеюсь, что этот пример делает более ясным для вас:
Предположим, у вас есть app1/docker-compose.yml, с двумя службами (svc11 и svc12) и app2/docker-compose.yml с двумя другими службами (svc21 и svc22) и предположим, что вам нужно подключиться перекрестным образом:
svc11 должен подключение к контейнеру svc22
- svc21 необходимо подключиться к контейнеру svc11.
поэтому конфигурация должна быть такой:
это приложение 1 / docker-compose.yml:
version: '2' services: svc11: container_name: container11 [..] networks: - default # this network - app2_default # external network external_links: - container22:container22 [..] svc12: container_name: container12 [..] networks: default: # this network (app1) driver: bridge app2_default: # external network (app2) external: trueэто app2 / docker-compose.yml:
version: '2' services: svc21: container_name: container21 [..] networks: - default # this network (app2) - app1_default # external network (app1) external_links: - container11:container11 [..] svc22: container_name: container22 [..] networks: default: # this network (app2) driver: bridge app1_default: # external network (app1) external: true
поскольку Compose 1.18 (spec 3.5), вы можете просто переопределить сеть по умолчанию, используя свое собственное имя для всех файлов Compose YAML, которые вам нужны. Это так же просто, как добавить к ним следующее:
networks: default: name: my-appвыше предполагается, что у вас есть
versionзначение3.5(или выше, если они не осуждают его в 4+).другие ответы указали то же самое; это упрощенное резюме.