配置高可用的项目
基于部署考试系统的项目进行高可用
一、前端的高可用
1.先创建三个前端nginx容器,端口不能映射80
# 删除通用的前端容器
[root@haproxy ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f3ed10aa6fc java:v0 "/bin/bash" 7 minutes ago Up 7 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp gracious_tharp
c9abaa798fcf mysql:5.7.44 "docker-entrypoint.s…" 12 minutes ago Up 12 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp focused_aryabhata
# 创建web01容器
[root@haproxy ~]# docker run -itd --name web01 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
9c40a2df1d7bc58f73737e8c84d0603e531f3e13173e6e25981f03fa5d9dda91
# 进到web01容器
[root@haproxy ~]# docker exec -it web01 /bin/bash
# 进行访问测试
root@9c40a2df1d7b:/# curl localhost
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
<script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
# ctrl + p + q 退出不中断
root@9c40a2df1d7b:/# read escape sequence
# 创建web02容器
[root@haproxy ~]# docker run -itd --name web02 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
1dc4276bdfcf974b1f1467e0c7225dcf880ee2da8e1b44caee06fce986f76e99
# 进到web02容器
[root@haproxy ~]# docker exec -it web02 /bin/bash
# 进行访问测试
root@1dc4276bdfcf:/# curl localhost
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
<script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
# ctrl + p + q 退出不中断
root@1dc4276bdfcf:/# read escape sequence
# 创建web03容器
[root@haproxy ~]# docker run -itd --name web03 -v /root/project_exam_system/web/dist/:/usr/share/nginx/html nginx:latest
cea53a5ef797bf2df312454cfb4344b6f21beb42125c20583ba686538a2be858
# 进到web03容器
[root@haproxy ~]# docker exec -it web03 /bin/bash
# 进行访问测试
root@cea53a5ef797:/# curl localhost
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
<script type="module" crossorigin src="/assets/index-C4kAShR5.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-CSz7ARPP.css">
</head>
<body>
<div id="app"></div>
</body>
</html>
# ctrl + p + q 退出不中断
root@cea53a5ef797:/# read escape sequence
# 拉取haproxy镜像
[root@haproxy ~]# docker pull haproxy
Using default tag: latest
latest: Pulling from library/haproxy
Digest: sha256:3ab695ae94fb960da08947bb6d9ccb12e8237d7813c711beaf93a5310d150474
Status: Image is up to date for haproxy:latest
docker.io/library/haproxy:latest
# 使用haproxy镜像创建容器
[root@haproxy ~]# docker run -itd -p5000:5000 haproxy:latest /bin/bash
29e4a9f777f0fc6048e4f15b837b593732a96e1db2f6d428d4e732fea2158bbf
# 编辑haproxy.cfg文件
[root@haproxy ~]# vim haproxy.cfg
# 这里是容器中的IP地址,由于配置的是轮询roundrobin,weight 权重其实没有生效
server web0 web01:80 check weight 1 maxconn 2000
server web1 web02:80 check weight 1 maxconn 2000
server web2 web03:80 check weight 1 maxconn 2000
# 将修改后的haproxy.cfg传到用haproxy创建的容器中
[root@haproxy ~]# docker cp /root/haproxy.cfg 29:/usr/local/etc/haproxy
Successfully copied 5.12kB to 29:/usr/local/etc/haproxy
# 挂载这个容器的终端
[root@haproxy ~]# docker attach 29
# 查看文件
haproxy@29e4a9f777f0:~$ ls /usr/local/etc/haproxy/haproxy.cfg
/usr/local/etc/haproxy/haproxy.cfg
# 在容器中运行这个文件
haproxy@29e4a9f777f0:~$ haproxy -f /usr/local/etc/haproxy/haproxy.cfg
[NOTICE] (8) : haproxy version is 3.0.3-95a607c
[NOTICE] (8) : path to executable is /usr/local/sbin/haproxy
[ALERT] (8) : config : [/usr/local/etc/haproxy/haproxy.cfg:67] : 'server proxy-web/web0' : could not resolve address 'web01'.
[ALERT] (8) : config : [/usr/local/etc/haproxy/haproxy.cfg:68] : 'server proxy-web/web1' : could not resolve address 'web02'.
[ALERT] (8) : config : [/usr/local/etc/haproxy/haproxy.cfg:69] : 'server proxy-web/web2' : could not resolve address 'web03'.
[ALERT] (8) : config : Failed to initialize server(s) addr.
2.使用浏览器访问:192.168.2.20
出现前端页面
3.使用haproxy对web容器进行高可用
# 删除之前使用haproxy创建的容器
[root@haproxy ~]# docker stop 29
29
[root@haproxy ~]# docker rm 29
29
# 创建使用haproxy高可用三个web前端的容器
[root@haproxy ~]# docker run -itd --link=web01 --link=web02 --link=web03 -p5000:5000 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
7848bd08f685cf69deb5cd01467ad7c4123b191617001eab100732e4368f0746
# -itd 交互 终端 后台
# link 锚定web容器
# v 将配置文件挂载到容器中
# 查看创建的容器
[root@haproxy ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7848bd08f685 haproxy:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp suspicious_villani
7a0f856ed053 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp web03
db4c5ce94e76 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp web02
1d99e2005bd9 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 80/tcp web01
0f3ed10aa6fc java:v0 "/bin/bash" 48 minutes ago Up 48 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp gracious_tharp
c9abaa798fcf mysql:5.7.44 "docker-entrypoint.s…" 53 minutes ago Up 53 minutes 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp focused_aryabhata
4.浏览访问:192.168.2.20:5000
5.调用haproxy的监控界面
# 删除之前创建的容器
[root@haproxy ~]# docker stop 78
78
[root@haproxy ~]# docker rm 78
78
# 查看监控界面配置
[root@haproxy ~]# vim haproxy.cfg
######## 监控界面配置 #################
listen admin_status
# 监控界面访问信息
bind 0.0.0.0:8888
mode http
# URI相对地址
stats uri /dbs
# 统计报告格式
stats realm Global\ statistics
# 登录账户信息
stats auth admin:123456
# 创建可以监控的高可用容器
[root@haproxy ~]# docker run -itd --link=web01 --link=web02 --link=web03 -p5000:5000 -p8888:8888 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
cb32ed855f59a3bfd9770f93f3dce5c12b2fceff30e6b4b09bb8e39ae9cba735
# 查看创建的容器
[root@haproxy ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb32ed855f59 haproxy:latest "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp happy_chatelet
7a0f856ed053 nginx:latest "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 80/tcp web03
db4c5ce94e76 nginx:latest "/docker-entrypoint.…" 20 minutes ago Up 20 minutes 80/tcp web02
1d99e2005bd9 nginx:latest "/docker-entrypoint.…" 21 minutes ago Up 21 minutes 80/tcp web01
0f3ed10aa6fc java:v0 "/bin/bash" About an hour ago Up About an hour 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp gracious_tharp
c9abaa798fcf mysql:5.7.44 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp focused_aryabhata
6.浏览器访问测试
(1)高可用后的前端页面
192.168.2.20:5000
(2)监控页面
192.168.2.20:8888/dbs
二、java容器的高可用
1.java容器的高可用
# 删除通用的java容器
[root@haproxy ~]# docker stop 0f
0f
[root@haproxy ~]# docker rm 0f
0f
# 查看目前的容器
[root@haproxy ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb32ed855f59 haproxy:latest "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp happy_chatelet
7a0f856ed053 nginx:latest "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 80/tcp web03
db4c5ce94e76 nginx:latest "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 80/tcp web02
1d99e2005bd9 nginx:latest "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 80/tcp web01
c9abaa798fcf mysql:5.7.44 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp focused_aryabhata
# 创建三个java容器
[root@haproxy ~]# docker run -itd --name java0 java:v0
beb08466361480064fac9e66426b679e0cb4b9dc00d624c5d90f689b75002b98
[root@haproxy ~]# docker run -itd --name java1 java:v0
7574e7d3756f5d2e5b06a718433b84027559d8c9b82d10c1be2639542541c819
[root@haproxy ~]# docker run -itd --name java2 java:v0
658ef09ab2fb35a0184a3d5f2f3548bf0fc29834a8db15184d7cf6f98a005a59
# 查看创建的容器
[root@haproxy ~]# docker ps --all
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
658ef09ab2fb java:v0 "/bin/bash" 37 seconds ago Up 36 seconds java2
7574e7d3756f java:v0 "/bin/bash" 40 seconds ago Up 40 seconds java1
beb084663614 java:v0 "/bin/bash" 2 minutes ago Up 2 minutes java0
cb32ed855f59 haproxy:latest "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp happy_chatelet
7a0f856ed053 nginx:latest "/docker-entrypoint.…" 27 minutes ago Up 27 minutes 80/tcp web03
db4c5ce94e76 nginx:latest "/docker-entrypoint.…" 27 minutes ago Up 27 minutes 80/tcp web02
1d99e2005bd9 nginx:latest "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 80/tcp web01
c9abaa798fcf mysql:5.7.44 "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp focused_aryabhata
# 修改haproxy.cfg配置文件
[root@haproxy ~]# vim haproxy.cfg
# 在最后一行添加内容
listen proxy-java
bind 0.0.0.0:8080
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 java0:8080 check weight 1 maxconn 2000
server web1 java1:8080 check weight 1 maxconn 2000
server web2 java2:8080 check weight 1 maxconn 2000
#server MYSQL_3 192.168.130.102:3306 check weight 1 maxconn 2000
# 使用keepalive检测死链
# option tcpka
#########################################
# 查看5000端口有没有被占用
[root@haproxy ~]# netstat -lntup|grep 8888
tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 22318/docker-proxy
tcp6 0 0 :::8888 :::* LISTEN 22323/docker-proxy
# 删除之前的web容器的高可用容器
[root@haproxy ~]# docker stop cb
cb
[root@haproxy ~]# docker rm cb
cb
# 5000端口没有被占用了
[root@haproxy ~]# netstat -lntup|grep 8888
# 创建web容器和java容器的高可用容器
[root@haproxy ~]# docker run -itd --link=web01 --link=web02 --link=web03 --link=java0 --link=java1 --link=java2 -p5000:5000 -p8080:8080 -p8888:8888 -v /root/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg haproxy:latest
289cefc3caaf0154e54f75cc15d175d1b7d322b64fa0425f1a828e213397a478
2.监控界面显示java容器是红色的
是因为没有启动服务
3.将三个容器的服务全部启动
[root@haproxy ~]# docker attach java0
[root@beb084663614 /]# /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
read escape sequence
[root@haproxy ~]# docker attach java1
[root@7574e7d3756f /]# /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
read escape sequence
[root@haproxy ~]# docker attach java2
[root@658ef09ab2fb /]# /usr/local/jdk/bin/java -jar Project_ExamSystem-V1.0.0.war
read escape sequence
[root@haproxy ~]#
4.浏览器访问测试
(1)进到考试页面:192.168.2.20:5000
(2)进入管理者页面:192.168.2.20:5000/#/admin
(3)haproxy的监控界面:192.168.2.20:8888
5.ab压力测试
# ab压力测试
[root@haproxy ~]# yum -y install httpd-tools
[root@haproxy ~]# ab -n 100 -c 10 http://192.168.2.20:5000/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.2.20 (be patient).....done
Server Software:
Server Hostname: 192.168.2.20
Server Port: 5000
Document Path: /
Document Length: 430 bytes
Concurrency Level: 10
Time taken for tests: 0.066 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 66300 bytes
HTML transferred: 43000 bytes
Requests per second: 1504.48 [#/sec] (mean)
Time per request: 6.647 [ms] (mean)
Time per request: 0.665 [ms] (mean, across all concurrent requests)
Transfer rate: 974.09 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 1
Processing: 1 5 3.0 4 16
Waiting: 1 5 3.0 3 16
Total: 1 5 3.0 4 16
Percentage of the requests served within a certain time (ms)
50% 4
66% 5
75% 6
80% 8
90% 10
95% 10
98% 15
99% 16
100% 16 (longest request)
三、docker-compose 自动化部署
新机器:192.168.2.30
1.部署docker
# 编辑docker脚本
[root@docker ~]# vim docker.sh
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 运行docker脚本
[root@docker ~]# source docker.sh
# 编辑daemon.json文件
[root@docker ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
# 修改docker.service文件
[root@docker ~]# vim /usr/lib/systemd/system/docker.service
13 ExecStart=/usr/bin/dockerd
# 加载文件
[root@docker ~]# systemctl daemon-reload
# 重启docker服务
[root@docker ~]# systemctl start docker
2.安装pip
[root@docker ~]# yum -y install python2-pip
3.升级pip
[root@docker ~]# pip install --upgrade pip==20.3 -i https://mirrors.aliyun.com/pypi/simpl
4.安装docker-compose
[root@docker ~]# pip install docker-compose -i https://mirrors.aliyun.com/pypi/simple
5.创建pes目录以及子目录
[root@docker ~]# mkdir -p pes/{msyql,java,web}
[root@docker ~]# tree pes
pes
├── java
├── msyql
└── web
3 directories, 0 files
6.在pes目录下创建并且编辑docker-compose.yml文件
[root@docker ~]# cd pes
[root@docker pes]# vim docker-compose.yml
version: "3"
services:
web:
container_name: web0
image: nginx:latest
ports:
- "80:80"
expose:
- 80
volumes:
- ./web/src/dist/:/usr/share/nginx/html/
restart: "always"
7.把之前部署的考试系统的web目录传过来
# 进到pes目录下
[root@docker ~]# cd pes
# 创建web/src目录
[root@docker pes]# mkdir -p web/src/
# 把之前部署的考试系统的web目录传到web/src/下
[root@docker pes]# scp -r 192.168.2.20:/root/project_exam_system/web/dist/ web/src
[root@docker pes]# ls
java msyql web
[root@docker pes]# cd web
[root@docker web]# ls
src
# 查看传过来的dist文件
[root@docker web]# ls src/dist/
assets favicon.ico index.html
8.docker-compose启动集群
# 拉取nginx镜像
[root@docker ~]# docker pull nginx:latest
# 查看镜像
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 5ef79149e0ec 2 weeks ago 188MB
# docker-compose启动集群
[root@docker pes]# docker-compose up -d
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
from cryptography.hazmat.backends import default_backend
Creating network "pes_default" with the default driver
Creating web0 ... done
# 查看用docker-compose创建的容器
[root@docker pes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
648da7c000f9 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp web0
9.浏览器访问:192.168.2.30(本机IP)
10.使用docker-compose一次性创建多台一样的容器
# 创建多台容器的语法
[root@docker pes]# docker-compose scale --help
Usage: scale [options] [SERVICE=NUM...]
# 编辑yml文件
# 创建相同的容器,不能同名,不可以映射相同的端口,所以注释掉这两行
[root@docker pes]# vim docker-compose.yml
version: "3"
services:
web:
#container_name: web0
image: nginx:latest
#ports:
#- "80:80"
volumes:
- ./web/src/dist/:/usr/share/nginx/html/
restart: "always"
# 使用scale选项创建3台相同的web容器
[root@docker pes]# docker-compose up --scale web=3 -d
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
from cryptography.hazmat.backends import default_backend
Recreating web0 ... done
Creating pes_web_2 ... done
Creating pes_web_3 ... done
# 查看创建的容器
[root@docker pes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a84d833c496c nginx:latest "/docker-entrypoint.…" 32 seconds ago Up 31 seconds 80/tcp pes_web_3
5b59fb581bcb nginx:latest "/docker-entrypoint.…" 32 seconds ago Up 31 seconds 80/tcp pes_web_2
69b05e3cf0b4 nginx:latest "/docker-entrypoint.…" 32 seconds ago Up 32 seconds 80/tcp pes_web_1
#docker-compose暂停集群
[root@docker pes]# docker-compose stop
/usr/lib/python2.7/site-packages/paramiko/transport.py:33: CryptographyDeprecationWarning: Python 2 is no longer supported by the Python core team. Support for it is now deprecated in cryptography, and will be removed in the next release.
from cryptography.hazmat.backends import default_backend
Stopping pes_web_3 ... done
Stopping pes_web_2 ... done
Stopping pes_web_1 ... done
# 查看容器(空)
[root@docker pes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES