关于 Docker Swarm
1 )Swarm的引入
- Docker Compose 只能编排单节点上的容器,即: 单台服务器上的集群部署
- 如果要实现多台服务器上的集群部署,就可以选择 Swarm
- Docker Swarm 是Docker公司推出的用来管理docker集群的工具
- 使用 Docker Swarm 可以快速方便的实现高可用集群
- Docker Swarm 可以让我们在单一主机上操作来完成对整个容器集群的管理工作
- 使用Docker Swarm可以让单一主机上的容器快速部署到10个、20个或者200个主机上面,实现高可用集群
- 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm)
- 并且已经内置了服务发现工具,我们就不需要像之前一样, 再配置 Etcd 或者 Consul 来进行服务发现配置了
- Dokcer Swarm 是Docker官方的提供的集群部署管理工具,基于原生Docker
- 相比K8s要更简单、更容易上手
- 如果您的节点(物理机)在1000台以内,完全可以使用 Docker Swarm 实现部署
- Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些
2 )Swarm 节点
- Docker swarm中有节点的概念,一个节点就可以通俗的理解为一个机器
- 可以是物理服务器也可以是虚拟机、云等等
- 节点分为: 管理 (manager) 节点和工作 (worker) 节点
- 管理节点(Manager)
- 管理节点用于 Swarm 集群的管理,负责集群控制
- 通过监控集群状态、分发任务到工作节点
- docker swarm 命令基本只能在管理节点执行
- 节点退出集群命令 docker swarm leave 可以在工作节点执行
- 一个 Swarm 集群可以有多个管理节点,节点数量可以是 3, 5, 7 个,用来保证管理节点的高可用
- 但只有一个管理节点可以成为leader,leader 通过 raft 协议实现
- 工作节点(Worker)
- 是任务执行节点,管理节点将服务 (service) 下发至工作节点执行
- 管理节点默认也作为工作节点
- 节点的有效性有三种
- Active 调度程序可以分配任务给节点
- Pause 调度程序不分配新任务给节点,但现有任务继续运行
- Drain 调度程序不分配新任务给节点,调度程序关闭任何现有任务并将它们调度到可用节点上
3 )Swarm 任务和服务
- 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器
- 服务 (Services) 是指一组任务的集合,服务定义了任务的属性
Docker swarm 集群搭建
1 )准备工作
- 准备4台机器(物理机,虚拟机,云主机都可以),假定他们ip分别是
- 192.168.1.10 作为管理节点
- 192.168.1.11 作为工作节点
- 192.168.1.12 作为工作节点
- 192.168.1.13 作为工作节点
- 先关闭防火墙,作为演示,注: 实际服务器要配置防火墙规则,仅作为网络连通演示
- 使用 centos 演示
- 关闭 SELinux
- $
getenforce
查看状态 - 如果不是关闭状态,则修改配置文件
- $
vi /etc/selinuux/config
- 修改 SELINUX=enforcing 改为 SELINUX=disabled
- $
- $
- 关闭防火墙
- $
systemctl stop firewalld
- $
- 配置主机 hostname
- 获取hostname $
hostname
- 修改有两种方式
- 临时有效: $
hostname worker_11
- 永久有效: $
vi /etc/hostname
并 重启机器- .10 配置 manager_10
- .11 配置 worker_11
- .12 配置 worker_12
- .13 配置 worker_13
- 临时有效: $
- 获取hostname $
- 关闭 SELinux
- 使用 centos 演示
2 )初始化集群
- 在 .10 这个管理节点上操作
- $
docker swarm init --advertise-addr 192.168.1.10
- 之后会输出一段提示命令
- $
- 在 .11,.12,.13 主机上执行上述提示命令
- $
docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
- 这样工作节点都加入到了集群里,上述 token 是当前管理节点签发的一个令牌
- $
- 在 .10 上
- 执行 $
docker node ls
, 可以看到集群里有哪些节点了, 这个命令只能在 manager节点上运行 - 执行 $
docker node inspect 具体的nodeID
可查看节点详细信息
- 执行 $
- 有新的机器想要加入集群,则在 .10 机器上,输入 $
docker swarm join-token worker
- 就可以重现第一次出现的加入命令
- 如果想要加入 manager, 则在 .10 机器上,输入 $
docker swarm join-token manager
- 就可以看到创建 manager节点的命令
- 删除节点,执行两个命令
- 在管理节点上 $
docker node rm nodeID -f
- 在工作节点上 $
docker swarm leave -f
- 不分顺序
- 在管理节点上 $
- 管理节点降级为工作节点 $
docker node demote nodeID
- 工作节点升级为管理节点 $
docker node promote nodeID
Docker Swarm创建容器并部署项目
- 之前 docker run 创建的容器,只能在当前计算机上运行, 不具备扩容性,不方便管理
- 现在 docker service 服务具备扩容,滚动更新,回滚等功能,可部署在多台服务器
- 创建的服务可以包含多个容器
- 会自动部署到 docker swarm 对应的集群里
- $
docker service logs
查看某个服务日志 - $
docker service rm serviceName
删除某个服务 - $
docker service ls
查看所有服务详情 - $
docker service inspect
查看服务详情 - $
docker service ps serviceName
查看服务力运行的xxx容器
1 )创建nginx对应的服务,里面可以包含多个容器
- $
docker service create --name nginx --replicas 2 --publish 80:80 nginx
--replicas
指定副本数量- 这样可以把2个容器随机部署到集群中的2台机器上
- 通过 $
docker service ls
可按到运行的 nginx 服务 - $
docker service ps nginx
查看 nginx 服务有哪些容器 - 部署好之后,就可以通过 ip地址或域名访问到 nginx 服务了
- 其底层实现是,基于 ingress 网络完成通信和负载均衡
- 访问集群里的任意一台服务器,都可以访问到 nginx
- 上面指定了端口,也不会存在冲突,实际映射的是服务端口,只暴露了一个服务端口
- 我们访问的时候,是访问的服务
2 )对nginx服务进行动态调整(扩容和缩容)
- $
docker service update --replicas 3 nginx
或 - $
docker service scale nginx=3
- 指定数量可以超过主机数量,每台主机可运行多个nginx服务
- 当一台机器上一个容器挂掉后,会动态的随机启动一个新的容器
3 )创建 nginx 并映射目录
- $
docker service create --name nginx --replicas 8 -p 80:80 --mount type=bind,src=/root/wwwroot/html,dst=/usr/share/nginx/html nginx
src
物理机或本机目录dst
nginx容器里面的目录- 以上命令在管理节点执行
- 以下命令在所有机器上执行
- $
mkdir /root/wwwroot/html
- $
cd /root/wwwroot/html
- $
touch index.html
写一些任意的东西 - 以上这些在集群的所有机器上执行
- $
- 当访问任意节点ip的时候,可能加载的并非当前ip对应主机的服务
- 比如访问 .11 的节点,可能提供服务的,并非 .11主机内的服务
- 这里是基于 ingress 网络实现的负载均衡
- 内部有个算法实现计算谁的资源空闲,找谁提供服务