rocketmq在docker环境下的单机搭建(ubuntu-16.0 + docker-17.03 + rocketmq-4.2)

概述

本次搭建主要使用Dockfile搭建,因为在本地有速度慢和易出错的问题,所以我采取了编写好Dockerfile后交给网易蜂巢进行镜像的搭建。

根据docker提倡的“一个容器一个进程”的思路,我分为namesrv容器和broker容器,搭建途中遇到了一些问题,通过网络资料,涨了很多知识,特此记录一下。

编写Dockerfile构建镜像

分为namesrv镜像和broker镜像

namesrv

#Dockerfile文件内容
#RocketMQ依赖Java环境,因此基于Java镜像进行构建
#修改启动参数-Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m为-Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m,虚拟机内存较小
#9876:消息监听端口

FROM java:8

ENV ROCKETMQ_VERSION 4.2.0

ENV ROCKETMQ_HOME  /opt/rocketmq-${ROCKETMQ_VERSION}
ENV JAVA_OPT " -Duser.home=/opt"

WORKDIR  ${ROCKETMQ_HOME}

RUN mkdir -p /opt/logs /opt/store

RUN curl https://dist.apache.org/repos/dist/release/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o rocketmq.zip \
          && unzip rocketmq.zip \
          && rm rocketmq.zip \
          && cd ${ROCKETMQ_HOME}/bin \
          && sed -i 's#-Xms[0-9]\+[gm]#-Xms256m#' runserver.sh \
          && sed -i 's#-Xmx[0-9]\+[gm]#-Xmx256m#' runserver.sh \
          && sed -i 's#-Xmn[0-9]\+[gm]#-Xmn128m#' runserver.sh \
          && sed -i 's#-XX:MetaspaceSize=[0-9]\+[gm]#-XX:MetaspaceSize=64m#' runserver.sh \
          && sed -i 's#-XX:MaxMetaspaceSize=[0-9]\+[gm]#-XX:MaxMetaspaceSize=128m#' runserver.sh \
          && chmod +x ./mqnamesrv

CMD cd ${ROCKETMQ_HOME}/bin && sh mqnamesrv

EXPOSE 9876

VOLUME ["/opt/logs", "/opt/store"]
  • 这是开源中国上的一篇文章里的,下面的broker-file也是。
  • 通过网易蜂巢 的创建镜像仓库
    • 注意:创建镜像仓库名为rocketmq-namesrv比较好
  • 然后上传Dockerfile,通过查看构建日志把握构建过程,并查看构建是否出错
    • 顺便说一句,构建日志这种功能通过webSocket实现的

broker

#Dockerfile文件内容
#RocketMQ以来Java环境,因此基于Java镜像进行构建
#修改启动参数-Xms8g -Xmx8g -Xmn4g为-Xms256m -Xmx256m -Xmn128m,虚拟机内存较小
#10911:消息监听端口
#10912:主从同步端口

FROM java:8

ENV ROCKETMQ_VERSION 4.2.0

ENV ROCKETMQ_HOME  /opt/rocketmq-${ROCKETMQ_VERSION}
ENV JAVA_OPT " -Duser.home=/opt"

WORKDIR  ${ROCKETMQ_HOME}

RUN mkdir -p /opt/logs /opt/store

RUN curl https://dist.apache.org/repos/dist/release/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o rocketmq.zip \
          && unzip rocketmq.zip \
          && rm rocketmq.zip \
          && cd ${ROCKETMQ_HOME}/bin \
          && sed -i 's#-Xms[0-9]\+[gm]#-Xms256m#' runbroker.sh \
          && sed -i 's#-Xmx[0-9]\+[gm]#-Xmx256m#' runbroker.sh \
          && sed -i 's#-Xmn[0-9]\+[gm]#-Xmn128m#' runbroker.sh \
          && chmod +x ./mqbroker

EXPOSE 10909 10911 10912

VOLUME ["/opt/logs", "/opt/store"]

CMD cd ${ROCKETMQ_HOME}/bin && sh mqbroker
  • 同上

查看构建好的镜像

先通过网易蜂巢给的命令将镜像pull下来,然后使用docker images查看新镜像

开放防火墙端口

因为一会儿需要用到一些端口,所以需要提前开放,我是用的是iptables,需要修改 iptables规则为

# 8080-给rocketmq-console使用
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
# 29876-给rocketmq-namesrv使用
-A INPUT -p tcp -m tcp --dport 29876 -j ACCEPT
# 剩下的这仨给rocketmq-broker使用
-A INPUT -p tcp -m tcp --dport 10911 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10909 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 10912 -j ACCEPT

启动namesrv容器

启动

# 启动namesrv容器的命令
sudo docker run --name rmq-namesrv \
-p 29876:9876 \
-v /opt/rocketmq/namesrv/logs:/opt/logs \
-v /opt/rocketmq/namesrv/store:/opt/store \
-d hub.c.163.com/gasoliner12138/mq:latest# -d是后台运行

进入容器查看

# 查看对应容器id
docker ps -a
# 进入该容器,因为它使用的-d,所以不能使用attach(会卡死),使用exec
docker exec -it containerId /bin/bash
# 进入容器了
# 查看当前容器内的进程
ps -ef
# 重要!!!查看当前容器IP
cat /etc/hosts
# 最后一行就是
# 记下来,假设是 172.0.72.1

启动失败的时候用到的命令

  • 实时查看docker日志:$ sudo docker logs -f -t --tail 10 s12
    • 实时查看docker容器名为s12的最后10行日志

启动broker容器

启动

# 启动broker容器的命令
sudo docker run --name rmq-broker \
-p 10911:10911 -p 10909:10909 -p 10912:10912 \
-v /opt/rocketmq/broker/logs:/opt/logs \
-v /opt/rocketmq/broker/store:/opt/store \
-v /opt/rocketmq/broker/conf/broker.properties:/opt/broker.properties \
-d hub.c.163.com/gasoliner12138/rocketmq-broker:latest sh ./bin/mqbroker -n 172.17.0.2:9876 autoCreateTopicEnable=true -c /opt/broker.properties
  • 注意
    • mqbroker启动的时候的-n参数是必须的格式为 :,指定的是namesrv的地址,这是刚刚在namesrv里拿到的ip
    • mqbroker启动的时候应该 加上autoCreateTopicEnable=true参数,要不Producer会报No route info of Topic异常
    • -v参数是将容器内的文件与系统的文件连接起来的,我的/opt/rocketmq/broker/conf/broker.properties得broker.properties是个文件夹,应该改成文件,要不会报错FileNotFound
    • 将”brokerIP1=xx.xx.xx.xx“填到broker.properties文件中,这里的xx代表docker主机的地址,这样本台broker注册到namesrv的地址才正确。这是由于docker容器的IP问题造成的,该解决方案参考click here。

查看rocketmq日志验证是否启动成功

在系统中,使用 cat /opt/rocketmq/namesrv/logs/rocketmqlogs中的namesrv.log中是否有new broker registered, 192.168.192.20:10911 HAServer: 172.17.0.3:10912 OK这种意思的log,如果有的话,代表注册成功了。没有的话,应该有报错信息。(ps:这里的192.168.192.20是我docker主机的地址)

参考文章:

rocketMQ相关的

  • rocketMq排坑:如何设置rocketMq broker的ip地址
  • RocketMQ管理命令说明
  • RocketMQ学习(一):broker与namesrv镜像
  • RocketMQ学习(二):基于Docker镜像搭建单机版
  • 十分钟入门RocketMQ|[阿里中间件团队博客](http://jm.taobao.org/)

docker相关的

  • Dockerfile 指令详解
  • 如何获取 docker 容器(container)的 ip 地址
  • docker 后台运行和进入后台运行的容器
  • 理解Docker容器的进程管理
  • docker logs 查看实时日志

你可能感兴趣的:(docker,rocketmq)