本人是docker小白。因为公司产品使用了rockermq,但是真正部署上都是一台服务器单机的。所以自己想试下,部署个集群看应用端代码是否匹配,能不能正常使用。没得服务器,就想说用docker来弄。
记录下踩坑、学习经过
ps:简书是真的难用,搬到csdn来了
可参照该网址安装
https://www.runoob.com/docker/macos-docker-install.html
nameserver-a的log和store
mkdir -p /opt/rocketmq/logs/nameserver-a
mkdir -p /opt/rocketmq/logs/nameserver-b
mkdir -p /opt/rocketmq/store/nameserver-a
mkdir -p /opt/rocketmq/store/nameserver-b
broker-a、broker-b的log和store
mkdir -p /opt/rocketmq/logs/broker-a
mkdir -p /opt/rocketmq/logs/broker-b
mkdir -p /opt/rocketmq/store/broker-a
mkdir -p /opt/rocketmq/store/broker-b
mkdir -p /home/rocketmq/broker-a/
mkdir -p /home/rocketmq/broker-b/
broker-a-s、broker-b-s的log和store
mkdir -p /opt/rocketmq/logs/broker-a-s
mkdir -p /opt/rocketmq/logs/broker-b-s
mkdir -p /opt/rocketmq/store/broker-a-s
mkdir -p /opt/rocketmq/store/broker-b-s
mkdir -p /home/rocketmq/broker-a-s
mkdir -p /home/rocketmq/broker-b-s
如果创建不了 。root用户都说没权限的话。
cd /
sudo mount -uw /
再试试看下。
应为后面考虑到配置文件要写死ip。这里先创建网络嘚
docker network create --driver bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 mynet
解析:
–driver bridge 表示使用桥接模式
–subnet 172.18.0.0/16 表示子网ip 可以分配 172.18.0.2 到 172.18.255.255
–gateway 172.18.1.0 表示网关
mynet 表示网络名
删除网络(补充)
17.18.0.2 namesvr-a
17.18.0.3 namesvr-b
17.18.0.4 broker-a
17.18.0.5 broker-b
17.18.0.6 broker-a-s
17.18.0.7 broker-b-s
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=0
brokerIP1=172.18.0.4
brokerIP2=172.18.0.4
listenPort=10911
namesrvAddr=172.18.0.2:9876;172.18.0.3:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=0
brokerIP1=172.18.0.6
brokerIP2=172.18.0.6
listenPort=10911
namesrvAddr=172.18.0.2:9876;172.18.0.3:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
deleteWhen=04
fileReservedTime=48
brokerRole=SYNC_MASTER
flushDiskType=ASYNC_FLUSH
brokerClusterName=DefaultCluster
brokerName=broker-a
brokerId=1
brokerIP1=172.18.0.6
listenPort=10911
namesrvAddr=172.18.0.2:9876;172.18.0.3:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
brokerIP1=172.18.0.7
listenPort=10911
namesrvAddr=172.18.0.2:9876;172.18.0.3:9876
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
docker-compose文件详解 可参考:
docker-compose.yml文件详解
# 指定 compose 文件的版本
version: '3.5'
# 定义所有的 service 信息, services 下面的第一级别的 key 既是一个 service 的名称
services:
#自定义服务名称
namesrv-a:
# 指定 docker 镜像, 可以是远程仓库镜像、本地镜像
image: rocketmqinc/rocketmq:4.3.0
container_name: namesrv-a
#建立宿主机和容器之间的端口映射关系, ports 支持两种语法格式
ports:
- 9876:9876
# 定义容器和宿主机的卷映射关系, 其和 networks 一样可以位于 services 键的二级键和 compose 顶级键, 如果需要跨服务间使用则在顶级键定义, 在 services 中引用
volumes:
- /opt/rocketmq/logs/nameserver-a:/opt/logs
- /opt/rocketmq/store/nameserver-a:/opt/store
# 覆盖容器启动后默认执行的命令
command: sh mqnamesrv
# 定义 networks 信息
networks:
# v3.5 以上版本, 为此网络设置名称 就是刚刚创建网络时的名字
mynet:
# IP V4 格式地址
ipv4_address: 172.18.0.2
namesrv-b:
image: rocketmqinc/rocketmq:4.3.0
container_name: namesrv-b
ports:
- 9877:9876
volumes:
- /opt/rocketmq/logs/nameserver-b:/opt/logs
- /opt/rocketmq/store/nameserver-b:/opt/store
command: sh mqnamesrv
networks:
mynet:
ipv4_address: 172.18.0.3
broker-a:
image: rocketmqinc/rocketmq:4.3.0
container_name: broker-a
ports:
- 11913:10911
- 11914:10909
volumes:
- /opt/rocketmq/logs/broker-a:/opt/logs
- /opt/rocketmq/store/broker-a:/opt/store
- /home/rocketmq/broker-a.conf:/opt/rocketmq-4.3.0/conf/broker-a.conf
environment:
# 指定堆内存大小 https://blog.csdn.net/qq_35529258/article/details/112544700
MAX_POSSIBLE_HEAP: 268435456
TZ: Asia/Shanghai
NAMESRV_ADDR: "172.18.0.2:9876;172.18.0.3:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
command: sh mqbroker -c /opt/rocketmq-4.3.0/conf/broker-a.conf autoCreateTopicEnable=true &
# 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
links:
- namesrv-a
- namesrv-b
# 通过depends_on来标记依赖关系, 当namesrv-b服务启动完成后, 才会启动该服务;
depends_on:
- namesrv-a
networks:
mynet:
ipv4_address: 172.18.0.4
broker-a-s:
image: rocketmqinc/rocketmq:4.3.0
container_name: broker-a-s
ports:
- 11915:10911
- 11916:10909
volumes:
- /opt/rocketmq/logs/broker-a-s:/opt/logs
- /opt/rocketmq/store/broker-a-s:/opt/store
- /home/rocketmq/broker-a-s.conf:/opt/rocketmq-4.3.0/conf/broker-a-s.conf
environment:
# 指定堆内存大小 https://blog.csdn.net/qq_35529258/article/details/112544700
MAX_POSSIBLE_HEAP: 268435456
TZ: Asia/Shanghai
NAMESRV_ADDR: "172.18.0.2:9876;172.18.0.3:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
command: sh mqbroker -c /opt/rocketmq-4.3.0/conf/broker-a-s.conf autoCreateTopicEnable=true &
# 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
links:
- namesrv-a
- namesrv-b
# 通过depends_on来标记依赖关系, 当namesrv-b服务启动完成后, 才会启动该服务;
depends_on:
- namesrv-a
networks:
mynet:
ipv4_address: 172.18.0.5
broker-b:
image: rocketmqinc/rocketmq:4.3.0
container_name: broker-b
ports:
- 11911:10911
- 11909:10909
volumes:
- /opt/rocketmq/logs/broker-b:/opt/logs
- /opt/rocketmq/store/broker-b:/opt/store
- /home/rocketmq/broker-b.conf:/opt/rocketmq-4.3.0/conf/broker-b.conf
# 设置环境变量, environment 的值可以覆盖 env_file 的值 (等同于 docker run --env 的作用)
environment:
# 指定堆内存大小 https://blog.csdn.net/qq_35529258/article/details/112544700
MAX_POSSIBLE_HEAP: 268435456
TZ: Asia/Shanghai
NAMESRV_ADDR: "172.18.0.2:9876;172.18.0.3:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
command: sh mqbroker -c /opt/rocketmq-4.3.0/conf/broker-b.conf autoCreateTopicEnable=true &
# 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
links:
- namesrv-a
- namesrv-b
# 通过depends_on来标记依赖关系, 当namesrv-b服务启动完成后, 才会启动该服务;
depends_on:
- namesrv-b
networks:
mynet:
ipv4_address: 172.18.0.6
broker-b-s:
image: rocketmqinc/rocketmq:4.3.0
container_name: broker-b-s
ports:
- 11912:10911
- 11910:10909
volumes:
- /opt/rocketmq/logs/broker-b-s:/opt/logs
- /opt/rocketmq/store/broker-b-s:/opt/store
- /home/rocketmq/broker-b-s.conf:/opt/rocketmq-4.3.0/conf/broker-b-s.conf
environment:
# 指定堆内存大小 https://blog.csdn.net/qq_35529258/article/details/112544700
MAX_POSSIBLE_HEAP: 268435456
TZ: Asia/Shanghai
NAMESRV_ADDR: "172.18.0.2:9876;172.18.0.3:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms256m -Xmx256m -Xmn256m"
command: sh mqbroker -c /opt/rocketmq-4.3.0/conf/broker-b-s.conf autoCreateTopicEnable=true &
# 链接到其它服务中的容器, 该选项是 docker 历史遗留的选项, 目前已被用户自定义网络名称空间取代, 最终有可能被废弃 (在使用 swarm 部署时将忽略该选项)
links:
- namesrv-a
- namesrv-b
# 通过depends_on来标记依赖关系, 当namesrv-b服务启动完成后, 才会启动该服务;
depends_on:
- namesrv-b
networks:
mynet:
ipv4_address: 172.18.0.7
rocketmq-console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console
ports:
- 8090:8090
environment:
JAVA_OPTS: -Drocketmq.namesrv.addr=172.18.0.2:9876;172.18.0.3:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false
networks:
mynet:
ipv4_address: 172.18.0.8
networks:
mynet:
# 外部网络, 如果设置为 true 则 docker-compose up 不会尝试创建它, 如果它不存在则引发错误
external: true
docker-compose -f docker-compose.yml -p rocketmq up -d
-f 指定文件
-p 给创建的项目命名,不写的话好像是当前目录的名字
界面上展示效果
中间有碰见过个问题,broker启动一个另一个就容器自动停掉了。各种百度,最后发现是自己docker资源配置内存就只有2G…改成8G后就没毛病了。
docker ps
找到容器的CONTAINER ID
docker exec -it -u root id bash
以root进入容器
docker exec -it -u root xxxx bash
yum search ifconfig
yum install net-tools.x86_64
ifconfig
如图,namesrv-a 这个服务ip是172.18.0.2
网上是说brew 下载。我这下载太慢了。就官网下载了个。
官网下载地址
找个目录git拉取
git clone https://github.com/wojas/docker-mac-network.git
拉取完之后,在docker-mac-network目录下
vi helpers/run.sh
这图片这里 172.18.0.0 255.255.0.0
是网段和子网掩码。 我自己是给容器网段是172.18.0.0,所以配置为这个。
docker-compose -f docker-compose.yml up -d
界面上是
这个为啥一直启动不了,俺也不晓得了。看了下启动日志,也看不懂。
前往 /docker-mac-network/ 文件夹,发现多出一个 docker-for-mac. 文件,如下图 ps:注意下,这个生成这个文件。感觉挺久了。可以多等下
在docker-for-mac.o文件中添加一行
comp-lzo yes
然后 打开docker-for-mac.o 。它会用tunnelblick打开。然后配置进去
连接
然后就可以ping通了
个人比较奇怪的就是。配置完一遍之后,就一直能链接了。不是很懂…
浏览器登录:http://172.18.0.8:8080/
上面安装的mq是 4.3。但是代码层面上使用的client是4.1。就会下面链接的问题。
https://blog.csdn.net/whhwkm/article/details/81783322