当前位置:   article > 正文

Docker下RabbitMQ四部曲之二:细说RabbitMQ镜像制作_centos rabbitmq 制作docker 镜像

centos rabbitmq 制作docker 镜像

本章是《Docker下RabbitMQ四部曲》系列的第二篇,将详细简述Docker下制作RabbitMQ镜像的技术细节,包括以下内容: 
1. 列举制作RabbitMQ镜像时用到的所有材料; 
2. 编写Dockerfile; 
3. 编写容器启动时执行的脚本startrabbit.sh; 
4. 单机版RabbtiMQ环境的docker-compose.yml说明; 
5. 集群版RabbitMQ环境的docker-compose.yml说明;

文件和源码下载

您可以在GitHub下载本文涉及到的文件和源码,地址和链接信息如下表所示:

名称链接备注
项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页
git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议
git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议

这个git项目中有多个文件夹,本章所需的内容在rabbitmq_docker_files文件夹,如下图红框所示: 
这里写图片描述

接下来开始镜像制作吧;

RabbitMQ镜像要做的事情

先整理出我们需要一个什么样的镜像: 
1. 基础镜像为centos:7; 
2. 时区:Asia/Shanghai; 
3. 编码:zh_CN.UTF-8; 
4. 装好了Erlang; 
5. 装好了RabbitMQ; 
6. 集群时候各个RabbitMQ机器之间的访问权限是通过erlang.cookie来控制的,所以在镜像中提前准备好erlang.cookie,这样使用该镜像的所有容器由于erlang.cookie相同,就有了相互访问的权限; 
7. 创建容器时,可以通过参数来控制容器身份,例如集群版的主或者从,如果是身份是从,还要让从知道主的地址; 
8. 创建容器时,可以通过参数设置RabbitMQ,例如用户名和密码、是否是内存节点、是否是高可用的镜像队列;

以上就是RabbitMQ镜像所具备的功能,其中1-6都可以在Dockerfile中实现,7和8是在容器启动后要做的事情,所以要做个shell脚本来完成,容器创建时自动执行这个脚本;

准备镜像制作材料

根据前面列出的功能点,我们需要准备下面以下材料来制作镜像: 
1. Dockerfile:制作Docker镜像必须的脚本文件 
2. erlang.cookie:允许多个RabbitMQ容器相互访问的权限文件 
3. rabbitmq.config:RabbitMQ配置文件 
4. startrabbit.sh:容器创建时执行的脚本

这些材料在github上都能获取到,地址:https://github.com/zq2599/blog_demos/tree/master/rabbitmq_docker_files/image

erlang.cookie和rabbitmq.config很简单不需多说,我们细看Dockerfile和startrabbit.sh;

Dockerfile

Dockerfile是制作镜像时执行的脚本,内容如下:

  1. # Docker file for rabbitmq single or cluster from bolingcavalry
  2. # VERSION 0.0.3
  3. # Author: bolingcavalry
  4. #基础镜像
  5. FROM centos:7
  6. #作者
  7. MAINTAINER BolingCavalry <zq2599@gmail.com>
  8. #定义时区参数
  9. ENV TZ=Asia/Shanghai
  10. #设置时区
  11. RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone
  12. #设置编码为中文
  13. RUN yum -y install kde-l10n-Chinese glibc-common
  14. RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8
  15. ENV LC_ALL zh_CN.utf8
  16. #安装wget工具
  17. RUN yum install -y wget unzip tar
  18. #安装erlang
  19. RUN rpm -Uvh https://github.com/rabbitmq/erlang-rpm/releases/download/v19.3.6.5/erlang-19.3.6.5-1.el7.centos.x86_64.rpm
  20. RUN yum install -y erlang
  21. #安装rabbitmq
  22. RUN rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
  23. RUN yum install -y https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.5-rc.1/rabbitmq-server-3.7.5.rc.1-1.el7.noarch.rpm
  24. RUN /usr/sbin/rabbitmq-plugins list <<<'y'
  25. #安装常用插件
  26. RUN /usr/sbin/rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_stomp rabbitmq_management rabbitmq_management_agent rabbitmq_federation rabbitmq_federation_management <<<'y'
  27. #添加配置文件
  28. ADD rabbitmq.config /etc/rabbitmq/
  29. #添加cookie,使集群环境中的机器保持互通
  30. ADD erlang.cookie /var/lib/rabbitmq/.erlang.cookie
  31. #添加启动容器时执行的脚本,主要根据启动时的入参做集群设置
  32. ADD startrabbit.sh /opt/rabbit/
  33. #给相关资源赋予权限
  34. RUN chmod u+rw /etc/rabbitmq/rabbitmq.config \
  35. && chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie \
  36. && chmod 400 /var/lib/rabbitmq/.erlang.cookie \
  37. && mkdir -p /opt/rabbit \
  38. && chmod a+x /opt/rabbit/startrabbit.sh
  39. #暴露常用端口
  40. EXPOSE 5672
  41. EXPOSE 15672
  42. EXPOSE 25672
  43. EXPOSE 4369
  44. EXPOSE 9100
  45. EXPOSE 9101
  46. EXPOSE 9102
  47. EXPOSE 9103
  48. EXPOSE 9104
  49. EXPOSE 9105
  50. #设置容器创建时执行的脚本
  51. CMD /opt/rabbit/startrabbit.sh
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

如上所示,每个功能都有对应的注释,就不再赘述了;

容器启动后执行的脚本startrabbit.sh

startrabbit.sh内容如下:

  1. #!/bin/bash
  2. change_default_user() {
  3. if [ -z $RABBITMQ_DEFAULT_USER ] && [ -z $RABBITMQ_DEFAULT_PASS ]; then
  4. echo "Maintaining default 'guest' user"
  5. else
  6. echo "Removing 'guest' user and adding ${RABBITMQ_DEFAULT_USER}"
  7. rabbitmqctl delete_user guest
  8. rabbitmqctl add_user $RABBITMQ_DEFAULT_USER $RABBITMQ_DEFAULT_PASS
  9. rabbitmqctl set_user_tags $RABBITMQ_DEFAULT_USER administrator
  10. rabbitmqctl set_permissions -p / $RABBITMQ_DEFAULT_USER ".*" ".*" ".*"
  11. fi
  12. }
  13. HOSTNAME=`env hostname`
  14. if [ -z "$CLUSTERED" ]; then
  15. # if not clustered then start it normally as if it is a single server
  16. /usr/sbin/rabbitmq-server &
  17. rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
  18. change_default_user
  19. tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
  20. else
  21. if [ -z "$CLUSTER_WITH" ]; then
  22. # If clustered, but cluster with is not specified then again start normally, could be the first server in the
  23. # cluster
  24. /usr/sbin/rabbitmq-server&
  25. rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
  26. tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
  27. else
  28. /usr/sbin/rabbitmq-server &
  29. rabbitmqctl wait /var/lib/rabbitmq/mnesia/rabbit\@$HOSTNAME.pid
  30. rabbitmqctl stop_app
  31. if [ -z "$RAM_NODE" ]; then
  32. rabbitmqctl join_cluster rabbit@$CLUSTER_WITH
  33. else
  34. rabbitmqctl join_cluster --ram rabbit@$CLUSTER_WITH
  35. fi
  36. rabbitmqctl start_app
  37. # If set ha flag, enable here
  38. if [ -z "$HA_ENABLE" ]; then
  39. echo "Running with normal cluster mode"
  40. else
  41. rabbitmqctl set_policy HA '^(?!amq\.).*' '{"ha-mode": "all"}'
  42. echo "Running wiht HA cluster mode"
  43. fi
  44. # Tail to keep the a foreground process active..
  45. tail -f /var/log/rabbitmq/rabbit\@$HOSTNAME.log
  46. fi
  47. fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

这个脚本有以下几点需要注意: 
1. if [ -z “$CLUSTERED” ]表示如果环境变量中没有CLUSTERED这个参数; 
2. 如果环境变量中没有CLUSTERED这个参数,当前容器的身份就是主,会调用change_default_user方法,这个方法中检查是否输入了用户名和密码,如果有就创建用户,并赋予管理员权限,再把原有的guest账号删除; 
3. 如果环境变量中有CLUSTERED这个参数,当前容器身份就是从,会执行rabbitmqctl join_cluster命令加入到集群中去; 
4. 如果环境变量中有RAM_NODE这个参数,会在rabbitmqctl join_cluster命令中带上ram参数,表示当前节点为内存节点; 
5. 如果环境变量中有HA_ENABLE这个参数,就在启动RabbitMQ之后执行命令rabbitmqctl set_policy,将集群中的队列变为镜像队列,实现集群高可用;

构建镜像

以上就是制作镜像前的准备工作,完成之后在Dockerfile文件所在目录下执行命令docker build -t bolingcavalry/rabbitmq-server:0.0.3 .,即可构建镜像;

单机版的docker-compose.yml

这个docker-compose.yml在上一章我们用过,内容如下:

  1. rabbitmq:
  2. image: bolingcavalry/rabbitmq-server:0.0.3
  3. hostname: rabbitmq
  4. ports:
  5. - "15672:15672"
  6. environment:
  7. - RABBITMQ_DEFAULT_USER=admin
  8. - RABBITMQ_DEFAULT_PASS=888888
  9. producer:
  10. image: bolingcavalry/rabbitmqproducer:0.0.2-SNAPSHOT
  11. hostname: producer
  12. links:
  13. - rabbitmq:rabbitmqhost
  14. ports:
  15. - "18080:8080"
  16. environment:
  17. - mq.rabbit.address=rabbitmqhost:5672
  18. - mq.rabbit.username=admin
  19. - mq.rabbit.password=888888
  20. consumer:
  21. image: bolingcavalry/rabbitmqconsumer:0.0.3-SNAPSHOT
  22. hostname: consumer
  23. links:
  24. - rabbitmq:rabbitmqhost
  25. environment:
  26. - mq.rabbit.address=rabbitmqhost:5672
  27. - mq.rabbit.username=admin
  28. - mq.rabbit.password=888888
  29. - mq.rabbit.queue.name=consumer.queue
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

producer和consumer的配置我们下一章再看,现在重点关注rabbitmq的配置: 
1. 没有CLUSTERED参数,表示该容器以主的身份运行; 
2. RABBITMQ_DEFAULT_USER、RABBITMQ_DEFAULT_PASS这两个参数设定了此RabbitMQ的管理员权限的账号和密码;

集群版的docker-compose.yml

内容如下:

  1. version: '2'
  2. services:
  3. rabbit1:
  4. image: bolingcavalry/rabbitmq-server:0.0.3
  5. hostname: rabbit1
  6. ports:
  7. - "15672:15672"
  8. environment:
  9. - RABBITMQ_DEFAULT_USER=admin
  10. - RABBITMQ_DEFAULT_PASS=888888
  11. rabbit2:
  12. image: bolingcavalry/rabbitmq-server:0.0.3
  13. hostname: rabbit2
  14. depends_on:
  15. - rabbit1
  16. links:
  17. - rabbit1
  18. environment:
  19. - CLUSTERED=true
  20. - CLUSTER_WITH=rabbit1
  21. - RAM_NODE=true
  22. ports:
  23. - "15673:15672"
  24. rabbit3:
  25. image: bolingcavalry/rabbitmq-server:0.0.3
  26. hostname: rabbit3
  27. depends_on:
  28. - rabbit2
  29. links:
  30. - rabbit1
  31. - rabbit2
  32. environment:
  33. - CLUSTERED=true
  34. - CLUSTER_WITH=rabbit1
  35. ports:
  36. - "15675:15672"
  37. producer:
  38. image: bolingcavalry/rabbitmqproducer:0.0.2-SNAPSHOT
  39. hostname: producer
  40. depends_on:
  41. - rabbit3
  42. links:
  43. - rabbit1:rabbitmqhost
  44. ports:
  45. - "18080:8080"
  46. environment:
  47. - mq.rabbit.address=rabbitmqhost:5672
  48. - mq.rabbit.username=admin
  49. - mq.rabbit.password=888888
  50. consumer1:
  51. image: bolingcavalry/rabbitmqconsumer:0.0.3-SNAPSHOT
  52. hostname: consumer1
  53. depends_on:
  54. - producer
  55. links:
  56. - rabbit2:rabbitmqhost
  57. environment:
  58. - mq.rabbit.address=rabbitmqhost:5672
  59. - mq.rabbit.username=admin
  60. - mq.rabbit.password=888888
  61. - mq.rabbit.queue.name=consumer1.queue
  62. consumer2:
  63. image: bolingcavalry/rabbitmqconsumer:0.0.3-SNAPSHOT
  64. hostname: consumer2
  65. depends_on:
  66. - consumer1
  67. links:
  68. - rabbit3:rabbitmqhost
  69. environment:
  70. - mq.rabbit.address=rabbitmqhost:5672
  71. - mq.rabbit.username=admin
  72. - mq.rabbit.password=888888
  73. - mq.rabbit.queue.name=consumer2.queue
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

这个脚本有以下几点需要注意: 
1. rabbit1是主节点; 
2. rabbit2和rabbit3由于设置了CLUSTERED,身份成为从节点,在startrabbit.sh脚本中,会通过rabbitmqctl join_cluster命令加入到主节点的集群中去,加入时如何找到主节点呢?用的是CLUSTER_WITH参数,而CLUSTER_WITH参数的值,在docker-compose.yml中通过link参数设置为rabbit1; 
3. rabbit2设置了RAM_NODE,所以是个内存节点;

至此,整个RabbitMQ镜像制作和使用的详细分析就结束了,您也可以自行实战,在Dockerfile和startrabbit.sh中增加一些命令来对RabbitMQ做更多个性化的设置,下一章,我们开发两个基于SpringBoot的工程,分别用来生产和消费消息;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/666544
推荐阅读
相关标签
  

闽ICP备14008679号