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
вы можете видеть, как это круговая.