我想在一个容器中运行 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端口。工作进程使用以下URL访问RabbitMQ:
amqp://guest:guest@rabbitmq:5672/
这是他们在官方教程中使用的,但是localhost
已被替换为Rabbitmq
,因为容器应该可以使用与容器名称相同的主机名来发现:
默认情况下,“合成”会为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且对于该网络上的其他容器都是可到达的,并且可以通过与容器名称相同的主机名被它们发现。
每当我运行这个,我得到一个连接拒绝错误:
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<code>127.0.0.1,我认为它是<code>本地主机,尽管我指定<code>rabbitmq作为主机名。我不是docker网络方面的专家,所以也许这是我想要的。
如果需要,我很乐意提供更多信息!
编辑
这里有一个几乎相同的问题。我认为我需要等到 rabbitmq
启动并运行后再开始工作
。我尝试使用运行状况检查执行此操作:
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
(注意不同的版本)。然而,这是行不通的——因为不健康,它总是会失败。
如果您只是从另一个容器访问服务,也许您不需要暴露/映射主机上的端口。
从留档:
公开公开端口而不将它们发布到主机-它们只能被链接的服务访问。只能指定内部端口。
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准备好在端口上连接到服务器时才连接到该服务器。
以下是正确的工作示例:
version: "3.8"
services:
rabbitmq:
image: rabbitmq:3.7.28-management
#container_name: rabbitmq
volumes:
- ./etc/rabbitmq/conf:/etc/rabbitmq/
- ./etc/rabbitmq/data/:/var/lib/rabbitmq/
- ./etc/rabbitmq/logs/:/var/log/rabbitmq/
environment:
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE:-secret_cookie}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER:-admin}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS:-admin}
ports:
- 5672:5672 #amqp
- 15672:15672 #http
- 15692:15692 #prometheus
healthcheck:
test: [ "CMD", "rabbitmqctl", "status"]
interval: 5s
timeout: 20s
retries: 5
mysql:
image: mysql
restart: always
volumes:
- ./etc/mysql/data:/var/lib/mysql
- ./etc/mysql/scripts:/docker-entrypoint-initdb.d
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: mysqldb
MYSQL_USER: ${MYSQL_DEFAULT_USER:-testuser}
MYSQL_PASSWORD: ${MYSQL_DEFAULT_PASSWORD:-testuser}
ports:
- "3306:3306"
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 20s
retries: 10
trigger-batch-process-job:
build: .
environment:
- RMQ_USER=${RABBITMQ_DEFAULT_USER:-admin}
- RMQ_PASS=${RABBITMQ_DEFAULT_PASS:-admin}
- RMQ_HOST=${RABBITMQ_DEFAULT_HOST:-rabbitmq}
- RMQ_PORT=${RABBITMQ_DEFAULT_PORT:-5672}
- DB_USER=${MYSQL_DEFAULT_USER:-testuser}
- DB_PASS=${MYSQL_DEFAULT_PASSWORD:-testuser}
- DB_SERVER=mysql
- DB_NAME=mysqldb
- DB_PORT=3306
depends_on:
mysql:
condition: service_healthy
rabbitmq:
condition: service_healthy
啊哈!我修复了它。@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
现在,< code>worker容器将重新启动几次,而< code>rabbitmq容器保持不健康状态。当< code>nc -z localhost 5672成功时,即当队列处于活动状态时,< code>rabbitmq立即变得健康!
我有一个在节点容器和redis容器中运行的express API。当试图将节点容器连接到redis时,我遇到了以下错误。
这是我的: 和Dockerfile goparser: 连接MongoDB需要使用哪个地址?
我试图运行在通过包含文件()在虚拟机中,但我无法连接到,并且在尝试连接失败时收到的消息如下所示: 如果您注意到,docker能够连接到docker compose文件中提到的其他服务,其中一个是前两行显示的。在docker compose文件中调用kibana的命令如下: 如果我做了,它会给我以下信息: 在这里发布这个问题之前,我在google上广泛搜索了这个问题,并尝试了人们对这个问题的各种建议
问题内容: 我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。 Docker-machine正常运行,并且能够通过docker-machine ssh连接。 但是无法从docker-compose连接。 无法通过http + unix://var/run/docker.sock连接到Docker守护程序-它正在运行吗? 如果它
问题内容: 我收到一条错误消息,提示我无法连接到Docker守护程序。我调查了其他人遇到类似问题的答案,但没有帮助。我正在运行Ubuntu 15.10版本。我将尝试提供我所有的信息。 Docker版本 Docker-Compose版本 如果我尝试停止或启动服务,就会发生这种情况。 如果我跑步 任何帮助将不胜感激。让我知道您是否需要更多信息。 问题答案: 我发现了这个问题,似乎可以解决我的问题。 G
我在Mac OS 10.8.5上安装了docker-machine 0.1.0和docker-compose 1.1.0。 docker-machine运行正常,并且能够通过docker-machine SSH进行连接。 但无法从Docker-Compose连接。 无法连接到HTTP+UNIX上的Docker后台进程://var/run/Docker.sock-它正在运行吗? 如果它位于非标准位置