gpt4 book ai didi

docker - 使用 docker-compose 连接到 RabbitMQ 容器

转载 作者:IT老高 更新时间:2023-10-28 21:43:54 31 4
gpt4 key购买 nike

我想在一个容器中运行 RabbitMQ,在另一个容器中运行工作进程。 worker 进程需要访问 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 端口。工作进程使用以下 URL 访问 RabbitMQ:

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

他们在官方教程中使用的是什么,但是 localhost 已被替换为 rabbitmq,因为容器应该是 discoverable with a hostname identical to the container name:

By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.

每当我运行此程序时,我都会收到连接被拒绝错误:

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 指定为主机名。我不是 docker 网络方面的专家,所以也许这是需要的。

如果需要,我很乐意提供更多信息!


编辑

有一个几乎相同的问题 here .我想我需要等到 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

(注意不同的版本)。但是,这不起作用 - 它总是会因为不健康而失败。

最佳答案

啊哈!我修好了它。 @Ijaz 完全正确 - RabbitMQ 服务需要一段时间才能启动,我的工作人员会在它运行之前尝试连接。

我尝试使用延迟,但是当 RabbitMQ 花费的时间比平时更长时,这失败了。

这也表明了一个更大的架构问题——如果队列服务(在我的例子中是 RabbitMQ)在生产期间离线会发生什么?现在,我的整个网站都失败了。需要有一些内置的冗余和轮询。

如上所述 this related answer ,我们可以在 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 容器保持不健康状态。 rabbitmqnc -z localhost 5672 成功时立即变得健康 - 即当排队时!

关于docker - 使用 docker-compose 连接到 RabbitMQ 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53031439/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com