docker环境下前后端项目部署(负载均衡+高可用)
1.后端项目部署:根据服务器/虚拟机情况修改application.yml文件,包括数据源,redis集群, 访问端口等,并保证本地测试无误将springboot(默认)项目打包成 3个jar , 每个jar对应的tomcat server 端口是6001 , 6002 ,6003 , 使用maven命令:mvn clean install -Dmaven.test.skip=true...
1.后端项目部署:
根据服务器/虚拟机情况修改application.yml文件,包括数据源,redis集群, 访问端口等,并保证本地测试无误
将springboot(默认)项目打包成 3个jar , 每个jar对应的tomcat server 端口是6001 , 6002 ,6003 , 使用maven命令:mvn clean install -Dmaven.test.skip=true来打包项目
#实现高可用,高性能的项目部署方案
docker volume create j1 #创建docker数据卷 j1
docker volume create j2 #创建docker数据卷 j2
docker volume create j3 #创建docker数据卷 j3
docker inspect j1 #查看实际本地目录存储位置,并将项目上传到对应的目录下面,这里省略了j2 j3 的上传,注意将jar 端口是6001 的上传到j1 ,jar端口是6002的上传到j2 , jar端口是6003的上传到j3
ls /var/lib/docker/volumes/j1/_data #这是我的j1实际存储地址,通过ls检查下是否上传上去了,其他j2,j3也是这样的方式检查一下
docker tag docker.io/java java #省略下载docker.io/java的过程, 这里将 docker.io/java改名为java
docker rmi docker.io/java #删除旧镜像,这是为了防止镜像太多,管理麻烦
docker images #检查是否更名,删除
docker run -it -d --name j1 -p 6001:6001 -v j1:/home/soft --net=host java #创建容器,注意net 是host(宿主机)
docker run -it -d --name j2 -p 6002:6002 -v j2:/home/soft --net=host java #创建容器,注意net 是host(宿主机)
docker run -it -d --name j3 -p 6003:6003 -v j3:/home/soft --net=host java #创建容器,注意net 是host(宿主机)
docker ps -a #检查上面三个镜像是否正常启动
docker exec -it j1 bash #进入j1容器中去启动springboot 的项目,j2,j3 同理
nohup java -jar /home/soft/renren-fast.jar #这里是前台启动的方式,所以你也可以根据需要使用后台启动方式,j2,j3 同理
nohup java -jar /home/soft/renren-fast.jar & #这里是后台启动的方式,当输入过后按ctrl+c 并不会终止程序,你也可以根据需要使用前台台启动方式,j2,j3 同理
#测试
浏览器分别访问
http://虚拟机ip:6001/renren-fast/swagger/index.html#!/29992251433033124405/post_sys_login
http://虚拟机ip:6002/renren-fast/swagger/index.html#!/29992251433033124405/post_sys_login
http://虚拟机ip:6003/renren-fast/swagger/index.html#!/29992251433033124405/post_sys_login
#注意在构建数据库集群时,我们选择了hapoxy来做负载均衡,这是因为hapoxy对tcp/ip的支持比较好,而nginx 对http的支持比较好,所以这里我们在前后端项目部署时使用nginx (nginx 是性能非常出色的反向代理服务器, 最大可以支持8万/秒的并发访问)
#安装nginx 镜像
docker pull nginx
#修改nginx 配置文件nginx.conf :
#注意配置文件中的upstream tomcat 中的server 和 server_name 要根据自己的虚拟机ip做修改
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
upstream tomcat {
server 192.168.99.104:6001;
server 192.168.99.104:6002;
server 192.168.99.104:6003;
}
server {
listen 6101;
server_name 192.168.99.104;
location / {
proxy_pass http://tomcat;
index index.html index.htm;
}
}
}
#将上面的配置文件上传到 /home/n1下面
#启动容器
docker run -it -d --name n1 -v /home/n1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged nginx
#测试,验证nginx的负载均衡
首先在windows系统上访问http://虚拟机ip:6010/renren-fast/swagger/index.html ,测试网站是否能正常访问
如果能正常访问,则开始测试是否能做到负载均衡
#将j1 挂载,看网站是否还能正常访问
docker pause j1
#如果依然能正常访问,代表负载均衡生效
#在上面的负载均衡架构中,如果nginx 挂了,那么整个负载均很就挂了 , 所以还要给nginx做高可用
修改一份nginx.conf , 其中server 中listen 改为6102 ,然后操作类似
#后端项目双机热备负载均衡实现
#利用keepalived 实现双机热备,这里不管是数据库集群还是前后端项目都是使用keeplived 是实现
#补充:前端部署方案:
#进入n2 容器 中安装keeplived
docker exec -it n1 bash
apt-get update
apt-get install keeplived
apt-get install vim
vi /etc/keeplived/keeplived.conf,修改为:
其中192.168.99.151指代的是虚拟机的ip ,
192.168.99.104指代的是Nginx 的server_name ,6101是nginx 2 的监听(listen)端口 ,
192.168.99.104 是虚拟映射服务地址(这是是nginx 的实际暴露访问地址),也是keeplived转发的地址
192.168.99.151是虚拟ip地址, 即对外服务ip为 192.168.99.151(外网访问)
所以不管是那个节点,只要抢占了192.168.99.151这个ip ,要么向n1这个节点分发请求,要么向n2节点发送请求
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.99.151
}
}
virtual_server 192.168.99.151 6201 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 192.168.99.104 6101 {
weight 1
}
}
service keeplived start #启动服务 ,上面是n2 容器的修改,n1容器的修改同理
退出容器
ping 192.168.99.151 #测试keeplived是否正常
测试双机热备方案是否成功,关闭n1 , 测试地址,关闭n2 ,测试地址即可
更多推荐
所有评论(0)