
SaaS??Paas??
Docker常用命令,见图片
linux基础强化

###导出导入镜像
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集群



###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;再次查看


###创建内部网络
出于安全考虑,需要给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


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




数据库负载均衡解决方案


###安装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的心跳,谁挂了,另一个补上。保证数据持久,稳定



###在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

###在宿主机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环境下的,热备份数据

##数据库冷备份,项目上线前夕,没有运行的情况下
###数据库热备份,数据库运行中,难度最大
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中间件,有中心节点


#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


###创建swarm集群
docker swarm init
--listen-addr ip:port管理者节点端口
--advertise-addr ip广播地址
##其他节点加入swarm集群
##以manager身份加入
docker swarm join-token manager
#以worker身份加入
docker swarm join-token worker