Docker搭建MySQL集群
采用MySQL架构Percona XtraDB Cluster
1.安装PXC集群
# 用pull拉 PXC 5.7.20版本
[root@localhost ~]# docker pull percona/percona-xtradb-cluster:5.7.20
5.7.20: Pulling from percona/percona-xtradb-cluster
10a267c67f42: Pull complete
814bc8809fc0: Pull complete
c32e31261673: Pull complete
7ef40c6d0d95: Pull complete
74a5ecb87cc4: Pull complete
c08c635cfaf1: Pull complete
67115204d437: Pull complete
845e6898cf10: Pull complete
392865b4a828: Pull complete
d1440aef4590: Pull complete
ad08fcbea5cd: Pull complete
03d173884318: Pull complete
74a8c9c96123: Pull complete
Digest: sha256:84bbe0269d3e2223556ac98e71320997bd6df09dccef5cad865b636403d36b6e
Status: Downloaded newer image for percona/percona-xtradb-cluster:5.7.20
docker.io/percona/percona-xtradb-cluster:5.7.20
# images 查看下载的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 14 months ago 680MB
percona/percona-xtradb-cluster 5.7.20 01b74a9694c0 5 years ago 413MB
2.重命名下载的PXC镜像(原名太长)
# 用tag给镜像打标签 tag [镜像名] [要打上的标签名]
[root@localhost ~]# docker tag percona/percona-xtradb-cluster:5.7.20 pxc
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 14 months ago 680MB
pxc latest 01b74a9694c0 5 years ago 413MB
percona/percona-xtradb-cluster 5.7.20 01b74a9694c0 5 years ago 413MB
3.创建内部网络
# 多台容器之间通信 tomcat暴露8080端口,mysql暴露3306,tomcat通过127.0.0.1:3306与mysql进行连接 可以实现
# 问题1 这样也就意味着 公网ip+端口就可以连接你的数据库(127.0.0.1:3306) 数据库容易遭受攻击
# 解决方案 让数据库只让MySQL进行访问 公网无法访问
# 在实际部署中,服务端只会暴露网关,各服务、组件之间均是内网访问 docker容器也是有ip的,安装docker后会有一个docker0网卡,每启动一个docker容器,docker就会给docker容器分配一个ip,都是桥接在这个网卡上面
#docker 创建网关net1
docker network create net1
[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1
a52d1b3ba7fcce996cde9a220da78269e94df621b9bdd72c80d7f7f73b3d7730
[root@localhost ~]#
# –subnet=172.18.0.0/24 自定义网段172.18.0.0,24是指24位子网掩码 net1 网段名称。
# 查看net1详细信息
[root@localhost ~]# docker inspect net1
[
{
"Name": "net1",
"Id": "a52d1b3ba7fcce996cde9a220da78269e94df621b9bdd72c80d7f7f73b3d7730",
"Created": "2023-03-06T05:47:32.638038004-05:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/24"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@localhost ~]#
4.创建docker卷
如果数据都在容器中那么我们容器删除,数据就会丢失,容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!
这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面
# 由于PXC较为特殊,无法直接使用映射目录的方法做映射(使用后会闪退),故使用docker卷
[root@localhost ~]# docker volume create --name v1
v1
# 可以看到Mountpoint字段 就是映射在宿主机的路径 "/var/lib/docker/volumes/v1/_data",
[root@localhost ~]# docker inspect v1
[
{
"CreatedAt": "2023-03-06T06:19:50-05:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/v1/_data",
"Name": "v1",
"Options": null,
"Scope": "local"
}
]
# 用于后续会在不同容器中一使用不同的docker卷,执行以下命令:
[root@localhost ~]# docker volume create --name v2
v2
[root@localhost ~]# docker volume create --name v3
v3
[root@localhost ~]# docker volume create --name v4
v4
[root@localhost ~]#
5.创建PXC容器
[root@localhost ~]# docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --ip 172.18.0.2 pxc
8af8bf729484f779dd91e4bee7587abb712f54ec113dfa722f05300699f54625
[root@localhost ~]#
# -d:默认在后台运行
# -p 3307:3306 宿主:容器 端口映射,将容器3306端口映射到宿主3307端口
# -v 目录映射 将创建的v1卷映射到容易 /var/lib/mysql
# -e MYSQL_ROOT_PASSWORD= 创建用户实例的密码
# -e CLUSTER_NAME= 集群的名称
# -e XTRABACKUP_PASSWORD= 数据库之间同步使用的密码
# --privileged 权限.给予最高权限
# --name 给容器容命名
# --net 使用内部网段
# --ip 内部网段分到的地址
# pxc 是下载镜像 percona/percona-xtradb-cluster:5.7.20 更改的标签名
# 测试连接
宿主的ip(ip可在centos窗口输入ifconfig即可查看ip)
用户root
密码 (MYSQL_ROOT_PASSROWD )设置的
# 创建其他容器
#v2
[root@localhost ~]# docker run -d -p 3308:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
e8ac666c22b27baa1fed07f6be7e99bbbfea89ac7658ae9fb7b9738f5ad573de
[root@localhost ~]#
#v3
[root@localhost ~]# docker run -d -p 3309:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
36ce27de36f13759f16446659e82e77e7b20739e91e87513308716793cb893eb
[root@localhost ~]#
#v4
[root@localhost ~]# docker run -d -p 3310:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSROWD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
58983e6d35ee4a9b6778c96e1a4c36b380f997b734b2fcf206761e40ed216c11
[root@localhost ~]#
6.验证是否创建成功PCX集群
用Navicat for mysql连接到之前四个节点的数据库,在四个节点数据库中 在任意一个数据库进行建库、建表、增删改查数据等操作后,再查看其它节点进行查看,或者在其它不同的节点进行操作看是否数据能成功进行同步。