Подтвердить что ты не робот

Связь между несколькими проектами, создающими докер

У меня есть два отдельных файла 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, могут общаться друг с другом?
4b9b3361

Ответ 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

Это создаст контейнер, который будет во внешней сети.

Я не могу найти никаких ссылок в документах, но это работает!

Ответ 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):

  1. Запустите первый проект docker-compose с помощью up -d
  2. Найдите сетевое имя первого docker-compose: docker network ls (содержит имя проекта корневого каталога)
  3. Затем используйте это имя по этой структуре ниже во втором файле 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