首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用码头组合连接到RabbitMQ容器

用码头组合连接到RabbitMQ容器
EN

Stack Overflow用户
提问于 2018-10-28 04:19:42
回答 4查看 30.7K关注 0票数 27

我希望在一个容器中运行RabbitMQ,在另一个容器中运行一个工作进程。辅助进程需要访问RabbitMQ。

我想通过docker-compose来管理这些。

到目前为止,这是我的docker-compose.yml文件:

代码语言:javascript
运行
AI代码解释
复制
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:

代码语言:javascript
运行
AI代码解释
复制
amqp://guest:guest@rabbitmq:5672/

这是他们在官方教程中使用的,但是localhost被替换为rabbitmq,因为容器应该是可以使用与容器名称相同的主机名发现:

默认情况下,Compose为您的应用程序设置一个网络。服务的每个容器都加入了默认网络,并且可以被该网络上的其他容器访问,并且可以在与容器名称相同的主机名上被它们发现。

每当我运行它时,我都会得到一个连接被拒绝的错误:

代码语言:javascript
运行
AI代码解释
复制
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。我试着做了健康检查:

代码语言:javascript
运行
AI代码解释
复制
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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-10-28 18:17:00

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

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

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

如本这个相关的答案所述,我们可以在docker-compose 3+中使用健康检查。

代码语言:javascript
运行
AI代码解释
复制
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容器将保持不健康状态。当rabbitmq成功时,nc -z localhost 5672立即变得健康--即当队列处于活动状态时!

票数 25
EN

Stack Overflow用户

发布于 2021-05-29 07:53:53

以下是正确的工作示例:

代码语言:javascript
运行
AI代码解释
复制
    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
票数 9
EN

Stack Overflow用户

发布于 2018-10-28 05:16:24

如果您只是从另一个容器访问服务,则可能不需要公开/映射主机上的端口。

从文件中:

公开公开端口,而不将它们发布到主机上--它们只能被链接的服务访问。只能指定内部端口。 曝光:- "3000“- "8000”

所以应该是这样的:

代码语言:javascript
运行
AI代码解释
复制
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,只有当它准备好服务器在端口上。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53031439

复制
相关文章
js如何将带有分割符的字符串转化成一个n维数组
var str = “A-2-12”; var str1 = str.split(’-’); console.log(str1); var arr = str1.reverse().reduce((pre,cur,i) => { if(i==0) { pre.push(cur) return pre } return [cur,pre] },[]) console.log(arr) // [“A”[“B”,[“C”]]]
马克社区
2022/07/01
1.8K0
数组外面包了引号,怎么去掉外面的引号,变成原来的数组
let arr = '["qq","nn","555","456"]' let b= eval(arr) 一个神奇的eval()函数就能搞定 代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script> <title></title> </head> <
王小婷
2021/07/21
2.5K1
数组外面包了引号,怎么去掉外面的引号,变成原来的数组
如何将路径字符串数组(string[])转成树结构(treeNode[])?
这里说明一下,array2Tree()方法中的clientLabel参数其实可要可不要,也可继续扩展,根据自身业务而定。
唐志远
2023/08/01
2560
如何将路径字符串数组(string[])转成树结构(treeNode[])?
如何将路径字符串数组(string[])转成树结构(treeNode[])?
这里说明一下,array2Tree()方法中的clientLabel参数其实可要可不要,也可继续扩展,根据自身业务而定。
唐志远
2023/07/24
2430
如何将路径字符串数组(string[])转成树结构(treeNode[])?
delphi字符串加引号_oracle 单引号
sp_qry.Close; sp_qry.SQL.Clear; sp_qry.SQL.Add(‘select * from item_info where item_clsno=’+quotedstr(sp_lb.KeyValue)); sp_qry.Open;
全栈程序员站长
2022/11/10
1.4K0
字符串 str 包含单个数组带的双引号怎么处理?
要将字符串 "[["121.489764476833","31.3215977774656"]]" 中的双引号去掉,并将内部的经纬度值变为数字类型,你可以使用以下代码:
王小婷
2023/08/26
3170
字符串 str 包含单个数组带的双引号怎么处理?
C++对象模型_Class Obj作为函数参数
开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。 对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然
chinchao.xyz
2022/04/25
1.2K0
C++对象模型_Class Obj作为函数参数
c++如何将字符串转为数组(将字符串转换为数组)
string [] imgArr=imgData.Split(new char[]{‘,’});
全栈程序员站长
2022/07/29
7.1K0
【Python】字符串 ① ( Python 字符串定义形式 | 单引号定义法 | 双引号定义法 | 三引号定义法 | 字符串中包含单引号或双引号的处理方式 )
文章目录 一、Python 字符串定义形式 二、字符串中包含 单引号 / 双引号 一、Python 字符串定义形式 ---- Python 字符串定义形式 : 单引号定义法 : name = 'Tom' 双引号定义法 : name = "Tom" 三引号定义法 : 该定义方式与多行注释相同 , 使用 三引号 定义字符串 : 如果使用变量接收 , 那么定义的就是字符串 ; 如果没有变量接收 , 那么定义的就是多行注释 ; name = """Tom""" 代码示例 : # 单引号定义字符串 nam
韩曙亮
2023/04/07
3.2K0
【Python】字符串 ① ( Python 字符串定义形式 | 单引号定义法 | 双引号定义法 | 三引号定义法 | 字符串中包含单引号或双引号的处理方式 )
React技巧之将useState作为字符串数组
原文链接:https://bobbyhadz.com/blog/react-typescript-usestate-empty-object[1]
chuckQu
2022/08/19
8330
React技巧之将useState作为字符串数组
Python 引号、注释、字符串
Python3.6.3    json==2.0.9    win10.0.17134
用户7886150
2021/01/13
9430
[oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
转义字符回忆上次内容最近玩的是\n、\r 之外的转义序列 \a是 ␇ (bell)\t是 水平制表符\v是 换行不回车通过 16 进制数值转义 \xhh把(hh)16 进制对应的 ascii 字符输出通过 8 进制数值转义 \ooo把(nnn)8 进制对应的 ascii 字符输出这次加了 转义输出 反斜杠本身 \\ 输出 \总是转义 还是挺麻烦的能否直接输出原样输出呢?搜索帮助找到raw stringrawr的含义是 raw原始原样如果是有r就原样输出为什么raw就是原始原样呢?raw生的食物 没有
oeasy
2023/01/17
1.7K0
[oeasy]python0052_ raw格式字符串_单引号_双引号_反引号_ 退格键
shell字符串单双引号的坑
运行非常成功!结果正常输出!然后我就愉快地去重并call variant,但是当我查看g.vcf文件时发现样本名为W0
生信技能树
2021/02/04
5K0
Golang的单引号、双引号与反引号
而单引号则用于表示Golang的一个特殊类型:rune,类似其他语言的byte但又不完全一样,是指:码点字面量(Unicode code point),不做任何转义的原始内容。
py3study
2020/01/02
3.9K0
JavaScript之字符串引号的使用技巧
在JavaScript中可以随意使用引号,但是最好根据字符串包含的字符来选择。 1.如果字符串里面包含了单引号,那就把字符串放在双引号里面 var age = "this is 'pig'? "; 2
郑小超.
2018/01/24
1K0
Java处理包含引号的String字符串
背景 在开发默认提示文字时: 解决方案 转义 使用\"代替" 效果 正常
JavaEdge
2021/02/22
1.8K0
Java处理包含引号的String字符串
LinuxShell单引号、双引号、反引号以及无引号的区别
单引号为强引用,即将单引号中的内容原样输出,而不会对任何变量函数进行解析。比如在 Shell 中输入以下代码:
hotarugali
2022/02/28
5.6K0
数组作为实参,指针作为形参
这样传递下来,buffer数组的值为{0x0101,0x0202,0,0,0,0}。函数将地址data后的两个16位的数赋值给地址buffer后的两个16位数。
用户9736681
2022/05/11
1K0
点击加载更多

相似问题

如何将数组写入每个值周围带有引号的文件?

21

如何将列表中的每个元素转换为带有引号的字符串

31

如何创建带有单引号的每个字符串的字符串数组(Javascript)

32

如何将字符串作为参数传递给Javascript中带有引号的参数

12

当参数需要引号时,如何在每个项周围创建带有引号的数组?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文