docker环境下前后端项目部署(负载均衡+高可用)

1.后端项目部署:

docker环境下前后端项目部署(负载均衡+高可用)_第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 是实现

docker环境下前后端项目部署(负载均衡+高可用)_第2张图片

#补充:前端部署方案:

 

#进入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 ,测试地址即可

 

 

 

 

 

你可能感兴趣的:(Docker,玩转docker)