【部署】【一】制作 RocketMQ 的 Docker 镜像

查看 RocketMQ 系列文章目录

环境准备和最终目标

  • 准备一:Linux 主机,笔者用的是阿里云 ECS,预装 Centos7.4 Docker18.03.1-ce
  • 准备二:基础 java 8 Docker 镜像,镜像中预装 unzip 解压工具
  • 目标一:在一台宿主机部署一个 Namesrv Container 和一个 Brocker Container
  • 目标二:通过管理命令实现对 RocketMQ 的运维管理
  • 目标三:运行官方写好的 demo 程序,实现 MQ 消息的收发

准备文件

目录
├── rocketmq
│   ├── scripts
│   │   ├── mqbroker-customize
│   │   ├── mqnamesrv-customize
│   │   ├── runbroker-customize.sh
│   │   ├── runserver-customize.sh
│   ├── Dockerfile
rocketmq/scripts/mqbroker-customize
#!/bin/bash
#
# Program:
#     this program customize RocketMQ mqbroker, user can add jvm param with "--jvm"
# History:
# 2019/01/23    Zhaofeng.L<8362549@qq.com>    v1.0
#

if [ -z "$ROCKETMQ_HOME" ] ; then
  ## resolve links - $0 may be a link to maven's home
  PRG="$0"

  # need this for relative symlinks
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done

  saveddir=`pwd`

  ROCKETMQ_HOME=`dirname "$PRG"`/..

  # make it fully qualified
  ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`

  cd "$saveddir"
fi

export ROCKETMQ_HOME

if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
    sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
     org.apache.rocketmq.broker.BrokerStartup \
     -c /opt/rocketmq/conf/broker.conf $@
else
    JVM_KEY="$1"
    JVM_VALUE="$2"
    shift 2
    sh ${ROCKETMQ_HOME}/bin/runbroker.sh ${JVM_KEY} "${JVM_VALUE}" \ 
     org.apache.rocketmq.broker.BrokerStartup \
     -c /opt/rocketmq/conf/broker.conf $@
fi
rocketmq/scripts/mqnamesrv-customize
#!/bin/sh
#
# Program:
#     this program customize RocketMQ mqnamesrv, user can add jvm param with "--jvm"
# History:
# 2019/01/23    Zhaofeng.L<8362549@qq.com>    v1.0
#

if [ -z "$ROCKETMQ_HOME" ] ; then
  ## resolve links - $0 may be a link to maven's home
  PRG="$0"

  # need this for relative symlinks
  while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
      PRG="$link"
    else
      PRG="`dirname "$PRG"`/$link"
    fi
  done

  saveddir=`pwd`

  ROCKETMQ_HOME=`dirname "$PRG"`/..

  # make it fully qualified
  ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`

  cd "$saveddir"
fi

export ROCKETMQ_HOME

if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
    sh ${ROCKETMQ_HOME}/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup $@
else
    JVM_KEY="$1"
    JVM_VALUE="$2"
    shift 2
    sh ${ROCKETMQ_HOME}/bin/runserver.sh ${JVM_KEY} "${JVM_VALUE}" org.apache.rocketmq.namesrv.NamesrvStartup $@
fi
rocketmq/scripts/runbroker-customize.sh
#!/bin/bash
#
# Program:
#     this program customize RocketMQ runbroker.sh, user can add jvm param with "--jvm"
# History:
# 2019/01/23    Zhaofeng.L<8362549@qq.com>    v1.0
#

#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
    JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
else
    JAVA_OPT="${JAVA_OPT} -server $2"
    shift 2
fi
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
then
        if [ -z "$RMQ_NUMA_NODE" ] ; then
                numactl --interleave=all $JAVA ${JAVA_OPT} $@
        else
                numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@
        fi
else
        $JAVA ${JAVA_OPT} $@
fi
rocketmq/scripts/runserver-customize.sh
#!/bin/bash
#
# Program:
#     this program customize RocketMQ runserver.sh, user can add jvm param with "--jvm"
# History:
# 2019/01/23    Zhaofeng.L<8362549@qq.com>    v1.0
#

#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}

#===========================================================================================
# JVM Configuration
#===========================================================================================
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
    JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
else
    JAVA_OPT="${JAVA_OPT} -server $2 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    shift 2
fi
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
# JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

$JAVA ${JAVA_OPT} $@
rocketmq/Dockerfile
#
# Program:
#     Make RocketMQ docker image
#
# History:
#     2019/01/23    v1.0
#

FROM onesoso/java:8

MAINTAINER Zhaofeng.L<8362549@qq.com>

ARG version

# Rocketmq version
ENV ROCKETMQ_VERSION ${version}

# Rocketmq home
ENV ROCKETMQ_HOME /opt/rocketmq

WORKDIR  ${ROCKETMQ_HOME}

# get rocketmq program
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 \
 && mv rocketmq-all*/* . \
 && rmdir rocketmq-all*  \
 && rm rocketmq.zip

# add scripts
COPY scripts/ ${ROCKETMQ_HOME}/bin/

VOLUME ${ROCKETMQ_HOME}/conf 

# expose namesrv port
EXPOSE 9876

# add customized scripts for mqnamesrv
RUN mv ${ROCKETMQ_HOME}/bin/mqnamesrv-customize ${ROCKETMQ_HOME}/bin/mqnamesrv \
 && chmod +x ${ROCKETMQ_HOME}/bin/mqnamesrv

# add customized scripts for runserver.sh
RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh ${ROCKETMQ_HOME}/bin/runserver.sh \
 && chmod +x ${ROCKETMQ_HOME}/bin/runserver.sh

# expose broker ports
EXPOSE 10909 10911

# add customized scripts for mqbroker
RUN mv ${ROCKETMQ_HOME}/bin/mqbroker-customize ${ROCKETMQ_HOME}/bin/mqbroker \
 && chmod +x ${ROCKETMQ_HOME}/bin/mqbroker

# add customized scripts for runuroker.sh
RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
 && chmod +x ${ROCKETMQ_HOME}/bin/runbroker.sh

# export Java options
RUN export JAVA_OPT=" -Duser.home=/opt"

WORKDIR ${ROCKETMQ_HOME}/bin

生成 Docker 镜像

docker build -t onesoso/rocketmq:4.4.0.1 --build-arg version=4.4.0 ./rocketmq

启动容器

创建 rocketmq 网络
docker network create rocket_mq
启动 namesrv
docker run \
--name namesrv \
--network rocket_mq \
-p 9876:9876 \
-v /root/namesrv/logs:/root/logs \
-v /root/namesrv/store:/root/store \
-d onesoso/rocketmq:4.4.0.1 sh mqnamesrv --jvm "-Xms512m -Xmx512m -Xmn256m"
启动 brocker
docker run \
--name broker \
--network rocket_mq \
-p 10911:10911 \
-p 10909:10909 \
-v /root/broker/logs:/root/logs \
-v /root/broker/store:/root/store \
-e "NAMESRV_ADDR=namesrv:9876" \
-d onesoso/rocketmq:4.4.0.1 sh mqbroker --jvm "-Xms512m -Xmx512m -Xmn256m"

测试运维管理

启动并进入管理容器
docker run --name admin --network rocket_mq -it onesoso/rocketmq:4.4.0.1 /bin/bash
运行<查看 namesrv 配置>管理命令
sh mqadmin getNamesrvConfig -n namesrv:9876

控制台能够输出 namesrv 的全部配置,说明管理命令运行成功

运行<查看 broker 配置>管理命令
sh mqadmin getBrokerConfig -b broker:10911 -n namesrv:9876

控制台能够输出 broker 的全部配置,说明管理命令运行成功

测试消息收发

启动并进入消息容器
docker run --name message --network rocket_mq -it onesoso/rocketmq:4.4.0.1 /bin/bash
测试发送消息
export NAMESRV_ADDR=namesrv:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Producer

控制台能够输出 SendResult [sendStatus=SEND_OK ... 说明发送消息成功

测试消费消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

控制台能够输出 ConsumeMessageThread_XX Receive New Messages: ... 说明消费消息成功

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值