Я хочу запустить 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
(обратите внимание на другую версию).Однако это не сработает - оно всегда будет неэффективным.