目录
一、Docker Swarm介绍
二、集群环境搭建
2.1、实验环境
2.2、安装基础运行环境
2.3、建立swarm集群
2.4、swarm集群管理
(1)、重新生成集群token
(2)、节点权限降级
(3)、节点权限升级
(4)、删除一个集群节点
(5)、其他常用命令
2.5、集群管理常见报错
三、集群高可用演示
3.1、Docker Swarm高可用性介绍
3.2、高可用切换演示
四、通过docker service管理服务
4.1、docker service命令详解
4.2、使用docker service管理服务演示
(1)、创建服务
(2)、扩容或缩容服务
官网介绍:Swarm mode overview | Docker Documentation
docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。
从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。
docker swarm架构图:
docker swarm和k8s本质都是容器编排和管理,两者的对比如下:
swarm:内嵌在容器引擎内部,是容器引擎的一部分,与容器深度绑定,swarm偏重的是容器的部署,侧重于容器技术的扩展。
k8s:独立于docker,与docker是分离的,并完全不依赖于底层的docker,它侧重于业务应用的集群部署。k8s对容器的所有操作都渗透着为应用而服务的理念。以服务为中心,docker仅仅是其底层技术支撑的一种技术。
Swarm | Kubernetes | |
设计初衷 | 跨宿主机集群的容器管理 | 支持分布式、服务化的应用架构 |
产品理念完善史 | 2年 | 15年 |
GitHub Star | 4098+ | 18200+ |
社区主力 | Docker | Google、Redhat、CoreOS、华为、浙大SEL |
核心功能 | 管理节点、调度任务、服务发现、Rolling update、容器HA、通讯安全 | 资源调度、服务发现、服务编排、资源逻辑隔离、服务自愈、安全配置管理、Job任务支持、自动回滚、内部域名服务、健康检查、有状态支持、运行监控/日志、扩容缩容、负载均衡、灰度升级、容灾恢复、应用HA |
服务发现的实现 | 通过Consul实现 | 内置 |
模型抽象 | 无 | Pod、Service、Lable、RC、Node |
典型案例 | SA Home Loans(Docker Datacenter内置) Bugsnag、新浪微博 | Pearson、Box、eBay、Yahoo、SAP、OpenAI、wepay、Samsung、The New York Times、华为、中国移动、网易、新浪SAE |
优劣势 | 优势:Docker原厂维护,Swarm API兼容docker API,学习成本低,架构简单,部署运维成本较低,使用简单; 劣势:无法提供集群的更加精细化的管理,网络性能非官方测试只有主机网络性能的70%;如果容器或者容器主机崩溃,swarm没有机制来保证容器的运行;无法满足复杂的调度场景; |
优势:容器的高可用性,集群的精细化管理,容器管理可靠性高,可以监控并维持容器的生命,默认使用Flannel和overlay网络,支持复杂的网络场景和容器调度场景; 劣势:学习成本高,部署运维成本高,非Docker原厂维护(Google主力维护); |
如果是小型项目,并且容器管理场景不会很复杂,可以考虑使用docker swarm,单机的话compose就能满足,如果是大型或者复杂使用场景,就需要使用kubernetes,总的来说,kubernetes才是最终归宿。
操作系统 | 主机名 | ip地址 | 功能 |
centos7.5 x86_64 | node1 | 192.168.1.50 | 管理节点,manager node |
centos7.5 x86_64 | node2 | 192.168.1.51 | 工作节点,worker node |
centos7.5 x86_64 | node3 | 192.168.1.52 | 工作节点,worker node |
centos7.5 x86_64 | node4 | 192.168.1.53 | 工作节点,worker node |
(关闭firewalld和selinux)
对4台主机执行如下命令安装docker环境:
#清除老版本docker,确保机器上没有安装docker
yum remove docker docker-client docker-client-lastest docker-common docker-lastest docker-lastest-logrotate docker-logrotate docker-engine
#yum安装gcc相关命令
yum -y install gcc gcc-c++
#安装 yum-utils 包(提供yum-config-manager 实用程序)并设置稳定的存储库
yum install -y yum-utils
#设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum软件包索引
yum makecache fast
#安装docker-ce引擎
yum -y install docker-ce docker-ce-cli containerd.io
#检测是否安装成功
docker version
systemctl start docker
systemctl enable docker
步骤1:
在node1建立swarm管理节点:
docker swarm init --advertise-addr 192.168.1.50
如上图,建立管理节点后,会返回从节点加入的命令。
步骤2:
将node2、node3、node4加入管理节点node1:
docker swarm join --token SWMTKN-1-0vnw7qc2r8796e8thdywk7vtjvje366e9e5mscob59ca7lkhb6-bzitohbqihf21jqhxdtoan3bz 192.168.1.50:2377
步骤3:
在manager管理节点查看集群状态(worker节点是无法查看的):
#在node1 manager节点执行
docker node ls
如果有新的节点需要加入,加入的token忘记了,就需要重新在管理节点生成一个token,如下:
#只能在manager节点生成token
#1、生成manager token
docker swarm join-token manager
#2、生成worker token
docker swarm join-token worker
如上,根据需求选择是以manager身份加入还是worker身份加入;
如下图,标记为Reachable的为以manager身份接入的节点,空白的是worker节点,Reachable节点权限还是要低于Leader主节点,但是也拥有集群管理权限,比如查看集群状态,生成集群join-token等:
比如将node4节点由Reachable管理节点降级为worker节点
在Leader管理节点node1执行如下:
docker node demote node4
比如将node4节点由Worker节点降级为Reachable管理节点
在Leader管理节点node1执行如下命令:
docker node promote node4
【说明】:
a、删除集群节点(worker节点),需要被删节点先主动离开集群,然后再由manager节点删除
b、如果删除的是manager节点,则需要先降级为worker节点,再主动离开集群,最后由manager节点删除
#在node2被删节点执行如下:
docker swarm leave -f #-f参数表示强制离开集群
#在node1管理节点执行如下:
docker node ls #观察node1节点状态STATUS是否变为Down
docker node rm node2 #删除node2节点
#在node1管理节点操作下面命令:
docker node demote node4 #先将node4降级为worker
#在node4被删节点操作如下:
docker swarm leave #离开集群
#在node1管理节点操作如下:
docker node rm node4
(主要为docker node命令和docker swarm命令,详情可使用docker node --help和docker swarm --help查看所有参数)
#查看集群节点状态,只能在manager节点使用
docker node ls
#查看运行节点的任务列表
docker node ps [NODENAME]
#查看节点详细信息
docker node inspect [NODENAME]
#更新节点
docker node update [NODENAME]
(1)、存在两个同名swarm节点,导致无法删除
解决方式:HOSTNAME相同,导致swarm不知道删哪个,但是两者ID号不同,可以使用ID方式删除,如下:
docker node rm 5ka7ksvrnlr1n2wjrtkanpnq3 -f
在Docker Swarm中,Swarm manager负责管理整个集群,包括成规模的众多Docker主机资源。如果这个Swarm manager挂了,你必须创建一个新的来解决中断的服务。
Docker Swarm具有High Availability的特性,当有一个manager实例出现问题,Docker Swarm可以优雅的进行故障转移-failover。你可以创建一个单独的primary manager实例和多个replica实例来使用这个特性。
一个primary manager是Docker Swarm集群的主要联系人。你也可以创建replica实例作为次要联系人,并与它进行通信。对于replica收到的请求会被自动的代理到primary manager。如果一个primary manager故障,一个replica会成为leader。通过这种机制,你可以始终保持于集群的联系。
以如下docker集群状态为例,node1为主管理节点、node2和node4为普通管理节点、node3为工作节点:
当在node1 Leader节点执行systemctl stop docker,模拟将docker服务挂掉之后,等过一小会儿之后,docker服务会自动被重新启动,并且集群将重新连接,只是主管理节点(Leader)会转移,如下图:
【注意】:如果集群没有设置普通管理节点(Reachable),那么当主管理节点(Leader)挂掉再恢复之后,主管理节点(Leader)不会改变,因为没有普通管理节点(Reachable)参与选举。
【注】:以下命令中,mynginx和nginx更换为对应的服务名和镜像名
(1)、创建/启动服务
#创建nginx服务
docker service create nginx
#创建nginx服务,并映射80端口
docker service create -p 80:80 nginx
#创建nginx容器,并设置5个运行副本
docker service create --replicas 5 nginx
(2)、查看正在运行的服务
docker service ls
(3)、查看某个服务运行状态
docker service ps mynginx
(4)、增加和删除DNS
docker service update --dns-add 222.222.222.222 mynginx
docker service update --dns-rm 222.222.222.222 mynginx
(5)、增加和删除端口映射
docker service update --publish-add 80:80 xenodochial_ritchie
docker service update --publish-rm 80:80 xenodochial_ritchie
(6)、缩容和扩容
#设置运行副本为2个实例
docker service scale tender_hofstadter=2
#设置运行副本为5个实例
docker service scale tender_hofstadter=5
(7)、显示服务详细信息
docker service inspect mynginx
(8)、获取服务日志
docker service logs mgnginx
(9)、删除一个或多个服务
docker service rm mynginx
(10)、回滚服务
docker service rollback mynginx
(11)、更新服务
docker service update mynginx
以在swarm集群创建nginx服务为例:
集群节点状态如下:
创建mynginx服务:
docker service create --name mynginx -p 80:80 nginx
查看docker service:
docker service ls
如上图,REPLICAS为1表示目前只有一个副本在运行
查看docker service中mynginx的状态和信息:
docker service ps mynginx
如上图, 可以看到mynginx服务只有一个副本在运行,并且是运行在node4节点上,可以在node4节点执行docker ps -a查看到在运行的mynginx容器:
因为现在mynginx已经在swarm集群运行,并且映射了端口,此时通过node1~4任何一个节点的主机ip都可以访问到nginx服务:
(当web访问量骤增和骤减,这时候就需要动态的对mynginx服务进行扩容和缩容)
#有以下两种方式,2选1即可
#方式1
docker service update --replicas 5 mynginx #将运行副本数设置为5
#方式2
docker srevice scale mynginx=5 #将运行副本数设置为5
查看扩容/缩容后的服务状态:
docker service ls
docker service ps mynginx