Сюрпризы от Erlang и Docker-compose

Преамбула

Есть такая интересная штука, как RabbitMQ. Написана на Erlang (это важно). В Docker запускается с пол-пинка, в кластер собирается тремя с половиной командами. Это если всё делать вручную по инструкции. Сразу скажу, корректные FQDN серверов и контейнеров — обязательное условие работоспособности.

Запускаем на первом сервере первую ноду будущего кластера:

docker run -dit -h docker-rabbitmq-01.domain.tld               \
           --name rabbit                                       \
           -p "4369:4369"                                      \
           -p "5671:5671"                                      \
           -p "15671:15671"                                    \
           -p "25672:25672"                                    \
           -p "35197:35197"                                    \
           -e "RABBITMQ_ERLANG_COOKIE=S0meL3ttersAndNumber5"   \
           -v rabbitmq_data:/var/lib/rabbitmq                  \
           -v /opt/ssl:/opt/ssl:ro                             \
           --restart unless-stopped                            \
           zimniy/rabbitmq:latest

Сразу определяем политику HA (запускаем также на первом сервере):

docker exec rabbit rabbitmqctl set_policy ha-all ".*" '{"ha-mode":"all", "ha-sync-mode": "automatic"}'

Запускаем на втором сервере вторую ноду будущего кластера:

docker run -dit -h docker-rabbitmq-02.domain.tld               \
           --name rabbit                                       \
           -p "4369:4369"                                      \
           -p "5671:5671"                                      \
           -p "15671:15671"                                    \
           -p "25672:25672"                                    \
           -p "35197:35197"                                    \
           -e "RABBITMQ_ERLANG_COOKIE=S0meL3ttersAndNumber5"   \
           -v rabbitmq_data:/var/lib/rabbitmq                  \
           -v /opt/ssl:/opt/ssl:ro                             \
           --restart unless-stopped                            \
           zimniy/rabbitmq:latest

Со второго сервера подключаем вторую ноду к первой:

docker exec rabbit rabbitmqctl stop_app
docker exec rabbit rabbitmqctl join_cluster rabbit@docker-rabbitmq-01.domain.tld
docker exec rabbit rabbitmqctl start_app

Всё, кластер собран и уже работает. Можно подключаться с учёткой guest:guest.

Фабула

Короче, теперь про то, какая гадость этот docker-compose…

Оказывается, у него есть два параметра: hostname и domainname.

И если задать только hostname как FQDN «docker-rabbitmq-01.domain.tld», то оно в контейнере обрезается до «docker-rabbitmq-01». Так что нужно обязательно задать ещё и domainname «domain.tld» иначе Erlang, на котором написан RabbitMQ, свой FQDN не определит и будет игнорировать попытки подключения.

В общем, используя docker-compose, нужно делать так:

docker-rabbitmq:
  image: zimniy/rabbitmq:latest
  container_name: rabbit
  hostname: docker-rabbitmq-01.domain.tld 
  domainname: domain.tld
  restart: unless-stopped
  ports:
    - "4369:4369"
    - "5671:5671"
    - "15671:15671"
    - "25672:25672"
    - "35197:35197"
  volumes:
    - "/opt/ssl:/opt/ssl:ro"
    - "rabbitmq_data:/var/lib/rabbitmq"

Внимание, hostname задать именно как FQDN.

И, для того, чтобы это выяснить, пришлось аж в исходники лезть…