2016-08-10 1 views
1

У меня есть несколько докеров-контейнеров, которые будут работать вместе отлично на одной машине. Один привязывается к порту 80, другой подключается к контейнеру neo4j, который также развернут. Остальные для межконтейнерной работы (я их не строил, но я должен их разместить). У меня есть настройка док-станции с докером-движком 1.12 и кластером progrium/consul на трех машинах в рое. Консольный кластер может видеть все контейнеры, и они работают при использовании только запуска -d (на каждом отдельном хосте, как указано). Как только я вывожу их из «службы», они больше не могут общаться. Я попытался создать новую оверлейную сеть, но это не повлияло.докер-контейнер против ройной связи вопрос

Я также попытался запустить один контейнер, который связывается с портом 80 как отдельный контейнер на всех системах, где остальные работают как службы. Проверка Docker показывает их все в той же сети 172.17.0.0.

Я действительно мог бы использовать некоторые идеи о том, что посмотреть. Благодарю.


Во-первых, я загрузить Neo4j с:

docker run -d -p 192.168.2.201:7474:7474 \ 
    --volume=$HOME/neo4j/data:/data neo4j:3.0 

Затем последующие контейнеры присоединения к консулом кластера на DOCKER рой с помощью:

docker run -d -e "CONSULJOIN=172.17.0.2" -e "NEO4J_HOST=172.17.0.4" \ 
    -e "NEO4J_PASSWORD=$NEO4J_PASS" container 

Когда вместо docker run -d я использую docker create service, ожидание заключается в том, что если я заменил IP-адрес neo4j на 192.168.2.201, он должен работать.

Я также попытался с помощью наложенных сетей:

docker network create -d overlay my-net 

И включил --net = мою-сеть в команде докера службы. Я не знаю, когда у меня будет время для дальнейшего отладки, но если этого достаточно, чтобы хотя бы сказать мне, что я сделал неправильно, это было бы здорово. Если нет, я попытаюсь получить дополнительную информацию по мере того, как позволяет время.

+0

Включите в себя команды, которые вы используете, включая команды создания сети и службы, а также любой вывод отладки. – BMitch

+0

Таким образом, эти системы находятся на внутренних виртуальных машинах. Во-первых, я загружаю neo4j с помощью: docker run -d -p 192.168.2.201:7474:7474 --volume = $ HOME/neo4j/data:/data neo4j: 3.0. Затем последующие контейнеры соединяют кластер consul на рое докеров, используя: docker run -d -e «CONSULJOIN = 172.17.0.2» -e «NEO4J_HOST = 172.17.0.4» -e «NEO4J_PASSWORD = $ NEO4J_PASS» контейнер. Когда вместо запуска docker -d я использую службу создания докеров, ожидается, что если я заменил IP-адрес neo4j на 192.168.2.201, он должен работать. К сожалению, я должен также указать, что, хотя я уже некоторое время в администрации Linux, я новичок в докере. –

+0

Я обновил вопрос с вашим комментарием выше. Не могли бы вы также отредактировать с помощью команды создания сети, которую вы пытались сделать? Под обложками Docker создает мостовые сети и контролирует доступ с помощью iptables, поэтому вы можете использовать стандартный набор инструментов Linux для отладки. Подключитесь к оболочке bash в любом контейнере с помощью 'docker exec -it /bin/bash' для дальнейшей отладки. – BMitch

ответ

2

Вы не должны указывать IP-адрес для поиска службы в кластере. Он может быть на любой машине в кластере, если вы не добавите ограничений, чтобы разместить его на определенной машине.

После создания сетевого наложения вы можете ссылаться на службы по имени контейнера/службы, а не на определенный IP-адрес. Например, выполните простой пример перед тем, как перейти к вашему приложению.

Это предполагает, что вы создали свой рой кластер уже:

создать сеть накладку

docker network create --driver overlay my-app-network 

начать простую REDIS Service

docker service create --replicas 1 --network my-app-network \ 
    --name demo-redis redis 

создать фиктивную службу что мы запишемся для дальнейшего изучения:

docker service create --replicas 1 --network my-app-network \ 
--name demo-alpine alpine /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 10; done" 

Примечание: На данный момент мы создали контейнер, который на самом деле не делать ничего, но мы будем каротажного в него, чтобы мы могли исследовать в интерактивном режиме, чтобы увидеть, что происходит.

найти узел службы демо-альпийской запущенную на

docker service ps demo-alpine #this will report which node is running the container 

SSH в узел, который работает демо-альпийский и прикрепить к нему это оболочке

docker ps #lists all the running containers on that node, find the container ID of demo-alpine 

docker exec -i -t <container id> /bin/sh 

#install python,pip and redis(for python) in your demo-alpine container 
apk update 
apk add python 
apk add py-pip 
pip install redis 

создать скрипт, чтобы нажать на ваш redis-сервис с помощью имени контейнера/службы vi test.py и вставить что-то вроде этого:

import redis 
import time 

loopy = True 

while loopy == True: 
    # I'm creating the connection each time so we can see the change when we scale the Redis service 
    # and the new service is brought online; connections should start rotating through the scaled Redis servers. 
    # If one uses a Redis connection scoped outside of the loop then it would remain connected to the first Redis 
    # service and we wouldn't see the new one come online. 

    r = redis.StrictRedis(host='demo-redis', port=6379, db=0) 
    r.incr('counter') 
    print(r.get('counter')) 
    time.sleep(3) 

запустить скрипт из вашего демо-альпийского контейнера

python test.py 

Обратите внимание, что я сослалась на службе REDIS его контейнер имени/услуг не IP, как это может быть в любом месте на кластере. Вы должны начать видеть, что приращенные значения печатаются на экране.

Для дополнительного удовольствия, если он работает для вас, масштабируйте сервис redis, чтобы увидеть его масштаб для уже запущенного сценария Python.

SSH в узел менеджера из другой терминальной сессии, так что вы не остановить ваш демо-альпийский сессия

docker service scale demo-redis=3 

Вы должны начать видеть новое приращение значения печати на экран из вновь масштабируется службы REDIS и кластер должен объединять запросы к каждому вновь созданному сервису redis. Синхронизация этих данных - еще одна история, но это не было целью быстрой демонстрации.

На этом этапе вы сможете вернуться к своему приложению и заставить его работать на вашем кластере. Возможно, вам придется изменить свой код, чтобы ссылаться на имена контейнеров, а не на IP-адреса, но это точка его запуска в кластере; это может быть где угодно.

+1

Спасибо! Мы проанализируем это и попытаемся изменить способ обращения к другим контейнерам.Я старая школа, парень из монолитных систем, поэтому просто нужно немного заманить голову вокруг контейнерного способа делать что-то. –

+0

Мое удовольствие. Я всегда оцениваю относительно сквозной пример, поскольку он облегчает переход к последующему, чтобы интегрировать свою собственную работу после прохождения простого примера. Обратите внимание, что я только что исправил ошибку в последнем заявлении, которое масштабирует службу. Я изначально вывел вывод команды, а не команды, - теперь она исправлена. Я также написал это в моей учетной записи Github и планирую расширить его. https://github.com/ctownsen357/docker-swarm-demo –

Смежные вопросы