docker swarm 技术 (之前的 docker 集群都是在 一个虚拟主机上的, 但是如果这个主机挂掉了 over 了, docker 技术就是多个虚拟主机形成一个集群)
Swarm 是 Docker 的一个编排工具, 参考官网: https://docs.docker.com/engine/swarm/
与 docker 集成的集群管理工具
去中心化设计, 只使用 docker 引擎即可创建各类节点
声明式服务模型. 可以声明的方式来定义应用.
动态伸缩. 管理节点自动调整服务数量.
高可用, 对于服务期望状态做到动态调整, swarm 的管理节点会持续监控集群状态, 集群中有没有达到期望状态的服务, 管理节点会自动调度来达到期望状态.
自定义网络. 可以为你的服务指定一个网络, 容器创建的时候分配一个 IP
服务发现. 管理节点给集群中每个服务一个特定的 DNS 名字, 并给运行的容器提供负载均衡.
负载均衡. 你可以暴露服务端口给外部的负载均衡. 内部 swarm 提供可配置的容器分配到节点的策略.
默认的安全机制. swarm 集群中各个节点强制 TLS 协议验证. 连接加密, 你可以自定义根证书.
滚动更新. 增量跟新, 可以自定义更新下个节点的时间间隔, 如果有问题, 可以会滚到上个版本.
去中心化设计
创建 Swarm 集群
docker swarm init
--listen-addr ip:port 管理者节点
--advertise-addr ip 广播地址
加入 Swarm 集群
- docker swarm join-token manager
- docker swarm join-token worker
示例
- # 创建 4 个服务器虚拟机
- # -- 192.168.103.210(manager)
- # -- 192.168.103.240(manager)
- # -- 192.168.103.212(worker)
- # -- 192.168.103.213(worker)
- # 192.168.103.210 进行操作
- docker swarm init
- # 生成加入 manager 语句, 生成的语句在 240 上面执行
- docker swarm join-token manager
- # 生成加入 worker 语句, 生成的语句在 212,213 上面执行
- docker swarm join-token worker
查看 Swarm 集群节点
注意: 只能在 manager 节点执行
- docker node ls
- [root@localhost ~]# docker node ls
- ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
- 0l944rsrwj0sqva0pf4shshd1 * localhost Ready Active Leader 18.09.6
- askvrplj3p0vh3bh22oi9mr2u localhost Ready Active 18.09.6
- g2q35fckeubv0u87y6ol4zw5q localhost Ready Active Reachable 18.09.6
- wdxxxyxjvnm9kl757k57dnuwi localhost Ready Active 18.09.6
查看 Swarm 集群网络
docker network ls
注意: 这个 ingress swarm 网络不是用来做容器之间业务通信的, 而是用来管理集群的
创建共享网络
ingress 网络用于管理 Swarm 集群, 所以我们需要创建新的共享网络
docker network create -d overlay --attachable swarm_test
创建 Percona 集群示例
演示 4 台服务器创建 5 节点集群
- # -- 192.168.103.210(manager)
- # 拉取镜像
- docker pull percona/percona-xtradb-cluster:5.7.21
- # 镜像重命名
- docker tag percona/percona-xtradb-cluster:5.7.21 pxc
- docker rmi percona/percona-xtradb-cluster:5.7.21
- # 创建数据卷 v1 和 backup
- docker volume create v1
- docker volume create backup
- # 创建容器
- # 创建 5 个 PXC 容器构成集群
- # 第一个节点
- 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 --name=node1 --net=swarm_test pxc
- # 创建数据卷 v2
- docker volume create v2
- # 第二个节点
- docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/MySQL -v backup:/data --privileged --name=node2 --net=swarm_test pxc
- # -- 192.168.103.240(manager)
- # 拉取镜像
- docker pull percona/percona-xtradb-cluster:5.7.21
- # 镜像重命名
- docker tag percona/percona-xtradb-cluster:5.7.21 pxc
- docker rmi percona/percona-xtradb-cluster:5.7.21
- # 创建数据卷 v3 和 backup
- docker volume create v3
- docker volume create backup
- # 第三个节点
- docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/MySQL -v backup:/data --privileged --name=node3 --net=swarm_test pxc
- # -- 192.168.103.212(worker)
- # 拉取镜像
- docker pull percona/percona-xtradb-cluster:5.7.21
- # 镜像重命名
- docker tag percona/percona-xtradb-cluster:5.7.21 pxc
- docker rmi percona/percona-xtradb-cluster:5.7.21
- # 创建数据卷 v4 和 backup
- docker volume create v4
- docker volume create backup
- # 第四个节点
- docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/MySQL -v backup:/data --privileged --name=node4 --net=swarm_test pxc
- # -- 192.168.103.213(worker)
- # 拉取镜像
- docker pull percona/percona-xtradb-cluster:5.7.21
- # 镜像重命名
- docker tag percona/percona-xtradb-cluster:5.7.21 pxc
- docker rmi percona/percona-xtradb-cluster:5.7.21
- # 创建数据卷 v5 和 backup
- docker volume create v5
- docker volume create backup
- # 第五个节点
- docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/MySQL -v backup:/data --privileged --name=node5 --net=swarm_test pxc
创建完成后每个节点都应该可以访问, 而且会数据同步
容器集群
容器集群不适合有状态程序, 例如数据库, 缓存等等
退出 Swarm 集群
主动退出
- docker swarm leave --force
- # Manager 退出集群必须要使用 --force 参数
被动退出
- # Manager 被动退出集群
- # Manager 节点降级为 Worker 节点
- docker node demote <ID>
- # 删除停止或离开的 Worker 节点
- docker node rm <ID>
- # 删除任何的节点必须要先停止它的 Docker 服务
- # Manager 节点必须先降级成 Worker 节点, 然后再去删除
来源: https://www.cnblogs.com/wyt007/p/11075098.html