当前位置: 首页 > 知识库问答 >
问题:

使用docker-compose连接到RabbitMQ容器

茅华灿
2023-03-14

我想在一个容器中运行 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

(注意不同的版本)。然而,这是行不通的——因为不健康,它总是会失败。

共有3个答案

米浩穰
2023-03-14

如果您只是从另一个容器访问服务,也许您不需要暴露/映射主机上的端口。

从留档:

公开公开端口而不将它们发布到主机-它们只能被链接的服务访问。只能指定内部端口。

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准备好在端口上连接到服务器时才连接到该服务器。

臧正平
2023-03-14

以下是正确的工作示例

    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
楮庆
2023-03-14

啊哈!我修复了它。@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-它正在运行吗? 如果它位于非标准位置