Docker Составление круговой контейнерной связи

Я пытаюсь контейнеризовать нашу среду разработки с помощью docker. Это включает в себя сочетание проектов Google Appengine, а также сервисов, которые в конечном итоге размещаются в движке Google Compute в контейнере vm.

В наших сценариях начальной загрузки среды разработки elasticsearch и nginx в boot2docker, а другие приложения запускаются на localhost: {порт продукта} в изолированной песочнице dev_appserver appengine. Этот процесс трудно справиться и поддерживать, поскольку он требует большого понимания того, как наши приложения обмениваются данными.

Я получаю сообщение об ошибке с docker-compose, которая обнаруживает циклическую зависимость между контейнерами.

Циклический импорт между cs и vbc и aa и sr.

Поскольку эта конфигурация предназначена только для сред разработки (mac osx), у кого-нибудь есть предложения или идеи по другому подходу, которые нужно предпринять при объединении всех зависимостей между наборами продуктов.

Часть файла docker-compose.yml:

elasticsearch:
  build: ./compute/containers/elasticsearch/elasticsearch
  ports:
    - "9200:9200"
  environment:
    - PROJECT_ID=localhost
nginx:
  build: ./compute/containers/elasticsearch/nginx
  links:
    - elasticsearch:localhost
  ports:
    - "9201:9201"
cs:
  build: ./CS
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8080 --admin_port=9080 --storage_path=/data/
  ports:
    - "8080:8080"
    - "9080:9080" 
  volumes:
   - /Users/source/CS/src:/src
   - /Users/source/CS/data:/data 
aa:
  build: ./AA
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8081 --admin_port=9081 --storage_path=/data/
  links:
    - vbc:vbc-local
    - st:st-local
    - elasticsearch:localhost    
  ports:
    - "8081:8081"
    - "9081:9081" 
  volumes:
   - /Users/source/AA/src:/src
   - /Users/source/AA/data:/data 
vbc:
  image: google/cloud-sdk
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8082 --admin_port=9082 --storage_path=/data/
  links:
    - cs:cs-local
    - sr:sr-local
    - sm:sm-local
    - ms:ms-local
    - st:st-local    
    - cis:cis-local
    - elasticsearch:localhost
  ports:
    - "8082:8082"
    - "9082:9082" 
  volumes:
   - /Users/source/VBC/src:/src
   - /Users/source/VBC/data:/data    
sr:
  build: ./SR
  command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8083 --admin_port=9083 --storage_path=/data/
  links:
    - cs:cs-local  
    - aa:aa-local      
  ports:
    - "8083:8083"
    - "9083:9083" 
  volumes:
   - /Users/source/SR/src:/src
   - /Users/source/SR/data:/data 

Ответ 1

Вскоре вы сможете использовать следующее решение.

Круговая ссылка фиксируется в PR # 1676

Это, как они решают эту проблему. Проще говоря, они собираются сделать контейнеры способными говорить друг с другом без ссылки. Я добавил обновления к документации Docker Compose ниже:

Работа в сети

По умолчанию Compose устанавливает единую сеть по умолчанию для вашего приложения. Каждый контейнер для службы присоединяется к сети по умолчанию и может быть обнаружен через DNS под именем службы.

Примечание. В вашей сети приложений указано то же имя, что и имя проекта, которое основано на имени каталога, в котором он находится. См. документы CLI о том, как переопределить его.

Например, предположим, что ваше приложение находится в каталоге с именем myapp, а ваш docker-compose.yml выглядит так:

web:
  build: .
  ports:
    - "8000:8000"
db:
  image: postgres

При запуске docker-compose up происходит следующее:

  • Создана сеть с именем myapp.
  • Контейнер создается с использованием конфигурации web. Он присоединяется к сети myapp под именем web.
  • Контейнер создается с использованием конфигурации db. Он присоединяется к сети myapp под именем db.

Каждый контейнер теперь может искать имя хоста web или db и возвращать соответствующий IP-адрес контейнера. Например, web код приложения мог подключиться к URL postgres://db:5432 и начать использовать базу данных Postgres.

Поскольку web явно отображает порт, он также доступен из внешнего мира через порт 8000 на вашем сетевом интерфейсе хост-сервера Docker.

Дальнейшее чтение экспериментального сетевого интерфейса Docker: https://github.com/docker/docker/blob/master/experimental/networking_api.md

Ответ 2

Теперь с определением файлов docker-compose файлов, все сервисы доступны между ними без необходимости в разделе ссылок.

Вы можете напрямую запросить имя службы от каждого к каждому (включая сервис для себя). Поэтому, если вы хотите сделать запрос от cs к vbc, вы просто curl vbc.

Также возможно определить услугу с пользовательским именем домена, объявляющим ключ hostname в разделе обслуживания файла документации docker.

Если вы хотите увидеть больше, сетевой апи уже не является экспериментальным: https://github.com/docker/compose/blob/master/docs/networking.md

Это ваш файл для сборки докеров в v2 без лишних ссылок:

version: '2'

services:
  elasticsearch:
    build: ./compute/containers/elasticsearch/elasticsearch
    ports:
      - "9200:9200"
    environment:
      - PROJECT_ID=localhost
  nginx:
    build: ./compute/containers/elasticsearch/nginx
    ports:
      - "9201:9201"
  cs:
    build: ./CS
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8080 --admin_port=9080 --storage_path=/data/
    ports:
      - "8080:8080"
      - "9080:9080" 
    volumes:
     - /Users/source/CS/src:/src
     - /Users/source/CS/data:/data 
  aa:
    build: ./AA
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8081 --admin_port=9081 --storage_path=/data/
    ports:
      - "8081:8081"
      - "9081:9081" 
    volumes:
     - /Users/source/AA/src:/src
     - /Users/source/AA/data:/data 
  vbc:
    image: google/cloud-sdk
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8082 --admin_port=9082 --storage_path=/data/
    ports:
      - "8082:8082"
      - "9082:9082" 
    volumes:
     - /Users/source/VBC/src:/src
     - /Users/source/VBC/data:/data    
  sr:
    build: ./SR
    command: dev_appserver.py /src/ --host=0.0.0.0 --admin_host=0.0.0.0 --port=8083 --admin_port=9083 --storage_path=/data/
    ports:
      - "8083:8083"
      - "9083:9083" 
    volumes:
     - /Users/source/SR/src:/src
     - /Users/source/SR/data:/data 

Ответ 3

В вашей ссылке:

sr requires aa
aa requires vbc
vbc requires sr
sr requires aa

sr requires cs
sr requires vbc
vbc requires sr
vbc requires cs

вы можете видеть, как это круговая.