Почему я не могу получить доступ к сервису в Docker Swarm по его имени или VIP?

Итак, у меня есть механизм докера (версия 1.12.6, сборка 78d1802), работающий на хосте Ubuntu.

Я создал рой, используя

docker swarm init --advertise-addr 192.168.1.2

У меня есть локально предварительно созданный образ, с помощью которого я создаю службу с именем nodeapp следующим образом.

docker service create --name nodeapp --publish 3000:3000 --replicas 2 node-app-image

Теперь, когда я набираю curl localhost:3000, я получаю ожидаемый правильный ответ, и до этого момента все работает.

Это document и многие другие, на которые я ссылался, похоже, предполагают, что docker v1.12.x имеет встроенную балансировку нагрузки/маршрутизацию с помощью методов DNS или VIP.

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

curl nodeapp:3000 на что я получаю curl: (6) Could not resolve host: nodeapp

а также

curl 10.255.0.6:3000 на что я получаю curl: (7) Failed to connect to 10.255.0.6 port 3000: Connection timed out

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

docker service inspect --format {{.Endpoint.VirtualIPs}} nodeapp что дает [{boq3g7s47w47q2ej56li9s3dw 10.255.0.6/16}]

Почему я не могу получить доступ к своей службе, используя VIP или имя службы, хотя я могу получить к ней доступ, используя localhost:3000?


person Harindaka    schedule 16.04.2017    source источник


Ответы (1)


На этой странице:

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

Таким образом, похоже, что разрешение DNS будет работать только между контейнерами, а не на хосте (по крайней мере, по умолчанию, я предполагаю, что будет способ настроить DNS на хосте для разрешения этих служб).

Например, создайте службу с запущенным nginx:

docker service create \
  --replicas 3 \
  --name my-web \
  --network my-network \
  nginx

Посмотреть услугу:

$ docker service ps my-web

NAME                                IMAGE  NODE   DESIRED STATE  CURRENT STATE               ERROR
my-web.1.63s86gf6a0ms34mvboniev7bs  nginx  node1  Running        Running 58 seconds ago
my-web.2.6b3q2qbjveo4zauc6xig7au10  nginx  node2  Running        Running 58 seconds ago
my-web.3.66u2hcrz0miqpc8h0y0f3v7aw  nginx  node3  Running        Running about a minute ago

Создайте новый сервис/контейнер:

$ docker service create \
  --name my-busybox \
  --network my-network \
  busybox \
  sleep 3000

Посмотреть контейнер:

$ docker service ps my-busybox

NAME                                    IMAGE    NODE   DESIRED STATE  CURRENT STATE          ERROR
my-busybox.1.1dok2cmx2mln5hbqve8ilnair  busybox  node1  Running        Running 5 seconds ago

Войдите в контейнер:

$ docker exec -it my-busybox.1.1dok2cmx2mln5hbqve8ilnair /bin/sh

Изнутри контейнера вы можете разрешить службу nginx:

$ nslookup my-web

Server:    127.0.0.11
Address 1: 127.0.0.11

Name:      my-web
Address 1: 10.0.9.2 ip-10-0-9-2.us-west-2.compute.internal
person John    schedule 16.04.2017
comment
Спасибо @Джон. Это помогает мне понять проблему. Хорошо, если кто-то еще может пролить свет на то, как выставить рой извне с помощью одного IP-адреса или DNS, аналогично тому, как будет работать обычная настройка балансировки нагрузки, но без статического связывания каких-либо рабочих узлов (т.е. в файле конфигурации nginx), принимая во внимание, что мы можем запустить команды docker service scale и docker swarm join для масштабирования, когда решение также должно автоматически включать новые узлы. Это вообще возможно? - person Harindaka; 16.04.2017
comment
Интересно, поможет ли это github.com/vfarcic/docker-flow-proxy - person Harindaka; 16.04.2017
comment
Docker swarm networking автоматически балансирует нагрузку на реплики сервисов, что касается статического связывания, это как раз и есть цель dns. Существует разница между экспозицией с API-интерфейсом запуска и API-интерфейсом службы, то, что вы хотите делать в рое, это не экспозиция, а публикация их. Посмотрите на эту страницу – › docs.docker.com/docker-cloud/apps/ports - person Dani; 17.04.2017