芯が強い人になるESTJ-A

# 2021- 实战\Docker环境下的企业级前后端分离项目部署与运维

IT開発 Tags: 无标签 阅读: 222

截屏2021-11-12 10.47.08.jpg

SaaS??Paas??
截屏2021-11-12 14.42.35.jpg

Docker常用命令,见图片

linux基础强化

截屏2021-11-12 14.45.17.jpg


###导出导入镜像
docker save java > /home/java.tar.gz
docker load < /home/java.tar.gz
docker images

docker rmi java


###启动容器
docker run -it --name myjava java bash

###映射端口
docker run -it --name myjava -p 9000:8080 -p 9001:8085 java bash

###持久化数据,volume
docker run -it --name myjava -v /home/project:/soft --privileged java bash

###三条命令合并一条
docker run -it -p 9000:8080 -p 9001:8085 -v /home/project:/soft --privileged --name myjava docker.io/java bash

###暂停/停止容器
docker pause myjava
docker unpause myjava
docker stop myjava
docker start -i myjava

如何部署后端项目

如何部署前端项目

搭建Mysql集群

截屏2021-11-12 16.04.50.jpg
截屏2021-11-12 16.06.45.jpg
截屏2021-11-12 16.07.08.jpg

###PXC集群安装
https://hub.docker.com/r/percona/percona-xtradb-cluster-operator
docker pull percona/percona-xtradb-cluster:5.7.21

###名字太长修改名字
docker tag percona/percona-xtradb-cluster:版本号 新名字

###docker images查看一下,有2个,一个新名字,一个旧名字

###删除旧名字的镜像
docker rmi percona/percona-xtradb-cluster:5.7.21版本号
docker images;再次查看

截屏2021-11-12 16.21.38.jpg
截屏2021-11-12 16.25.58.jpg

###创建内部网络
出于安全考虑,需要给pxc集群实例,创建Docker内部网络,172.18.xx
docker network create net1
docker network inspect net1
docker network rm net1

##docker network create --subnet=172.18.0.0/24 net1

##docker inspect net1

截屏2021-11-12 16.30.44.jpg
截屏2021-11-12 16.32.24.jpg

docker 容器卷
###容器中的pxc节点,映射数据目录的方案
docker volume create --name v1

docker inspect v1

###创建pxc容器,密码可以自己修改
docker run -d -p 3306:3306
-v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=abc123456 #数据库用户名root,密码自己创建
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=abc123456 #数据库之间同步数据密码
--privileged --name=node1 --net=net1 --ip 172.18.0.2
pxc #镜像的名字,我们已经改掉了,叫pxc

截屏2021-11-12 16.35.31.jpg
截屏2021-11-12 16.49.59.jpg
截屏2021-11-12 16.51.07.jpg
截屏2021-11-12 16.51.58.jpg

数据库负载均衡解决方案

截屏2021-11-13 20.52.43.jpg
截屏2021-11-13 20.54.22.jpg

###安装Haproxy镜像,
docker pull haproxy

###创建Haproxy配置文件
touch /home/soft/haproxy.cfg

配置教程:https://zhangge.net/5125.html

###创建Hyproxy容器指令
docker run -it -d -p 4001:8888 -p 4002:3306
-v /home/soft/haproxy:/usr/local/etc/haproxy
--name haproxy_1 --privileged --net=net1

###创建成功,进入容器
docker exec -it haproxy_1 bash

###加载配置文件
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

haproxy.cfg文件内容=创建Haproxy配置文件

global
    #工作目录
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    log 127.0.0.1 local5 info
    #守护进程运行
    daemon

defaults
    log    global
    mode    http
    #日志格式
    option    httplog
    #日志中不记录负载均衡的心跳检测记录
    option    dontlognull
    #连接超时(毫秒)
    timeout connect 5000
    #客户端超时(毫秒)
    timeout client  50000
    #服务器超时(毫秒)
    timeout server  50000

#监控界面    
listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息
    stats auth  admin:abc123456
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306  
    #网络协议
    mode  tcp
    #负载均衡算法(轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka  

haproxy双机热备方案,当机一个,还有一个,重点就是虚拟ip,让2个haproxy去抢一个虚拟ip,通过keepalived检测mysql的心跳,谁挂了,另一个补上。保证数据持久,稳定

截屏2021-11-13 21.12.07.jpg
截屏2021-11-13 21.13.56.jpg
截屏2021-11-13 21.14.18.jpg


###在docker Haproxy容器内部安装keepalived
##第一步,先进入创建的haproxy_1进入容器(退出容器,exit)
docker exec -it haproxy_1 bash
apt-get update
apt-get install keepalived

##keepalived安装完毕之后,需要争抢虚拟ip,配置如下
keepalived配置文件是/etc/keepalived/keepalived.conf

apt-get install vim
vim /etc/keepalived/keepalived.conf

###keepalived.conf
###2个节点都定义为MASTER节点,都有争抢虚拟ip的权利,抢到那个就是master,另一个自动降级成为slave,
vrrp_instance  VI_1 {
    state  MASTER
    interface  eth0
    virtual_router_id  51
    priority  100 #权重
    advert_int  1 #心跳检测,秒
    authentication { #心跳检测需要开一个账号,主从服务器验证,主+备,使用相同密码
        auth_type  PASS
        auth_pass  123456
    }
    virtual_ipaddress {
        172.18.0.201
    }
}


###启动keepalived
service keepalived start

##开另一个窗口,ping一下,测试是否通
ping 172.18.0.201




截屏2021-11-13 21.18.08.jpg

###在宿主机centos上安装keepalived
yum install -y keepalived

###宿主机centos上的配置文件,写的要比docker里面的多很多。
##宿主机内安装keepalived配置文件如下
vrrp_instance  VI_1 {
    state  MASTER
    interface  ens33 #Vm虚拟网卡名字叫ens33,docker虚拟机里面的网卡名字叫eth0
    virtual_router_id  51
    priority  100 
    advert_int  1
    authentication { 
        auth_type  PASS
        auth_pass  1111
    }
    virtual_ipaddress {
        #服务器ip地址,每个人服务器地址不一样
        47.103.xx.xx#局域网的虚拟ip,转发到docker内部

    }
#转发规则,从47的ip,8888端口进来,转发到172这个ip的8888端口,172是docker内部
virtual_server  47.103.xx.xx 8888 {
    #心跳检测
    delay_loop 3
    #轮训转发
    lb_algo rr
    #NAT模式
    lb_kind NAT
    #超时时间
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.201 8888 {
        weight 1
    }
}
##数据库端口
virtual_server  47.103.xx.xx 3306 {
    #心跳检测
    delay_loop 3
    #轮训转发
    lb_algo rr
    #NAT模式
    lb_kind NAT
    #超时时间
    persistence_timeout 50
    protocol TCP
    real_server 172.18.0.201 3306 {
        weight 1
    }
}

###上方的配置,自己本地编辑好,上传到服务器上的/etc/keepalived目录
文件名keepalived.conf

###然后回到宿主机,启动keepalived
service keepalived start

##测试一下,虚拟ip是否可以ping通
ping 虚拟ip

ctrl+C结束ping服务

##可以测试一下双机热备方案,
docker pause haproxy_1
docker unpause haproxy_1

##用pause暂停,命令,unpause启动。
不要用stop,一用stop,容器停止了,容器内部的keepalived也停止了。

睡眠:
###暂停PXC集群的办法
vi /etc/sysctl.conf
#在文件中添加,net.ipv4.ip_forward=1
systemctl restart network

Docker环境下的,热备份数据

截屏2021-11-15 16.11.08.jpg

##数据库冷备份,项目上线前夕,没有运行的情况下


###数据库热备份,数据库运行中,难度最大
Mysql常见热备份,LVM(要锁表备份)和XtraBackup(开源免费,不锁表)两种解决方案
推荐:XtraBackup,不用锁表,直接备份。

#第一次使用,全量备份,第二次使用,增量备份(增量-只备份变化的数据)
一周一次,全量备份,一天一次,增量备份
docker volume create backup

#先暂停,再删除旧的node1节点,node1节点数据卷内信息,保留住的,映射在外面
docker stop node1

docker rm node1

##创建一个新的节点,做备份
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged -e CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc


##安装xtraBackup这个工具,安装在pxc内部,不是安装在宿主机内部!!!
#第一步,先进入节点node1
docker exec -it node1 bash
##先更新,再安装热备工具
apt-get update
apt-get install percona-xtrabackup-24
##开启备份,全量备份,跟上数据库用户名+数据库密码
innobackupex --user=root --password=abc123456 /data/backup/full


##备份完毕之后,查看一下docker外部映射的备份目录
docker inspect backup

看到Mountpoint,这个就是backup目录,再cd进去看看

搭建Redis集群

Redis目前的集群方案,
1RedisCluster官方推荐,没有中心节点
2Codis中间件产品,有中心节点
3Twemproxy中间件,有中心节点
截屏2021-11-15 17.06.18.jpg
截屏2021-11-15 17.08.39.jpg
截屏2021-11-15 17.13.38.jpg

#RedisCluster
步骤:安装redis镜像--》创建redis容器--〉把redis容器,组建成RedisCluster集群
#第一步安装redis镜像
docker pull yyyyttttwwww/redis

docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 redis bash

#进入容器
docker exec -it r1 bash

#修改redis节点,因为redis默认关闭了集群功能
#编辑文件
vi /usr/redis/redis.conf
daemonize yes #以后台运行方式
cluster-enable yes #开启集群
cluster-config-file nodes.conf #集群配置文件
cluster-node-timeout 15000 #超时时间
appendonly yes #开启AOF模式

准备启动redis,先进目录
cd /usr/redis/src
然后执行,启动redis节点,6个节点,依次创建+启动
./redis-server ../redis.conf

#第二步,创建redis容器


#redis-trib是基于ruby的redis集群命令脚本
拷贝到空目录
cp /usr/redis/src/redis-trib.rb 
/usr/redis/cluster/
cd进入目录 /usr/redis/cluster
apt-get install ruby
apt-get install rubygems
gem install redis



#第三步:把redis容器,组建成RedisCluster集群
利用redis-trib.rb创建redis集群


#进入r1这个容器看看
docker exec -it r1 bash

#进入redis所在的容器内部的目录
cd /usr/redis/

#创建一个空目录
mkdir cluster

#拷贝工具
cd src
cp redis-trib.rb ../cluster

#进入上层,创建集群
cd ../cluster
创建集群redis
./redis-trib.rb create -- replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.7:6379

#系统询问是否创建6个节点,3个master,3个slave
yes


部署前后端分离的项目

##Maven打包命令
mvn clean install -Dmaven.test.skip=true
#clean清楚之前的jar文件,install打包到本地,Dmaven.test.skip代表跳过测试代码

##运行java容器,并部署jar文件
##创建一个volume文件夹
docker volume create j1
#检查是否创建成功
ls /var/lib/docker/volumes/j1/_data/
##创建容器
docker run -it -d --name j1 -v j1:/home/soft --net=host java
##进入容器
docker exec -it j1 bash
nohup java -jar /home/soft/xxxx.jar

###集群,多创建几个,需要修改tomcat端口,等信息,再次打包--j2
docker volume create j2

ls /var/lib/docker/volumes/j2/_data/

docker run -it -d --name j2 -v j2:/home/soft --net=host java
docker exec -it j2 bash
nohup java -jar /home/soft/xxxx.jar

###集群,多创建几个,需要修改tomcat端口,等信息,再次打包--j3
docker volume create j3

ls /var/lib/docker/volumes/j3/_data/

docker run -it -d --name j3 -v j3:/home/soft --net=host java
docker exec -it j3 bash
nohup java -jar /home/soft/xxxx.jar

###3个java都在容器内启动之后,设置负载均衡,nginx分发,最大支持8w/秒

##Docker仓库提供了nginx的镜像
docker pull nginx

##nginx配置文件
nginx.conf--1号

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 {
                ##服务器ip地址,
        server 47.105.xx.xx:6001;
        server 47.105.xx.xx:6002;
        server 47.105.xx.xx:6003;
    }
    server {
        listen       6101;
        server_name  47.105.xx.xx; 
        location / {  
            proxy_pass   http://tomcat;
            index  index.html index.htm;  
        }  

    }
}


nginx2号

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 47.105.xx.xx:6001;
        server 47.105.xx.xx:6002;
        server 47.105.xx.xx:6003;
    }
    server {
        listen       6102;
        server_name  47.105.xx.xx; 
        location / {  
            proxy_pass   http://tomcat;
            index  index.html index.htm;  
        }  

    }
}


###启动nginx容器
docker run -it -d --name n1 -v /home/n1/nginx.conf:/etc/nginx/nginx.conf --net=host --privileged

启动nginx输入
nginx

截屏2021-11-15 21.25.17.jpg
截屏2021-11-15 21.25.51.jpg

###创建swarm集群
docker swarm init

--listen-addr ip:port管理者节点端口
--advertise-addr ip广播地址

##其他节点加入swarm集群
##以manager身份加入
docker swarm join-token manager
#以worker身份加入
docker swarm join-token worker



云平台,部署前后端分离项目