使用docker-compose连接到RabbitMQ容器

haz*_*haz 6 networking rabbitmq docker docker-compose

我想在一个容器中运行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
Run Code Online (Sandbox Code Playgroud)

因此,我公开了RabbitMQ端口。工作进程使用以下URL访问RabbitMQ:

amqp://guest:guest@rabbitmq:5672/
Run Code Online (Sandbox Code Playgroud)

它们在官方教程中使用的是它们,但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        
Run Code Online (Sandbox Code Playgroud)

我发现这很有趣,因为即使我将其指定为主机名,它也会使用IP地址127.0.0.1(我认为)是。我不是Docker网络方面的专家,所以也许这是理想的。localhostrabbitmq

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


编辑

有几乎相同的问题在这里。我认为我需要等到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
Run Code Online (Sandbox Code Playgroud)

(请注意其他版本)。但是,这行不通-总是会因为不健康而失败。

cra*_*eem 13

这是正确的工作示例:

    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
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是正确的答案 (3认同)

haz*_*haz 6

啊哈!我修好了它。@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
Run Code Online (Sandbox Code Playgroud)

现在,在容器保持不正常状态的worker同时,容器将重新启动几次rabbitmq。成功时(即排队rabbitmq时)立即变得健康nc -z localhost 5672


Par*_*kar 1

这里的答案对我有用并且更简单:

https://devops.stackexchange.com/questions/12092/docker-compose-healthcheck-for-rabbitmq?newreg=614274132fbc4f92a92ba80f6d758a76

如果您只需要进行基本检查,您可以使用rabbitmq-diagnostics -q ping 命令。

healthcheck:
  test: rabbitmq-diagnostics -q ping
  interval: 30s
  timeout: 30s
  retries: 3
Run Code Online (Sandbox Code Playgroud)