Связь между несколькими проектами, создающими докер
У меня есть два отдельных файла docker-compose.yml
в двух разных папках:
-
~/front/docker-compose.yml
-
~/api/docker-compose.yml
Как я могу убедиться, что контейнер front
может отправлять запросы к контейнеру в api
?
Я знаю, что параметр --default-gateway
может быть установлен с помощью docker run
--default-gateway
для отдельного контейнера, так что этому контейнеру может быть назначен определенный IP-адрес, но кажется, что этот параметр недоступен при использовании docker-compose
.
В настоящее время я заканчиваю тем, что выполняю docker inspect my_api_container_id
и смотрю шлюз в выходных данных. Это работает, но проблема в том, что этот IP-адрес присваивается случайным образом, поэтому я не могу на него полагаться.
Таким образом, другой формой этого вопроса может быть:
- Могу ли я присвоить фиксированный IP-адрес конкретному контейнеру с помощью docker-compose?
Но в итоге я присматриваю за:
- Как два разных проекта, создаваемых в Docker, могут общаться друг с другом?
Ответы
Ответ 1
Вам просто нужно убедиться, что контейнеры, с которыми вы хотите общаться друг с другом, находятся в одной сети. Сети являются первоклассной конструкцией докера и не являются специфическими для создания.
# 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_
Затем они могут общаться друг с другом, используя имя службы. С front
вы можете сделать ping api
и наоборот.
Ответ 2
Просто небольшое замечание к @johnharris85 отличный ответ: когда вы запускаете файл компоновки Docker, создается сеть по default
так что вы можете просто добавить ее в другой файл компоновки как внешнюю сеть:
# 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, и я хотел с ним связаться.
Ответ 3
ОБНОВЛЕНИЕ: Начиная с версии файла 3.5:
Теперь это работает:
version: "3.5"
services:
proxy:
image: hello-world
ports:
- "80:80"
networks:
- proxynet
networks:
proxynet:
name: custom_network
docker-compose up -d
присоединится к сети под названием "custom_network". Если его не существует, он будет создан!
[email protected]:~# docker-compose up -d
Creating network "custom_network" with the default driver
Creating root_proxy_1 ... done
Теперь вы можете сделать это:
version: "2"
services:
web:
image: hello-world
networks:
- my-proxy-net
networks:
my-proxy-net:
external:
name: custom_network
Это создаст контейнер, который будет во внешней сети.
Я не могу найти никаких ссылок в документах, но это работает!
Ответ 4
Все контейнеры из api
могут присоединиться к front
сети по умолчанию со следующим конфигом:
# api/docker-compose.yml
...
networks:
default:
external:
name: front_default
См. Руководство по созданию докера: использование предварительно существующей сети (см. Внизу)
Ответ 5
Информация о предыдущих сообщениях верна, но в ней нет сведений о том, как связать контейнеры, которые должны быть подключены как "внешние_связи".
Надеемся, что этот пример станет более понятным для вас:
-
Предположим, что у вас есть app1/docker-compose.yml с двумя службами (svc11 и svc12) и app2/docker-compose.yml с двумя дополнительными услугами (svc21 и svc22), и предположим, что вам нужно подключиться скрещенный способ:
-
svc11 необходимо подключиться к контейнеру svc22
- svc21 необходимо подключиться к контейнеру svc11.
Итак, конфигурация должна быть такой:
это app1/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
Ответ 6
Начиная с Compose 1.18 (спецификация 3.5), вы можете просто переопределить сеть по умолчанию, используя собственное имя для всех необходимых вам файлов Compose YAML. Это так же просто, как добавить к ним следующее:
networks:
default:
name: my-app
Выше предполагается, что у вас установлена version
3.5
(или выше, если они не устарели в 4+).
Другие ответы указывают на то же самое; это упрощенное резюме.
Ответ 7
Я бы обеспечил, чтобы все контейнеры docker-compose
'd в одну и ту же сеть, объединив их вместе, используя:
docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d
Ответ 8
version: '2'
services:
bot:
build: .
volumes:
- '.:/home/node'
- /home/node/node_modules
networks:
- my-rede
mem_limit: 100m
memswap_limit: 100m
cpu_quota: 25000
container_name: 236948199393329152_585042339404185600_bot
command: node index.js
environment:
NODE_ENV: production
networks:
my-rede:
external:
name: name_rede_externa
Ответ 9
Для использования другой сети docker-compose вы просто делаете это (чтобы разделить сети между docker-compose):
- Запустите первый проект docker-compose с помощью
up -d
- Найдите сетевое имя первого docker-compose:
docker network ls
(содержит имя проекта корневого каталога)
- Затем используйте это имя по этой структуре ниже во втором файле docker-compose.
второй docker-compose.yml
version: '3'
services:
service-on-second-compose: # Define any names that you want.
.
.
.
networks:
- <put it here(the network name that comes from "docker network ls")>
networks:
- <put it here(the network name that comes from "docker network ls")>:
external: true