[root@localhost ~]# docker stop 30               //停止nginx容器
 30
 [root@localhost ~]# docker ps --all
 CONTAINER ID   IMAGE          COMMAND                   CREATED        STATUS                      PORTS                                                  NAMES
 b3cda6d78880   mysql:5.7.44   "docker-entrypoint.s…"   16 hours ago   Up 4 minutes                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   vigilant_cray
 a425c7feff30   java:v0        "/usr/local/jdk/bin/…"   2 days ago     Up 4 minutes                0.0.0.0:8080->8080/tcp, :::8080->8080/tcp              upbeat_lamarr
 3035a713b57e   nginx:latest   "/docker-entrypoint.…"   3 days ago     Exited (0) 30 seconds ago                                                          compassionate_mayer
 [root@localhost ~]# docker rm 30                        //删除nginx容器
 30
1.创建三个nginx容器
 说明:
1.端口不能映射80
 2.现在在远程是无法访问nginx服务的,现在创建nginx服务的集群,这个集群被haproxy代理,创建三个nginx容器,一个haproxy容器,必须给nginx容器指定名称,如果web0,web1,web2没有名称,就无法被link
 [root@localhost ~]# docker run -itd --name=web0 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest 
 83f463c242e492dbf2298fc04d1555b2d2eead5288c31a87737138f3beb48e30
 [root@localhost ~]# docker run -itd --name=web1 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest 
 2f40af73a44c6b251a5be480a49c8c2b09af1f7bc67346b44f5a733dd6485a6d
 [root@localhost ~]# docker run -itd --name=web2 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest 
 457b47245dfff34dbf6dee787152e144087fbf18437eddfabc5fdc22735004ac
2.拉取haproxy镜像
 https://www.haproxy.com/documentation/haproxy-enterprise/getting-started/tutorials/docker-tutorial/#sidebar
[root@localhost ~]# docker pull haproxy                         //拉取haproxy镜像
 [root@localhost ~]# 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    231MB
 [root@localhost ~]# yum -y install haproxy                 //在宿主机上下载haproxy,用来测试并且网haproxy容器中传文件,因为刚刚拉取的haproxy镜像小,其中许多命令都没有
3.创建haproxy容器
[root@localhost ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bash      //创建haproxy容器
 b6afb365f151e3f05e0cfaf357acf4d4c9a408079cfd87cb268b41637b8da81a
 [root@localhost ~]# vim /etc/haproxy/haproxy.cfg               //本机编辑haproxy配置文件
 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 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@localhost ~]# docker cp /etc/haproxy/haproxy.cfg b6:/usr/local/etc/haproxy/          //将该文件传给haproxy容器
 Successfully copied 5.12kB to b6:/usr/local/etc/haproxy/
 [root@localhost ~]# docker attach b6                           //进入容器
 haproxy@b6afb365f151:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg       //启动服务,因为没有写入守护进程,所以只能用这条指令
 浏览器访问:192.168.1.80:5000
4.link
容器重启以后,ip地址会发生变化,使用link连接他们,这样的话无论web0,web1,web2的ip为多少,都能启动服务
[root@localhost ~]# docker stop b6
 [root@localhost ~]# docker rm b6
[root@localhost ~]# vim /etc/haproxy/haproxy.cfg

 [root@localhost ~]# 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
浏览器访问:192.168.1.80:5000
 5.添加统计页面
[root@localhost ~]# docker stop f6
 f6
 [root@localhost ~]# docker rm f6
 f6
 [root@localhost ~]# 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            //把配置文件中关于统计页面的端口也映射出去 
 91c0a31435939056d6fe0cf20fd6a3d53854b27a76f5f6c1bc54e903609c2529
浏览器访问:192.168.1.80:8888/dbs 用户名:admin 密码:123456


6.重启docker测试
[root@localhost ~]# systemctl restart docker
 [root@localhost ~]# 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
浏览器测试:192.168.1.80:8888/dbs
     
练习:使用haproxy代理java
 [root@localhost ~]# docker stop a4                     //停掉原来的java容器,然后创建三个java容器
 a4
 [root@localhost ~]# docker run -itd --name=java0 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
 fb37b57acebd452fb44d95142888b3ce52ff347a387cae6b2499cf75030c9715
 [root@localhost ~]# docker run -itd --name=java1 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
 a0a9ddf1b47db327eeb2ef8a2ff3915b8d274cc7f27e802b87f71fa068bb3a8e
 [root@localhost ~]# docker run -itd --name=java2 java:v0 /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
 0f6c041fd2dafa98c67f24bb266c468d458f03bf73785c2e6f40c5f2ec2a4592
 [root@localhost ~]# 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@localhost ~]# docker stop 91                     //停掉之前的haproxy容器
 91
 [root@localhost ~]# 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@localhost ~]# systemctl restart docker             //重启docker
 [root@localhost ~]# docker start java0 java1 java2 web0 web1 web2 vigilant_cray vibrant_noether      //启动所有容器
 java0
 java1
 java2
 web0
 web1
 web2
 vigilant_cray                             //mysql容器
 vibrant_noether                      //haproxy容器
 浏览器测试

7.ab压力测试:
 [root@localhost ~]# 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@localhost ~]# yum -y install httpd-tools.x86_64 //安装它
[root@localhost ~]# ab -n 100 -c 10 http://localhost:5000/ //测试,-n指定总共要发送的请求数,-c指定并发请求的数量
