1、概述:
即nmt服务,涉及到的服务有:nginx、mysql、tomcat
2、具体配置:(前提:先停掉然后之前运行的容器)
1)先创建三个nginx容器
# 端⼝不能映射80
[root@docker ~]# docker run -itd -v /root/pes/web/src/dist/:/usr/share/nginx/htm l/ nginx:latest
# 现在在远程是⽆法访问nginx服务,⽽且现在也不希望外部 直接访问nginx,希望创建nginx服务的集群,这个集群被 haproxy代理,创建三个nginx容器,创建⼀个haproxy服 务,⽽且nginx容器还需要指定名称,web0 web1 web2因为 如果没有名称,那么容器就⽆法被haproxy --link
[root@docker ~]# docker run -itd --name=web0 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
83f463c242e492dbf2298fc04d1555b2d2eead5288c31a87737138f3beb48e30
[root@docker ~]# docker run -itd --name=web1 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
2f40af73a44c6b251a5be480a49c8c2b09af1f7bc67346b44f5a733dd6485a6d
[root@docker ~]# docker run -itd --name=web2 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
457b47245dfff34dbf6dee787152e144087fbf18437eddfabc5fdc22735004ac
2) 启动haproxy容器 hap0
[root@docker ~]# docker pull haproxy //拉取haproxy镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
java v0 46529fd5a4b2 2 days ago 774MB
nginx latest 5ef79149e0ec 2 weeks ago 188MB
haproxy latest 4e5bebb0fd91 7 weeks ago 103MB
mysql 5.7.44 5107333e08a8 8 months ago 501MB
centos latest 5d0da3dc9764 2 years ago 23MB
[root@docker ~]#yum -y install haproxy[root@docker ~]#docker run -itd -p5000:5000 haproxy:latest /bin/bash //创建haproxy容器
[root@docker ~]#vim /etc/haproxy/haproxy.cfg //编辑配置文件
global
daemon
# nbproc 1
# pidfile /var/run/haproxy.pid
# 工作目录
# chroot /usr/local/etc/haproxydefaults
log 127.0.0.1 local0 err #[err warning info debug]
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull #日志中不记录负载均衡的心跳检测记录
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #心跳检测超时######## 监控界面配置 #################
listen admin_status
# 监控界面访问信息
bind 0.0.0.0:8888
mode http
# URI相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
########frontend配置###################### mysql负载均衡配置 ###############
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server MYSQL_1 192.168.130.100:3306 check weight 1 maxconn 2000
server MYSQL_2 192.168.130.101:3306 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
################################################# mysql负载均衡配置 ###############
listen proxy-web
bind 0.0.0.0:5000
mode http
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server web0 172.17.0.5:80 check weight 1 maxconn 2000
server web1 172.17.0.7:80 check weight 1 maxconn 2000
server web2 172.17.0.6:80 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
[root@docker ~]# docker cp /etc/haproxy/haproxy.cfg b6:/usr/local/etc/haproxy/ //将该文件传给haproxy容器
Successfully copied 5.12kB to b6:/usr/local/etc/haproxy/
[root@docker ~]# docker attach b6 //进入容器
haproxy@b6afb365f151:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg//启动服务,因为没有写入守护进程,
浏览器访问:192.168.71.10:5000
3)在宿主机上安装了haproxy,配置代理三个的 nginx容器中的web服务,也是直接添加容器的ip地址
[root@docker ~]#systemctl start haproxy
# 创建⼀个haproxy,将配置⽂件导⼊到容器,在容器 中启动haproxy,也是可以的
[root@docker ~]#docker cp /root/pes/haproxy/haproxy.cfg 容器名 称|id:/usr/local/etc/haproxy/haproxy. cfg # 启动 haproxy -f /usr/local/etc/haproxy/haproxy.cfg
# 实际的使⽤haproxy容器,只需要将配置⽂件挂载到 指定的⽬录就可以
docker run -itd #交互 终端 后台 --link=web0 锚定web0 --link=web1 --link=web2 -p5000:5000 -v #/root/pes/haproxy/haproxy.cfg:/usr/l ocal/etc/haproxy/haproxy.cfg # 将配置⽂件挂载到容器中 haproxy:latest #镜像
[root@docker ~]#docker stop b6
[root@docker ~]#docker rm b6
[root@docker ~]#vim /etc/haproxy/haproxy.cfg
[root@docker ~]#docker run -itd --link=web0 --link=web1 --link=web2 -p5000:5000 -v /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest //挂载本机的haproxy配置文件
f614ab4d4b7e10bf2ccb88ad8d0acece4189a629923351a68a431d82dd747f16
4)添加统计页面
[root@docker ~]# docker stop f6
f6
[root@docker ~]# docker rm f6
f6
[root@docker ~]# docker run -itd --link=web0 --link=web1 --link=web2 -p5000:5000 -p8888:8888 -v /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
浏览器访问:192.168.71.100:8888/dbs 用户名:admin 密码:123456
5)重启服务,进行测试
[root@docker ~]# systemctl restart docker
[root@docker ~]# docker start upbeat_lamarr vigilant_cray web0 web1 web2 eloquent_newton //haproxy这个容器必须在web0,web1,web2之后启动(被link的容器要先启动)
upbeat_lamarr
vigilant_cray
web0
web1
web2
eloquent_newton
浏览器测试:1921.68.71.10:8888/dbs
拓展:haproxy代理java
[root@docker ~]# docker stop a4 //停掉原来的java容器,然后创建三个java容器
a4
[root@docker ~]# docker run -itd --name=java0 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
fb37b57acebd452fb44d95142888b3ce52ff347a387cae6b2499cf75030c9715
[root@docker ~]# docker run -itd --name=java1 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
a0a9ddf1b47db327eeb2ef8a2ff3915b8d274cc7f27e802b87f71fa068bb3a8e
[root@docker ~]# docker run -itd --name=java2 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
0f6c041fd2dafa98c67f24bb266c468d458f03bf73785c2e6f40c5f2ec2a4592
[root@docker ~]# vim /etc/haproxy/haproxy.cfg //把java的加进去
global
daemon
# nbproc 1
# pidfile /var/run/haproxy.pid
# 工作目录
# chroot /usr/local/etc/haproxy
defaults
log 127.0.0.1 local0 err #[err warning info debug]
mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option dontlognull #日志中不记录负载均衡的心跳检测记录
maxconn 4096 #默认的最大连接数
timeout connect 5000ms #连接超时
timeout client 30000ms #客户端超时
timeout server 30000ms #服务器超时
#timeout check 2000 #=心跳检测超时
######## 监控界面配置 #################
listen admin_status
# 监控界面访问信息
bind 0.0.0.0:8888
mode http
# URI相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
########frontend配置##############
######## mysql负载均衡配置 ###############
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server MYSQL_1 192.168.130.100:3306 check weight 1 maxconn 2000
server MYSQL_2 192.168.130.101:3306 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
######## mysql负载均衡配置 ###############
listen proxy-web
bind 0.0.0.0:5000
mode http
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server web0 web0:80 check weight 1 maxconn 2000
server web1 web1:80 check weight 1 maxconn 2000
server web2 web2:80 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
######## java负载均衡配置 ###############
listen proxy-java
bind 0.0.0.0:8080
mode tcp
# 负载均衡算法
# static-rr 权重, leastconn 最少连接, source 请求IP, 轮询 roundrobin
balance roundrobin
# 日志格式
option tcplog
# 在 mysql 创建一个没有权限的haproxy用户,密码为空。 haproxy用户
# create user 'haproxy'@'%' identified by ''; FLUSH PRIVILEGES;
#option mysql-check user haproxy
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server java0 java0:8080 check weight 1 maxconn 2000
server java1 java1:8080 check weight 1 maxconn 2000
server java2 java2:8080 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
[root@docker ~]# docker stop 91
91
[root@docker ~]# docker run -itd --link=web0 --link=web1 --link=web2 --link=java0 --link=java1 --link=java2 -p8080:8080 -p5000:5000 -p8888:8888 -v /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest //把java容器也link了,端口映射出去
04e061227170e8bc9b3a2c94b3fafcfba02084ccdffde8ac176d6ce70622330c
[root@docker ~]# systemctl restart docker //重启docker
[root@docker ~]# docker start java0 java1 java2 web0 web1 web2 vigilant_cray vibrant_noether
java0
java1
java2
web0
web1
web2
vigilant_cray //mysql容器
vibrant_noether //haproxy容器
浏览器测试
ab压力测试:
[root@docker ~]# yum provides */bin/ab //查找哪个包下有ab这个命令
httpd-tools-2.4.6-99.el7.centos.1.x86_64 : Tools for use with the Apache HTTP Server
源 :@updates
匹配来源:
文件名 :/usr/bin/ab
[root@docker ~]# yum -y install httpd-tools.x86_64
[root@docker ~]# ab -n 100 -c 10 http://localhost:5000/ //测试,-n指定总共要发送的请求数,-c指定并发请求的数量