使用dockerfile制作任意版本的docker镜像
1、Dockerfile
创建文件rocketmq
#FROM openjdk:8
FROM java8:1.0
#上面的基础镜像可以自己 docker pull
LABEL "作者"=aaaaa
ENV ROCKETMQ_VERSION 5.1.3
# ENV LANG en_US.UTF-8
ENV ROCKETMQ_HOME="/home/rocketmq/rocketmq-${ROCKETMQ_VERSION}"
WORKDIR ${ROCKETMQ_HOME}
#ENV TIME_ZONE Asia/Shanghai
#RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime
# 上面是处理乱码的,可以根据自己实际情况来。
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 -f rocketmq.zip \
&& ls \
&& mv rocketmq-all-${ROCKETMQ_VERSION}-bin-release/* ./ \
&& rm -rf rocketmq-all-${ROCKETMQ_VERSION}-bin-release \
&& cd ${ROCKETMQ_HOME}/bin \
#下面三行是namesrv用到的,写死了默认的jvm参数,如果不想使用默认的,可以在启动的时候自己添加JAVA_OPT的参数。
&& sed -i 's#-Xms[0-9]\+[gm]#-Xms512m#g' runserver.sh \
&& sed -i 's#-Xmx[0-9]\+[gm]#-Xmx512m#g' runserver.sh \
&& sed -i 's#-Xmn[0-9]\+[gm]#-Xmn128m#g' runserver.sh \
#下面两行是为了处理5.1.3版本用到的,4.9.7不需要。因为5.1.3的启动脚本有变动,需要用到javac和which。我的没有这俩命令,所以给注释掉了。
&& sed -i "s/find_java_home$/#find_java_home/" runserver.sh \
&& sed -i "s/find_java_home$/#find_java_home/" runbroker.sh \
#上面两行是为了处理5.1.3版本用到的,4.9.7不需要。因为5.1.3的启动脚本有变动,需要用到javac和which。我的没有这俩命令,所以给注释掉了。
#下面两行是broker用到的,写死了默认的jvm参数,如果不想使用默认的,可以在启动的时候自己添加JAVA_OPT的参数。
&& sed -i 's#-Xms[0-9]\+[gm]#-Xms512m#g' runbroker.sh \
&& sed -i 's#-Xmx[0-9]\+[gm]#-Xmx512m#g' runbroker.sh \
&& sed -i 's#-XX:MetaspaceSize=[0-9]\+[gm]#-XX:MetaspaceSize=128m#' runserver.sh \
&& sed -i 's#-XX:MaxMetaspaceSize=[0-9]\+[gm]#-XX:MaxMetaspaceSize=320m#' runserver.sh
ENV ROCKETMQ="/home/rocketmq/rocketmq-${ROCKETMQ_VERSION}/bin"
WORKDIR ${ROCKETMQ}
2、打包镜像
docker build -f rocketmq -t rocketmq:5.1.3 .
3、相关配置
namesrv的日志默认为
/root/logs
这个是默认的,可以修改成自己想要的,可以在容器运行后,直接修改,然后docker commit保存下来。
broker的有两个
/root/logs
/root/store
上述三个目录,有需要的可以挂载到宿主机目录进行持久化。
4、启动
docker启动或k8s启动,启动命令主要是
sh ./mqnamesrv
sh ./mqbroker
#绝对路径为/home/rocketmq/rocketmq-${ROCKETMQ_VERSION}-bin
注意事项
1、容器运行后,执行报错
Operation not permitted
解决方案:docker run命令中,添加–privileged参数
k8s则需要给容器的spec指定securityContext.privileged=true