这里加上了3-management (这个版本是带web管理界面的,拉取时冒号后面表示指定版本) ,便于管理。
docker pull rabbitmq:3-management
大家搜索镜像文件时,可直接到Docker的商店搜索,地址为:https://hub.docker.com/,RabbiMQ的相关镜像为:https://hub.docker.com/_/rabbitmq/,查看tags,可查看版本信息。
docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
这里主要做了端口映射
如果需要配置文件持久化,加上 " -v $PWD/data:/data " (将主机中当前目录下的data挂载到容器的/data)
docker ps
docker stop xxxxxx (xxxx表示容器container id,关掉容器后,再用ps是查看不到的)
查看所有的docker无论运不运行
docker ps -a
docker rm xxxxxx (才是真正删除容器)
docker logs xxxxxxx
使用ip addr 可查看到容器的虚拟IP
Docker默认的存放空间是很小的,很容易导致磁盘满而挂载不了程序
方法一、软链接
默认情况下Docker的存放位置为:/var/lib/docker
可以通过下面命令查看具体位置:
sudo docker info | grep "Docker Root Dir"
解决这个问题,最直接的方法当然是挂载分区到这个目录,但是我的数据盘还有其他东西,这肯定不好管理,所以采用修改镜像和容器的存放路径的方式达到目的。
这个方法里将通过软连接来实现。
首先停掉Docker服务:
systemctl restart docker或者service docker stop
然后移动整个/var/lib/docker目录到目的路径:
mv /var/lib/docker /root/data/docker
ln -s /root/data/docker /var/lib/docker
这时候启动Docker时发现存储目录依旧是/var/lib/docker,但是实际上是存储在数据盘的,你可以在数据盘上看到容量变化。
或创建一个docker容器组所有的集群使用:
[root@VM_0_9_centos ~]# docker run -it -v /test --name dbdata1 centos
创建一个名叫dbdata1的容器,将数据卷挂载到/test下,
接下来创建两个新的容器,并且
[root@VM_0_9_centos test]# docker run -it --volumes-from dbdata1 --name db1 centos
[root@VM_0_9_centos test]# docker run -it --volumes-from dbdata1 --name db2 centos
然后在
db2中做如下的修改:
[root@75ea710d224c /]# cd test
[root@75ea710d224c test]# touch simple
[root@75ea710d224c test]# ls
在db2中作出的改动可以直接在db1中看到。
1.1 下载docker运行环境
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1.2 添加镜像下载地址
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
1.3 安装docker
sudo yum install docker-ce
1.4 启用docker
sudo systemctl start docker
1.5 设为开机自启动
sudo systemctl enable docker
1.6 添加docker 国内镜像
vi /etc/docker/daemon.json
{
“registry-mirrors”:[“https://registry.docker-cn.com”]
}
1.7 重启配置
sudo systemctl daemon-reload
1.8 重启docker
sudo systemctl restart docker
2.1 下载镜像(视具体应用)
docker pull rabbitmq:3.6.15-management
2.2 查看下载的镜像:3.6.15-management表示带web管理界面
docker images
2.3 启动RabbitMQ
docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3.6.15-management
参数说明:
-d 后台进程运行
hostname RabbitMQ主机名称
name 容器名称
-p port:port 本地端口:容器端口
-p 15672:15672 http访问端口
-p 5672:5672 amqp访问端口
2.4 查看docker
docker ps
2.5 注意事项
这里有一个需要注意,记得配置下hosts,在127.0.0.1里加上本机的名称。erlang进程需要host来进行连接,所以它会检查你的hosts配置。还需要设置下防火墙,三个端口要打开。15672是管理界面用的,25672是集群之间使用的端口,4369是erlang进程epmd用来做node连接的。
方案一:手动布署(记得做几个端口映射:4369,5671,5672,15671,15672,25672)
3.1 进入docker 并配置 rabbitmq
docker exec -it 容器名称 /bin/bash
3.2 对rabbitmq进行配置
3.2.1 添加账号:
rabbitmqctl add_user admin admin
3.2.2 添加 权限tag
rabbitmqctl set_user_tags admin administrator
3.2.3 配置一个集群cookie
cd 到你的home目录下,我是在root下,里面有一个隐藏的.erlang.cookie文件,这就是我在前面介绍erlang时候提到的,这个文件是erlang用来发现和互连的基础。我们需要做的很简单,将两个节点中的.erlang.cookie设置成一样的。这是erlang的约定,一样的cookie hash key他认为是合法和正确的连接。
cd /root/ 进入目录
chmod u+w .erlang.cookie 将只读改为可编辑
vim .erlang.cookie 修改.erlang.cookie 写入一个字符串,需确保集群内所有机器的字符串都是相同的,不然集群建不起来
mycookie158
vim /etc/hosts 修改hosts文件,集群是以节点名为依据的,所有需把集群里的机器加到hosts文件中
192.168.0.107 rabbitmq_node2
192.168.0.105 rabbitmq_node1
3.2.4 选择一个节点stop,然后连接到另外节点。
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@rabbitmq_node2
Clustering node rabbit@rabbitmq_node1 with rabbit@rabbitmq_node2 …
rabbitmqctl start_app
节点已经连接成功。
3.2.5 生成docker
docker commit 容器编号 stonerabbitmq stonerabbitmq为镜像名,需为全小写
docker images 可查看到生成为一个新的stonerabbitmq,这时可以关掉原镜像,使用新的镜像
方案二:
3.1 rabbitmq集群建立需要解析主机名,因此需要一台内网DNS,存在以下记录(或者修改容器的hosts文件)
vi /etc/hosts 修改hosts文件,集群是以节点名为依据的,所有需把集群里的机器加到hosts文件中
10.1.7.222 yhrabbit1
10.1.7.223 yhrabbit2
这个是在主机上设备的,不是在docker里设置的,另外主机名需对应机器的hostname,可用 hostname查询机器名,如果为localhost的话名称可以随意命名,名外hostname如果带域名的话,需保证集群的机器是在同一个域里,所以不要后面随意带域名.
abbitmq集群是基于erlang集群的,而erlang集群中各节点间的通信是通过4369端口和25672端口来进行通信的,
所以:防火墙打开4369端口和25672端口
firewall-cmd --permanent --add-port=4369/tcp
firewall-cmd --permanent --add-port=25672/tcp
firewall-cmd --reload
3.2建立目录用于存储rabbitmq容器数据
mkdir /data/rabbitmq
chmod 775 -R /data/rabbitmq
3.3 在docker主机上创建容器一号机
docker run -d --hostname yhrabbit1
–add-host=“yhrabbit1”:10.1.7.222
–add-host=“yhrabbit2”:10.1.7.223
–name rabbit1
–log-opt max-size=10m
–log-opt max-file=10
-p “4369:4369”
-p “5671:5671”
-p “5672:5672”
-p “15671:15671”
-p “15672:15672”
-p “25672:25672”
-v /data/rabbitmq:/var/lib/rabbitmq:z
-e RABBITMQ_DEFAULT_USER=admin
-e RABBITMQ_DEFAULT_PASS=123456
-e RABBITMQ_ERLANG_COOKIE=‘yh-rabbitmq’
rabbitmq:3.6.15-management
参数说明
-d
容器后台运行
–hostname yhrabbit1
容器的主机名为 yhrabbit1,容器内部的hostname
–add-host=“yhrabbit1”:10.1.7.222
–add-host=“yhrabbit2”:10.1.7.223
修改容器内部的hosts,没有dns服务器的话就这么改
–name rabbit1
容器名为rabbit2,在宿主机上运行“docker ps”命令时显示的名称
–log-opt max-size=10m
日志文件单个最大10M
–log-opt max-file=10
日志文件最多保留10个
-p “4369:4369”
映射宿主机端口4369到容器端口4369,主机端口在前
-p “5671:5671”
略
-p “5672:5672”
略
-p “15671:15671”
略
-p “15672:15672”
略
-p “25672:25672”
略
-v /data/rabbitmq:/var/lib/rabbitmq:z
将宿主机目录/data/rabbitmq挂载到容器的/var/lib/rabbitmq目录。z是一个标记,在selinux环境下使用。
-e RABBITMQ_DEFAULT_USER=user01
设置rabbitmq默认用户为user01
-e RABBITMQ_DEFAULT_PASS=password01
设置rabbitmq默认密码为password01
-e RABBITMQ_ERLANG_COOKIE=‘yh-rabbitmq’
设置rabbitmq的cookie为“secret cookie here”,可以自定义为其他文本,整个集群里的cookie需相同。Erlang Cookie值必须相同,也就是RABBITMQ_ERLANG_COOKIE参数的值必须相同,原因见下文“配置相同Erlang Cookie”部分;
rabbitmq:3.6.15-management
使用rabbitmq:3.6.15-management这个镜像
3.4 在docker主机上创建容器二,用于镜像备份
docker run -d --hostname yhrabbit2
–add-host=“yhrabbit1”:10.1.7.222
–add-host=“yhrabbit2”:10.1.7.223
–name rabbit2
–log-opt max-size=10m
–log-opt max-file=10
-p “4369:4369”
-p “5671:5671”
-p “5672:5672”
-p “15671:15671”
-p “15672:15672”
-p “25672:25672”
-v /data/rabbitmq:/var/lib/rabbitmq:z
-e RABBITMQ_DEFAULT_USER=admin
-e RABBITMQ_DEFAULT_PASS=123456
-e RABBITMQ_ERLANG_COOKIE=‘yh-rabbitmq’
rabbitmq:3.6.15-management
3.5配置容器
配置一号机
docker exec -it efc2e143a9c9 /bin/bash
rabbitmqctl set_user_tags admin administrator
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc //配成文件方式持久化
rabbitmqctl start_app
配置二号机
docker exec -it 87e8955bca65 /bin/bash
rabbitmqctl set_user_tags admin administrator
rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@yhrabbit1 //以内存节点方式加入,如果需要持久化,把–ram去掉
rabbitmqctl start_app
3.6制作镜像模式
1.可在页面上配置
登陆 http://10.1.7.222:15672/#/policies ,点"Admin"分页,在分页右侧选"policies"进行配置即可
参数解释:
name: 为策略名称?,我命名为xxxxxx
Pattern:为匹配符,只有一个^代表匹配所有,^zlh为匹配名称为zlh的exchanges或者queue,这里我设置为匹配全部
Apply to:使用对象
Priority:配置了多个策略时候的优先级,值越大,优先级越高。(单个策略配置意义不大)
注意:没有指定优先级的消息会将优先级以0对待。 对于超过优先级队列所定最大优先级的消息,优先级以最大优先级对待
Definition:为匹配类型,他分为3种模式:all-所有(所有的queue),exctly-部分(需配置ha-params参数,此参数为int类型比如3,众多集群中的随机3台机器),nodes-指定(需配置ha-params参数,此参数为数组类型比如[“3rabbit@F”,“rabbit@G”]这样指定为F与G这2台机器。)ha-mode: all
2.用命令行方式
./rabbitmqctl set_policy [-p ] [–apply-to ]
name: 策略名称
vhost: 指定vhost, 默认值
pattern: 需要镜像的正则
definition:
ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
all:表示在集群所有的节点上进行镜像,无需设置ha-params
exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params: ha-mode 模式需要用到的参数
ha-sync-mode: 镜像队列中消息的同步方式,有效值为automatic,manually
apply-to: 可选值3个,默认all
exchanges:表示镜像 exchange (并不知道意义所在)
queues:表示镜像 queue
all:表示镜像 exchange和queue
例子
rabbitmqctl set_policy test “test” ‘{“ha-mode”:“all”,“ha-sync-mode”:“automatic”}’
4.负载均衡 HAProxy
5.Docker集群Swarm
Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。
3.3 查看docker运行情况
docker logs -f 容器编号
2.5 设定重启机器时.docker里的容器自启动
在使用docker run启动容器时,使用–restart参数来设置:
sudo docker run --restart=on-failure:10 redis 容器名称或其它参数
–restart具体参数值详细信息:
no - 容器退出时,不重启容器;
on-failure - 只有在非0状态退出时才从新启动容器;
always - 无论退出状态是如何,都重启容器;
还可以在使用on - failure策略时,指定Docker将尝试重新启动容器的最大次数。默认情况下,Docker将尝试永远重新启动容器。
如果创建时未指定 --restart=always ,可通过update 命令
docker update --restart=always 容器编号
3.安装Rabbitmq双机热备
3.1 硬件支持:路由器只要支持VRRP(虚拟路由器冗余协议),可直接使用路由器硬件支持双机热备.如今的路由器基本上都支持一个叫做
VRRP(虚拟路由冗余协议),这一协议的作用你可以理解成把网关IP虚拟化成一个网关IP集群,就好像兽族剑圣的镜像技能,这里面有master,也有slave,
然后局域网内的主机设置的都是虚拟的masterIP(VIP),刚好keepealived就是一个实现VRRP的一款应用程序
3.2 软件支持: