Соедините два экземпляра docker-compose

У меня есть докеризованное приложение с несколькими службами, работающими с использованием docker-compose. Я хочу связать это приложение с ElasticSearch/Logstash/Kibana (ELK) с помощью другого приложения для создания докеров, docker -лось. Оба они работают на одной и той же докер-машине в разработке. На производстве такого скорее всего не будет.

Как я могу настроить docker-compose.yml моего приложения для ссылки на стек ELK?


person Dag Høidahl    schedule 21.12.2015    source источник
comment
Вы не можете. вам нужно либо использовать сеть вашего хост-компьютера для подключения к приложениям, либо использовать оверлейную сеть с вашей докерной композицией, которая, я считаю, еще недостаточно развита для производственных случаев использования.   -  person Boynux    schedule 21.12.2015


Ответы (4)


Обновление, июнь 2016 г.

Ответ ниже устарел, начиная с докера 1.10. См. этот другой аналогичный ответ для нового решения. https://stackoverflow.com/a/34476794/1556338

Старый ответ

  1. Создайте сеть:

     $ docker network create --driver bridge my-net
    
  2. Укажите эту сеть как переменную среды (${NETWORK}) в файлах docker-compose.yml. Например:

    pg:
      image: postgres:9.4.4
      container_name: pg
      net: ${NETWORK}
      ports:
        - "5432"
    myapp:
      image: quay.io/myco/myapp
      container_name: myapp
      environment:
        DATABASE_URL: "http://pg:5432"
      net: ${NETWORK}
      ports:
        - "3000:3000"
    

Обратите внимание, что pg в http://pg:5432 преобразуется в IP-адрес службы pg (контейнера). Нет необходимости жестко кодировать IP-адреса; Запись для pg автоматически добавляется в /etc/host контейнера myapp.

  1. Вызовите docker-compose, передав ему созданную вами сеть:

    $ NETWORK=my-net docker-compose up -d -f docker-compose.yml -f other-compose.yml
    

Я создал сеть-мост выше, который работает только в пределах одного узла (хоста). Хорошо для разработчиков. Если вам нужно, чтобы два узла общались друг с другом, вам нужно создать оверлейная сеть. Хотя принцип тот же. Вы передаете сетевое имя команде docker-compose up.

person Bernard    schedule 26.12.2015

Вы также можете создать сеть с докером вне вашего docker-compose :

docker network create my-shared-network 

И в вашем docker-compose.yml:

version: '2'
services:
  pg:
    image: postgres:9.4.4
    container_name: pg
    expose:
      - "5432"
networks:
  default:
    external:
      name: my-shared-network

И во втором файле docker-compose.yml:

version: '2'
  myapp:
    image: quay.io/myco/myapp
    container_name: myapp
    environment:
      DATABASE_URL: "http://pg:5432"
    net: ${NETWORK}
    expose:
      - "3000"
networks:
  default:
    external:
      name: my-shared-network

И оба экземпляра смогут видеть друг друга, без открытых портов на хосте, вам просто нужно выставить порты, и там будут видеть друг друга через сеть: «моя-общая-сеть».

person Antoine    schedule 13.04.2017
comment
Требуется ли net: ${NETWORK} во втором файле docker-compose.yml? - person Marcus Ahlberg; 16.02.2020
comment
Если одна из служб должна запускаться раньше другой, как мы можем реализовать link или depend_on. - person Tara Prasad Gurung; 25.08.2020

Взгляните на сеть Docker с несколькими хостами

Сеть — это функция Docker Engine, которая позволяет создавать виртуальные сети и присоединять к ним контейнеры, чтобы вы могли создать топологию сети, подходящую для вашего приложения. Сетевые контейнеры могут даже охватывать несколько хостов, поэтому вам не нужно беспокоиться о том, на каком хосте находится ваш контейнер. Они беспрепятственно взаимодействуют друг с другом, где бы они ни находились, что позволяет использовать настоящие распределенные приложения.

person Rob van Laarhoven    schedule 21.12.2015
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Mel; 21.12.2015
comment
@tmoreau Я согласен. Но этот вопрос слишком широк, тема слишком сложна, чтобы дать краткий ответ. Я удалил ссылку, чтобы ОП мог гуглить. - person Rob van Laarhoven; 21.12.2015
comment
Если вопрос слишком общий, отметьте его как таковой. Ваш ответ может быть комментарием. - person Mel; 21.12.2015
comment
Это вопрос мнения. Ответ слишком общий, а не вопрос. Ответы предназначены для добавления решений к вопросу. Комментарии для добавления важной информации, запроса разъяснений, запроса дополнительной информации и т. д. Несмотря на краткость, ответ может послужить справочным материалом в будущем. - person Rob van Laarhoven; 21.12.2015

Если вы установите предсказуемое имя проекта для первой композиции, вы можете использовать external_links для ссылки на внешние контейнеры по имени из другого файла компоновки.

В следующем выпуске docker-compose (1.6) вы сможете использовать определяемые пользователем сети, и обе композиции будут присоединены к одной и той же сети.

person dnephin    schedule 22.12.2015