docker学习笔记(五)docker实战

目录

一.搭建MySQL高可用集群(pxc+HA-Proxy)

二.Nginx+Spring Boot+MySQL 


一.搭建MySQL高可用集群(pxc+HA-Proxy)

参考链接:https://hub.docker.com/r/percona/percona-xtradb-cluster/ 

通过pxc(MySQL高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了数据复制延迟问题,基本上可以达到实时同步)搭建

(1) 拉取pxc镜像
      
docker pull percona/percona-xtradb-cluster:5.7.21    

(2) 给pxc镜像重命名(打tag) 并删除原来的镜像
      docker tag percona/percona-xtradb-cluster:5.7.21 pxc
      docker rmi percona/percona-xtradb-cluster:5.7.21

(3) 创建自定义的bridge网络 用于MySQL集群
       删除网络:docker network rm XXX  
       docker network create --subnet=172.18.0.0/24 pxc-net 

(4) 创建volume 用于持久化数据
      docker volume create --name pxc-volume1

(5)创建单个PXC容器

命令详解:

-e MYSQL_ROOT_PASSWORD=123456 指定数据库密码

-e CLUSTER_NAME=PXC 指定集群名称

-e XTRABACKUP_PASSWORD=123456 指定集群之间数据同步的密码

--net=pxc-net 指定网段

--ip=172.18.0.2 指定ip
 

[root@10 ~]# docker run -d -p 3301:3306 -v pxc-volume1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --net=pxc-net --ip 172.18.0.2 pxc

(6) 搭建PXC集群

  通过-e CLUSTER_JOIN将该数据库加入到某个节点上组成集群

docker run -d -p 3302:3306 -v pxc-volume2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=pxc-net --ip 172.18.0.3 pxc
docker run -d -p 3303:3306 -v pxc-volume3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456  -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=pxc-net --ip 172.18.0.4 pxc

在Navicat for MySQL里可以看到三个集群的数据库

数据库的负载均衡

(1)拉取haproxy镜像,并创建haproxy配置文件(/usr/local/docker/haproxy/haproxy.cfg)
   
docker pull haproxy
    cd /usr/local/ & mkdir -p docker/haproxy/
    cd docker/haproxy
    vi haproxy.cfg

global
	#工作目录 要和创建容器指定的目录对应 
	chroot /usr/local/etc/haproxy
	#日志文件,等级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_monitor 
	#统计报告格式
    stats realm     Global\ statistics
	#登陆帐户信息
    stats auth  admin:123456
    #数据库负载均衡
    listen  proxy-mysql
	#访问的IP和端口
    #假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例 
	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 
	#使用keepalive检测死链
    option  tcpka 

 (2)创建haproxy容器
 docker run -it -d -p 8888:8888 -p 3306:3306 -v /usr/local/docker/haproxy:/usr/local/etc/haproxy --name haproxy01 --privileged --net=pxc-net haproxy

 (3) 根据haproxy配置文件启动haproxy

docker exec -it haproxy01 bash 
haproxy -f /usr/local/etc/haproxy/haproxy.cfg

(4) 在mysql数据库上创建用户,用于心跳检测

CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
##如果创建失败,可以先输入一下命令: 删除用户并清空权限后再次创建   
drop user 'haproxy'@'%';    
flush privileges;    

 

数据库连接成功:

 

http://192.168.56.10:8888/dbs_monitor

 

二.Nginx+Spring Boot+MySQL 

(1)定义自己的Bridge网络
   docker network create --subnet=172.16.0.0/24 boot-net



(2)创建mysql容器
   docker run -d --name cpp-mysql -v v1:/var/lib/mysql -p 3304:3306 -e MYSQL_ROOT_PASSWORD=123456 --net=boot-net
   --ip  172.16.0.8 mysql

(3)mysql创建数据库,表等

create schema db_springboot collate utf8mb4_0900_ai_ci; 
use db_springboot ; 
create table user (    
    id int not null  primary key,    
    username varchar(50) not null,    
    password varchar(50) not null,    
    number varchar(100) not null 
);

insert into user values (1,"chenpp","123456","1101");
insert into user values (2,"tom","123456","1102");

(4) 根据dockerfile将springboot项目打包成镜像

FROM openjdk:8-jre-alpine    
MAINTAINER chenpp
LABEL name="springboot" version="1.0" author="chenpp"    
COPY springboot-mybatis-0.0.1-SNAPSHOT.jar springboot.jar    
CMD ["java","-jar","springboot.jar"]   

#build命令生成镜像文件  
docker build -t springboot-image 

(5)  创建容器
   docker run -d --name  boot01 -p 8081:8080 --net=boot-net --ip 172.16.0.10 springboot-image

因为boot01和cpp-mysql在同一个bridge的网段上,相互之间可以通过ip和容器名ping通,故springboot项目中的mysql配置文件的ip地址可以改成对应的容器名cpp-mysql 

 docker run -d --name  boot02 -p 8082:8080 --net=boot-net --ip 172.16.0.11 springboot-image
 docker run -d --name  boot03 -p 8083:8080 --net=boot-net --ip 172.16.0.12 springboot-image


(6)配置nginx.conf(宿主机的/tmp/nginx/nginx.conf)

worker_processes 1;
events{
   worker_connections 1024;
}
http{
   include /etc/nginx/mime.types;
   default_type application/octet-stream;
   sendfile  on;
   keepalive_timeout 65;
   server{
      listen 80;
	  location /{
	      proxy_pass http://balance;
	  }
   }
   upstream balance{
       server 172.16.0.10:8080;
	   server 172.16.0.11:8080;
	   server 172.16.0.12:8080;
   }
} 

 

(7)创建并启动nginx容器  
    通过bind mount将宿主机上的nginx.conf挂载到容器内

 docker run -d --name cpp-nginx -p 80:80 -v /tmp/nginx/nginx.conf:/etc/nginx/nginx.conf --network=boot-net
 --ip 172.16.0.6 nginx 

通过浏览器可以正常请求到数据库数据

 

在centos上请求getIp,可以看到路由到不同的container

[root@10 ~]# curl localhost:80/user/listall
[{"id":1,"username":"chenpp","password":"123456","number":"1101"},{"id":2,"username":"tom","password":"123456","number":"1102"}][root@10 ~]# ^C
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.12
[root@10 ~]# 
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.10
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.11
[root@10 ~]# curl localhost:80/user/getIp
ip:172.16.0.12

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值