#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 .