Сбой проверки здоровья консула на локальной машине - PullRequest
2 голосов
/ 01 июня 2019

У меня Консул работает через докер, используя docker-compose

version: '3'

services:  
  consul:
    image: unifio/consul:latest
    ports:
      - "8500:8500"
      - "8300:8300"
    volumes: 
      - ./config:/config
      - ./.data/consul:/data
    command: agent -server -data-dir=/data -ui -bind 0.0.0.0 -client 0.0.0.0 -bootstrap-expect=1
  mongo:
    image: mongo
    ports:
      - "27017:27017"
      - "27018:27018"
    volumes:
      - ./.data/mongodb:/data/db
    command: mongod --bind_ip_all

и служба nodejs, работающая на порту 6001, которая предоставляет конечную точку /health для проверок работоспособности. Я могу зарегистрировать услугу через этот консул пакет . Однако, посещая интерфейс консула, я вижу, что служба имеет статус failing, поскольку проверка работоспособности не работает.

Пользовательский интерфейс показывает это сообщение:

Get http://127.0.0.1:6001/health: dial tcp 127.0.0.1:6001: getsockopt: connection refused

Не уверен, почему не работает точно, но я чувствую, что, возможно, неправильно настроил консула. Любая помощь будет великолепна.

Ответы [ 2 ]

2 голосов
/ 01 июня 2019

В то время как ответ Zeitounator совершенно в порядке и отвечает на ваш прямой вопрос, «косвенным» решением вашей проблемы было бы управление службой nodejs через docker-compose.

ИМХО, это хорошая идея, чтобы управлять всеми услугами, задействованными с помощью одного и того же инструмента, как тогда их жизненные циклы выровнены, а также легко настроить их, чтобы говорить друг к другу (по крайней мере, это так для docker-compose).

Кроме того, предоставление контейнерам доступа к службам на хосте рискованно с точки зрения безопасности. В производственных средах вы обычно хотите защитить хост-сервисы от контейнеров, в противном случае контейнеры теряют свою роль «сдерживания».

Итак, в вашем случае вам нужно добавить службу nodejs в docker-compose.yml:

services:
  (...)
  nodejs-service:
    image: nodejs-service-image
    ports:
    - "6001:6001" [this is only required if you need to expose the port on the host]
    command: nodejs service.js

И тогда ваша консульская служба сможет получить доступ к nodejs-service через http://nodejs-service:6001/health.

2 голосов
/ 01 июня 2019

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

Вам необходимо использовать IP-адрес хоста, который известен вашему контейнеру (и, конечно, убедитесь, что ваш сервис доступен ипрослушивание этого конкретного IP).

В большинстве случаев вы должны иметь возможность связаться с вашим хостом из контейнера через docker0 IP-мост по умолчанию, который вы можете получить с помощью ip addr show dev docker0 с вашего хоста, как указано в этом другом ответе .

Лучшее решение IMO - обнаружить шлюз, используемый вашим контейнером, который будет указывать на конкретный IP-адрес моста на вашем хосте (т. Е. Мост, созданный для вашего докера-составить проект при его запуске).Существует несколько методов, которые вы можете использовать для обнаружения этого ip из контейнера в зависимости от установленного инструментария и вашего вкуса linux.

...