2015-03-24 2 views
10

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

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

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

Циркулярный импорт между cs и vbc и aa и sr.

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

Часть Докер-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 
+2

Вы могли бы рассмотреть вопрос об использовании сервиса реестра, например, consul https://github.com/progrium/docker-consul и автоматического регистратора для ваших контейнеров, таких как https://registry.hub.docker.com/u/progrium/registrator/. С помощью этих компонентов вы можете зарегистрировать свои контейнеры в консуле, и каждый контейнер должен будет прочитать необходимую информацию от консула, исключив круговые зависимости. Добавляет больше сложности, хотя. – christian

ответ

8

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

Круговое сшивания фиксируются в PR # 1676

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

Networking в Compose

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

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

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

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

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

  1. АГЕНТОВ создается myapp.
  2. Контейнер создается с использованием конфигурации web. Он присоединяется к сети myapp под названием web.
  3. Контейнер создается с использованием конфигурации db. Он присоединяется к сети myapp под названием db.

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

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

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

+2

Удивительный, с нетерпением жду этого! – Jesse

0

Это в ваших связей:

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

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

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

+0

Да, я знаю, что эта проблема связана с привязкой. Тем не менее, в моем одиночном файле-докере-файле для «правильного использования всех» для начальной загрузки среды разработки это желаемое зло. Целью этого вопроса было выяснить, как это сделать. – Jesse

+0

Почему вы хотите связать их вместе? Это для общения? Если это так, то у вас есть несколько вариантов: 1. Контейнеры посла 2. Прокси между ними (я предпочитаю это лично) 3. Несколько других проектов, которые пытаются связать удаленные контейнеры. – Michael

2

Теперь v2 определение Докер-Compose файлы, все услуги предоставляются между ними без необходимости в разделе ссылки.

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

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

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

Это ваш докер-Compose файл в 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 
Смежные вопросы