Связь между несколькими проектами 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 76

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+).

другие ответы указали то же самое; это упрощенное резюме.

Я бы гарантировал, что все контейнеры docker-compose ' d к той же сети, составляя их вместе в то же время, используя:

docker compose --file ~/front/docker-compose.yml --file ~/api/docker-compose.yml up -d