2016-12-01 10 views
8

Я пытаюсь выяснить, как правильно использовать режим роя в Docker. Сначала я попробовал запустить контейнеры на двух рабочих и диспетчерских машинах без указания настраиваемой сети (так что я использую сетевую оверлейную сеть по умолчанию). Однако, если я использую входящую сеть, по какой-то причине я не могу разрешить tasks.myservice.Docker swarm с пользовательской сетью

Так что я попытался настройки пользовательской сети, как это:

docker network create -d overlay elasticnet 

Так что теперь, когда я bash в одном из контейнеров, я могу успешно решить tasks.myservice, но я больше не могу получить доступ к порту я определил в моем сервисе создание под --publish извне (что я мог, когда я использовал входящую сеть).

Есть ли способ либо:

  1. Используйте сеть ингресс и быть в состоянии решить tasks.myservice или любой другой DNS-запись, которая будет направлять на все мои контейнеры обслуживания?

  2. Или, используя пользовательскую сеть, но --publish портов правильно, чтобы я мог получить к ним доступ извне?

EDIT

Это, как я создаю мою службу,

Без пользовательских сетей:

docker service create --replicas 3 --label elasticsearch --endpoint-mode vip --name elastic -e ES_HOSTS="tasks.elastic" --publish 9200:9200 --mount type=bind,source=/tmp/es,destination=/usr/share/elasticsearch/config --update-delay 10s es:latest 

С пользовательской сетью:

docker service create --replicas 3 --network elasticnet --label elasticsearch --endpoint-mode vip --name elastic -e ES_HOSTS="tasks.elastic" --publish 9200:9200 --mount type=bind,source=/tmp/es,destination=/usr/share/elasticsearch/config --update-delay 10s es:latest 
+0

Можете ли вы опубликовать список всех команд, которые вы используете, пожалуйста? И пользовательская оверлейная сеть - это путь. – johnharris85

+0

@ johnharris85 См. Мое редактирование. –

ответ

0

Что нам не хватает здесь, это определение вашего сервиса, или вы используете только хороший старинный модный докер при определении своих контейнеров.

Если вы использовали функцию докера (заказывается в докер 1.12), можно еще выставить свои порты службой

docker create --name nodejs1 --network anti-spam -p 1230:123 --replicas 1 image:version 

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

Публикация по-прежнему будет работать на рое, но каждый хост будет слушать порт 1230, а затем проложить маршрут в один из контейнеров.

+1

См. Мое редактирование. Дело в том, что когда я использую '-p 1230: 123', не означает ли это, что порт 1230 должен быть доступен извне? Если да, я не могу получить эту часть для работы с настраиваемой сетью. –

1

Посмотрите на примере ниже:

1.Create определяется пользователем сети оверлей:

sudo docker network create overlay1 --driver overlay 
9g4ipjn513iy  overlay1   overlay    swarm 

2.Run услугу с открытыми портами и 3 репликами:

sudo docker service create --name nginx --replicas 3 --publish 80:80 --network overlay1 nginx 

Вы не необходимо указать endpoint-mode, если вы собираетесь использовать VIP, его по умолчанию.

sudo docker service ps nginx 
ID       NAME  IMAGE NODE DESIRED STATE CURRENT STATE   ERROR 
dbz8b4jjfp6xg3vqunt1x8shx nginx.1 nginx dg1 Running  Running 13 minutes ago 
9d8zr6zka0sp99vadr8eqq2t2 nginx.2 nginx dg3 Running  Running 13 minutes ago 
cwbcegunuxz5ye9a8ghdrc4fg nginx.3 nginx dg3 Running  Running 12 minutes ago 

3.Verification: Испытание Видимая порта от одного из узлов:

[email protected]:~$ telnet localhost 80 
Trying ::1... 
Connected to localhost. 
Escape character is '^]'. 

Испытание подвергается порт от внешнего хоста:

[email protected] /home/balrog% telnet dg1 80 
Trying 172.30.135.101... 
Connected to 172.30.135.101. 
Escape character is '^]'. 

Тестирование DNS поиска из внутри контейнеров:

sudo docker exec -it 05d05f934c68 /bin/bash 
[email protected]:/# ping nginx                                   
PING nginx (10.0.0.3): 56 data bytes 
64 bytes from 10.0.0.3: icmp_seq=0 ttl=64 time=0.050 ms 
64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=0.121 ms 

[email protected]:/# ping tasks.nginx 
PING tasks.nginx (10.0.0.5): 56 data bytes 
64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=0.037 ms 
64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=0.149 ms 

ElasticSearch Конкретное Предложение:

Elasticseach имеет свой собственный кластер, который обеспечивает Failover и Loadbalancing функции.

Вы можете использовать shards и replicas за index в каталогах elasticsearch, которые являются частью кластера elasticsearch.

Это, как говорится, я предлагаю вам создать 3 Services с 1 replica каждый, а затем присоединиться затем в elasticsearch кластера, а затем создать indexes с 3 shards и 3 replicas. У вас будет loadbalancing и failover в кластере поиска elasticsearch.

Чтобы узнать больше о shards, Use this.

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