Docker 下 RabbitMQ 四部曲之二:细说 RabbitMQ 镜像制作
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
本章是《Docker 下 RabbitMQ 四部曲》系列的第二篇,将详细简述 Docker 下制作 RabbitMQ 镜像的技术细节,包括以下内容:
列举制作 RabbitMQ 镜像时用到的所有材料;
编写 Dockerfile;
编写容器启动时执行的脚本 startrabbit.sh;
单机版 RabbtiMQ 环境的 docker-compose.yml 说明;
集群版 RabbitMQ 环境的 docker-compose.yml 说明;
文件和源码下载
您可以在 GitHub 下载本文涉及到的文件和源码,地址和链接信息如下表所示:
这个 git 项目中有多个文件夹,本章所需的内容在 rabbitmq_docker_files 文件夹,如下图红框所示:
接下来开始镜像制作吧;
RabbitMQ 镜像要做的事情
先整理出我们需要一个什么样的镜像:
基础镜像为 centos:7;
时区:Asia/Shanghai;
编码:zh_CN.UTF-8;
装好了 Erlang;
装好了 RabbitMQ;
集群时候各个 RabbitMQ 机器之间的访问权限是通过 erlang.cookie 来控制的,所以在镜像中提前准备好 erlang.cookie,这样使用该镜像的所有容器由于 erlang.cookie 相同,就有了相互访问的权限;
创建容器时,可以通过参数来控制容器身份,例如集群版的主或者从,如果是身份是从,还要让从知道主的地址;
创建容器时,可以通过参数设置 RabbitMQ,例如用户名和密码、是否是内存节点、是否是高可用的镜像队列;
以上就是 RabbitMQ 镜像所具备的功能,其中 1-6 都可以在 Dockerfile 中实现,7 和 8 是在容器启动后要做的事情,所以要做个 shell 脚本来完成,容器创建时自动执行这个脚本;
准备镜像制作材料
根据前面列出的功能点,我们需要准备下面以下材料来制作镜像:
Dockerfile:制作 Docker 镜像必须的脚本文件
erlang.cookie:允许多个 RabbitMQ 容器相互访问的权限文件
rabbitmq.config:RabbitMQ 配置文件
startrabbit.sh:容器创建时执行的脚本
这些材料在 github 上都能获取到,地址:https://github.com/zq2599/blog_demos/tree/master/rabbitmq_docker_files/image
erlang.cookie 和 rabbitmq.config 很简单不需多说,我们细看 Dockerfile 和 startrabbit.sh;
Dockerfile
Dockerfile 是制作镜像时执行的脚本,内容如下:
如上所示,每个功能都有对应的注释,就不再赘述了;
容器启动后执行的脚本 startrabbit.sh
startrabbit.sh 内容如下:
这个脚本有以下几点需要注意:
if [ -z "$CLUSTERED" ]表示如果环境变量中没有 CLUSTERED 这个参数;
如果环境变量中没有 CLUSTERED 这个参数,当前容器的身份就是主,会调用 change_default_user 方法,这个方法中检查是否输入了用户名和密码,如果有就创建用户,并赋予管理员权限,再把原有的 guest 账号删除;
如果环境变量中有 CLUSTERED 这个参数,当前容器身份就是从,会执行 rabbitmqctl join_cluster 命令加入到集群中去;
如果环境变量中有 RAM_NODE 这个参数,会在 rabbitmqctl join_cluster 命令中带上 ram 参数,表示当前节点为内存节点;
如果环境变量中有 HA_ENABLE 这个参数,就在启动 RabbitMQ 之后执行命令 rabbitmqctl set_policy,将集群中的队列变为镜像队列,实现集群高可用;
构建镜像
以上就是制作镜像前的准备工作,完成之后在 Dockerfile 文件所在目录下执行命令 docker build -t bolingcavalry/rabbitmq-server:0.0.3 .,即可构建镜像;
单机版的 docker-compose.yml
这个 docker-compose.yml 在上一章我们用过,内容如下:
producer 和 consumer 的配置我们下一章再看,现在重点关注 rabbitmq 的配置:
没有 CLUSTERED 参数,表示该容器以主的身份运行;
RABBITMQ_DEFAULT_USER、RABBITMQ_DEFAULT_PASS 这两个参数设定了此 RabbitMQ 的管理员权限的账号和密码;
集群版的 docker-compose.yml
内容如下:
这个脚本有以下几点需要注意:
rabbit1 是主节点;
rabbit2 和 rabbit3 由于设置了 CLUSTERED,身份成为从节点,在 startrabbit.sh 脚本中,会通过 rabbitmqctl join_cluster 命令加入到主节点的集群中去,加入时如何找到主节点呢?用的是 CLUSTER_WITH 参数,而 CLUSTER_WITH 参数的值,在 docker-compose.yml 中通过 link 参数设置为 rabbit1;
rabbit2 设置了 RAM_NODE,所以是个内存节点;
至此,整个 RabbitMQ 镜像制作和使用的详细分析就结束了,您也可以自行实战,在 Dockerfile 和 startrabbit.sh 中增加一些命令来对 RabbitMQ 做更多个性化的设置,下一章,我们开发两个基于 SpringBoot 的工程,分别用来生产和消费消息;
参考并致敬:https://github.com/bijukunjummen/docker-rabbitmq-cluster
欢迎关注 InfoQ:程序员欣宸
版权声明: 本文为 InfoQ 作者【程序员欣宸】的原创文章。
原文链接:【http://xie.infoq.cn/article/e564c9e07a5d901d679babe14】。文章转载请联系作者。
评论