Подключение к контейнеру RabbitMQ с помощью docker-compose - PullRequest
0 голосов
/ 28 октября 2018

Я хочу запустить RabbitMQ в одном контейнере, а рабочий процесс - в другом.Рабочий процесс должен иметь доступ к RabbitMQ.

Я бы хотел, чтобы этим управляли через docker-compose.

. На данный момент это мой docker-compose.yml файл:

version: "3"

services:

  rabbitmq:
    image: rabbitmq
    command: rabbitmq-server
    expose:
      - "5672"
      - "15672"

  worker:
    build: ./worker
    depends_on:
      - rabbitmq
    # Allow access to docker daemon
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Итак, я показал порты RabbitMQ.Рабочий процесс обращается к RabbitMQ, используя следующий URL:

amqp://guest:guest@rabbitmq:5672/

Это то, что они используют в официальном руководстве, но localhost был заменен на rabbitmq, так как контейнеры должны быть обнаруживается с именем хоста, идентичным имени контейнера:

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

Всякий раз, когда я запускаю это, я получаюошибка соединения отклонена:

Recreating ci_rabbitmq_1 ... done                                                                                                                                                    
Recreating ci_worker_1   ... done                                                                                                                                                    
Attaching to ci_rabbitmq_1, ci_worker_1                                                                                                                                              
worker_1    | dial tcp 127.0.0.1:5672: connect: connection refused                                                                                                                   
ci_worker_1 exited with code 1        

Я нахожу это интересным, поскольку он использует IP 127.0.0.1, который (я думаю) равен localhost, хотя я указал rabbitmq в качестве имени хоста.Я не эксперт по сетевым технологиям, поэтому, может быть, это и нужно.

Я с радостью предоставлю больше информации, если потребуется!


Редактировать

Здесь почти идентичный вопрос здесь .Я думаю, что мне нужно подождать, пока rabbitmq не заработает, прежде чем запускать worker.Я попытался сделать это с помощью проверки работоспособности:

version: "2.1"

services:

  rabbitmq:
    image: rabbitmq
    command: rabbitmq-server
    expose:
      - "5672"
      - "15672"
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "5672" ]
      interval: 10s
      timeout: 10s
      retries: 5

  worker:
    build: .
    depends_on:
      rabbitmq:
        condition: service_healthy

(обратите внимание на другую версию).Однако это не сработает - оно всегда будет неэффективным.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Aha!Я починил это.@Ijaz был полностью прав - служба RabbitMQ запускается некоторое время, и мой работник пытается подключиться до того, как она запустится.

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

Это также указывает на большую архитектурную проблему - что произойдет, если служба очереди (в моем случае RabbitMQ) отключится во время производства?Прямо сейчас, весь мой сайт терпит неудачу.Требуется некоторая встроенная избыточность и опрос.

Как описано в этом этом связанном ответе , мы можем использовать проверки работоспособности в docker-compose 3+:

version: "3"

services:

  rabbitmq:
    image: rabbitmq
    command: rabbitmq-server
    expose:
      - 5672
      - 15672
    healthcheck:
      test: [ "CMD", "nc", "-z", "localhost", "5672" ]
      interval: 5s
      timeout: 15s
      retries: 1

  worker:
    image: worker
    restart: on-failure
    depends_on:
      - rabbitmq

Теперь контейнер worker будет перезапущен несколько раз, в то время как контейнер rabbitmq останется нездоровым.rabbitmq сразу становится здоровым, когда nc -z localhost 5672 успешно - то есть, когда очередь жива!

0 голосов
/ 28 октября 2018

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

Из документации:

Expose Предоставляйте порты без публикации их на хост-компьютере - они будут доступны только для связанных служб.Можно указать только внутренний порт.

expose:
 - "3000"
 - "8000"

Так должно быть так:

version: "3"

services:

  rabbitmq:
    image: rabbitmq
    command: rabbitmq-server
    expose:
      - "5672"
      - "15672"

  worker:
    build: ./worker
    depends_on:
      - rabbitmq
    # Allow access to docker daemon
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

также убедитесь, что соединение с rabitmq выполняется только тогда, когда он готов к работе на серверепорт.

...