Связь между несколькими проектами 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+).другие ответы указали то же самое; это упрощенное резюме.