Docker打包制作rocketmq镜像(Dockerfile方式),并运行启动

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情


1.写在前面

很多微服务项目的框架,一般会采用消息中间件,进行业务逻辑的解耦。

鉴于目前SpringCloud Alibaba这套体系用得比较多,那一整套的分布式解决方案,rocketmq消息中间件也就用得比较多了。(毕竟是一整套的东西)^_^

一般来说,我们的项目,如果是传统的方式部署,直接从rocketmq官网,拿到rocketmq的服务的中间件,直接跑起来就行了。

image.png

目前最新版:4.9.3(2022-06-14)

但现在很多时候,我们的服务,要使用云原生k8s部署,那就要使用rocketmq的docker镜像,运行rocketmq了。

rocketmqdocker镜像包,我们可以从docker hub仓库,直接拉别人制作好的镜像包。

image.png

docker hub地址

docker pull apache/rocketmq:4.9.3

docker [运行教程] (github.com/apache/rock…)

1) Start NameServer

$ docker run -it --net=host  apache/rocketmq:4.9.3 ./mqnamesrv
复制代码

需要暴露端口,默认为:-p 9876:9876

2) Start Broker

$ docker run -it --net=host --mount source=/tmp/store,target=/home/rocketmq/store apache/rocketmq:4.9.3 ./mqbroker -n localhost:9876
复制代码

需要暴露端口,默认为:-p 10911:10911 -p 10909:10909 -p 10912:10912


由此可见,我们要执行两次dockerrun命令运行。

因为rocketmq至少需要启动一个nameserver和一个broker服务。

那可不可以做到,我只执行一次docker run命令,就帮我们同时启动一个nameserver和一个broker服务?

答案,肯定是可以!!! 我自己制作一个镜像,同时帮我们启动一个nameserver和一个broker服务,就好了。

当然,这种一般只适合在我们开发环境中使用。

上生产环境,我们就需要分开部署:nameserver集群部署、broker集群部署

详情可参考这里:点击查看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZrTEa5L-1634103651193)(image\image-20210910085245800.png)]

那就开干吧!!!

2.rocketmq镜像包制作

2.1环境准备

  • /opt/dockerfile/rocketmq

rocketmq官网中download可以运行的rocketmq版本,这里已4.5.0版本作为基础版本 rocketmq-all-4.5.0-bin-release.zip

image.png

上传到/opt/dockerfile/rocketmq下面,解压,并重命名为rocketmq

unzip rocketmq-all-4.5.0-bin-release.zip
mv rocketmq-all-4.5.0-bin-release rocketmq
复制代码
  • 编写启动rocketmq脚本,startServer.sh
#!/bin/bash
source /etc/profile

cd /opt/rocketmq

mkdir logs

# 启动nameserver
nohup sh ./bin/mqnamesrv > ./logs/ns.log 2>&1 &

# 启动Broker
nohup sh ./bin/mqbroker -c ./conf/broker.conf -n $NAMESRV_IP:$NAMESRV_PORT > ./logs/bk.log 2>&1 &

tail -f ./logs/ns.log & tail -f ./logs/bk.log
复制代码

$NAMESRV_IP: 为nameserver的ip地址

$NAMESRV_PORT: 为nameserver的port端口号

2.2Dockerfile

FROM openjdk:8u332-jdk

RUN mkdir -p /opt/

WORKDIR /opt/

COPY ./rocketmq ./rocketmq

COPY ./startServer.sh .

ENTRYPOINT ["sh", "/opt/startServer.sh"]
复制代码

2.3打包发布

  • vi build.sh
docker build -t llsydn/rocketmq:4.5 -f ./Dockerfile .
docker push llsydn/rocketmq:4.5
docker rmi llsydn/rocketmq:4.5
复制代码

2.4效果

harbor地址

账号密码:admin、llsydn123

image.png

harbor的安装可查看这里:点击查看

3.docker启动rocketmq镜像

  • 启动命令
docker run --name rocketmq \ 
    -p 9876:9876 \ 
    -p 10911:10911 -p 10909:10909  -p 10912:10912 \
    -e NAMESRV_IP=192.168.4.xxx \ 
    -e NAMESRV_PORT=9876 \ 
    llsydn/rocketmq:4.5
复制代码

这里要指定NAMESRV_IP为nameserver的ip地址,一般用宿主机ip即可,否则默认会用docker容器的ip。

这里要指定NAMESRV_PORT为nameserver的端口

image.png

可以参考:官方docker部署文档


好了,以上就是我个人的实操了。

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

image.png

猜你喜欢

转载自juejin.im/post/7109082879589613575