Кластеризация контейнеров docker vernemq, работающих на разных машинах

#docker #docker-compose #mqtt-vernemq

#docker #docker-compose #mqtt-vernemq

Вопрос:

Я надеялся, что это будет легко, просто используя приведенный ниже фрагмент в файле второго экземпляра docker-compose.yml

 - DOCKER_VERNEMQ_DISCOVERY_NODE=<ip address of the first instance> 
  

но, похоже, это не работает.

Журнал второго экземпляра подтверждает, что он пытается кластеризоваться:

 13:56:09.795 [info] Sent join request to: 'VerneMQ@<ip address of the first instance>'
13:56:16.800 [info] Unable to connect to 'VerneMQ@<ip address of the first instance>'
  

В то время как журнал первого экземпляра вообще ничего не показывает.

Из второго экземпляра я могу подтвердить, что конечная точка доступна:

 $ docker exec -it vernemq /bin/sh
$ curl <ip address of the first instance>:44053
curl: (56) Recv failure: Connection reset by peer
  

затем в журнале первого экземпляра я вижу ошибку, которая полностью ожидаема и подтверждает, что я достиг первого экземпляра

 13:58:33.572 [error] CRASH REPORT Process <0.3050.0> with 0 neighbours crashed with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
13:58:33.572 [error] Ranch listener {{172,19,0,2},44053} terminated with reason: bad argument in vmq_cluster_com:process_bytes/3 line 142
  

Возможно, это связано с тем фактом, что IP-адрес, видимый из контейнера docker, является 172.19.0.2 внешним 10. ... .

Также пытался добавить имя хоста первого экземпляра known_hosts в безрезультатно.

Пожалуйста, сообщите.

Я использую erlio / docker-vernemq: 1.10.0

 $ docker --version
Docker version 19.03.13, build 4484c46d9d

$ docker-compose --version
docker-compose version 1.27.2, build 18f557f9
  

Ответ №1:

Мне удалось отсортировать это, создав сеть наложения docker

на machine1: docker swarm init
на machine2: docker swarm join --token ...
на machine1: docker network create --driver=overlay --attachable vernemq-overlay-net

Соответствующие биты моего dockerfile:

 version: '3.6'

services:
  vernemq:
    container_name: ${NODE_NAME:?Node name not specified}
    image: vernemq/vernemq:1.10.4.1
    environment:
      - DOCKER_VERNEMQ_NODENAME=${NODE_NAME:?Node name not specified}
      - DOCKER_VERNEMQ_DISCOVERY_NODE=${DISCOVERY_NODE:-}

networks:
  default:
    external:
      name: vernemq-overlay-net
  

со следующими переменными env:

машина1:

  • NODE_NAME=vernemq1.example.com
  • DISCOVERY_NODE=

machine2:

  • NODE_NAME=vernemq2.example.com
  • DISCOVERY_NODE=vernemq1.example.com

Примечание:
Скорее всего, machine2 не найдет vernemq-overlay-net из-за ошибки в docker-compose, насколько я помню.
В этом случае вы запускаете контейнер с помощью docker: docker run -dit --name alpine --net=vernemq-overlay-net alpine что сделает его доступным для docker-compose .