实战Docker容器调度(二)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 实战Docker容器调度(二)

三、Docker Swarm#


3.1、简介#


Docker Engine 1.12诞生了Swarm。Docker的Swarm让我们可以通过一个或者多个Docker Engine组建起一个集群,没错Swarm就是Docker公司推出的集群编排工具。

使用docker swarm构建起的集群架构如下图:



主要存在两种角色:Manager节点和Worker节点,Manager和Woker本质上也都是Docker容器。


什么是Node?


大家都在说一个集群由多个节点组成,这个Node究竟是什么呢?


其实可以把这个节点理解成下载有Docker软件的服务器,通过Docker Swarm 会将我们启动的容器运行在某个Node中的Docker里面。


然后我感觉也可以把Node直接理解成某个服务器上运行的Docker实例。意思是你可以在一个服务器上启动多个Docker软件。当然这其实就和服务容器化以及分布式部署追求的那种容错性有出入~,毕竟都放在一个服务器上,万一服务器挂了,所有Docker实例,所有容器也都挂了。


Manager:

Manager主要掌控集群的管理任务

  • 维持集群的状态
  • 服务的调度(所谓调度就是通过一定的算法,让容器在合适的Node上启动起来)

manager之间彼此通信,我们针对整个集群的操作都要通过manager节点下发。

Worker:

worker节点是swarm集群中普通节点,他们会被Docker Swarm调度Woker节点上面运行起用户指定的容器。


参考:https://docs.docker.com/engine/swarm/


3.2、注意点#


我们使用Docker Swarm做了什么?

不要忽略一件事,使用docker swarm 为我们提供的命令,归根结底是为了搭建起一个swarm 集群,往这个集群中添加Node,从这个集群中砍掉Node。

搭建起集群之后下一步才是使用集群,使用集群使用的是另一套命令: docker service


3.3、环境搭建#


初始环境



查看docker swarm 命令:



初始化一个Docker Swarm 集群



通过 --advertise-addr 指定的ip可以是公网ip,也可以是私网ip。



如何将一个普通Node加入到一个集群中?


然后当我们成功初始化一个集群时,他会提示我们一条docker swarm join --token命令,通过这个命令我们可以让一个Node加入到以当前节点为Manager的去群中。

也可以该命令生成加入令牌:docker swarm join-token worker



如何查看当前集群各个节点的状态?

在manager节点执行如下命令:



在普通节点执行 docker node ls 会报错



如何将一个Manager Node加入到一个集群中?

使用该命令获取加入令牌:docker swarm join-token manager


该命令只能从manager节点使用。



创建swarm集群后,swarm为我们自动创建了新的网络~



3.4、Raft一致性协议#



manager节点组成的集群使用了Raft算法,要求集群中多数以上的节点存活,集群才可以使用。他的本意是想让集群中存在3台及以上的manager,这样即使有manager挂了,整个集群依然是不影响使用的。


因此:如果你只有一个mananger节点,那集群就是不可用,你也不能通过manager下发任何任务。如果你有三台manager,即使挂了一个manager,因为还有半数以上的manager存在,集群依然可用。如果你说我的集群中就有两个manager,可不可用呢?答案是:可用,这种情况和集群中有三个manager,然后挂了一个manager一样,但是没意义。为啥呢?因为他根本没有任何容错性。再挂一个manager,集群就不可用了。


下一篇笔记,就好好研究一下Reft协议


3.5、弹性扩容、缩容#


创建服务的命令:



通过docker service启动一个服务

只有在manager节点上才能使用这个命令。


docker run和这个docker service挺相似的,但是通过docker service启动容器具有扩容、缩容的能力



查看启动的容器



思考:

我们在集群中的manager节点通过上面的命令启动一个服务。这其实就是Docker中容器的调度,或者也能说它是简单的编排。docker service create 命令本意上是在集群中启动一个nginx服务。这个nginx服务也就是一个docker容器,这个docker容器,会被manager随机在四个Node中的某一个Node上启动起来!


具体是哪个Node? 可以登陆上这几个服务器,通过 docker ps 查


动态扩容:

如下,增加我们的nginx的容器的副本数

对于WebServer来无论它访问哪台服务器的ip都能访问到nginx,而且无论这台服务器上的Docker中是否运行中nginx服务。docker swarm对内部的容器运行做了一层屏障,让很多服务以一个整体的形式存在。



理解:服务的概念

这里只是在表象上理解一下服务的概念~不涉及底层实现,但是有助于捋清思路。

我们在上面通过 docker service 命令启动一个服务,什么服务呢,通过--name指定一个叫做 mynginx的服务 ,服务中运行的镜像为nginx,如果本地没有这个镜像,他会去远程拉取。服务启动后,docker swarm会在集群中随机找一个合适的Node运行redis容器,这个Redis容器属于mynginx服务。


后来我们又用 docker service update 增加服务的副本数,就比如我们上面将服务的副本数增加到3,docker swarm就会让整个集群中再找合适的Node,然后启动新的service。

如下图,WebServer去连接Redis服务,这个Redis服务实际上就是存在于由Docker Swarm搭建起的集群中的Redis服务,并且它可能有多个副本。


对于WebServer来说,他不知道DockerSwarm集群中有多少服务的副本,对他来说,它只是在连接一个Redis实例,而不知道它连接的实际上是一个多分片集群。


Docker Swarm集群为WebServer提供Redis服务使用,WebServer可以认为Swarm集群是一个实例,然后WebServer只需要使用Swarm集群为他提供的Redis服务,而不关心Swarm集群中有多少个服务副本。



动态缩容:


动态缩容,就是通过 --replicas 指定一个比原来副本数小的数量即可



动态扩缩容的另一个命令:



移除服务:


服务被移除后,所以的服务副本都会消失,所有的相关容器也会被关闭



3.6、使用的感受#


感觉上 Docker Swarm的调度设计是容器为核心的。

为啥这样说呢?

从上面的使用上来看,首先是拆解App,于是我们将应用拆分成不同容器。那不同容器之间是需要通过网络通信的,相应的DockerSwarm的实现是:Docker Swarm集群会构建一个igress网络(它是一个拥有负载均衡能力的overlay网络)所有的Node都加入到这个扁平化网络中,实现了网络中的各个Node直接通过对方的服务名就能ping通互联。

有了这样的基础后,我们就能使用Docker Swarm提供的扩容、所容的调度能力

当我们需要Docker Swarm为我们扩容时,它会根据自己的调度算法去找一个合适的Node然后去一个一个的运行起我的容器,也就是说它的思路是:为容器找一个合适的节点运行起来


spread: 默认策略,尽量均匀分布,找容器数少的结点调度

binpack: 和spread相反,尽量把一个结点占满再用其他结点

random: 随机


这种调度思想和k8s的编排思想是不一样的。

当然说起k8s难免会冒出海量的新概念,这里就不展开了。

简单来说:kubernates的编排思想是这样的,它根本不关系底层的容器是Docker还是其他的容器技术,它站在更高的角度上,允许让用户以yaml的方式去描述自己的应用,去描述哪几个镜像启动后应在绑定在一起(在一个Pod里,而不是像Docker Swarm那样,由Docker Swarm去为单个容器找一个合适的Node),允许用户指定Pod的数量,还为用户提供了 网关、监控、备份、水平扩展、滚动更新、保持指定数量的副本数、负载均衡等功能。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
23 2
|
3天前
|
运维 Cloud Native 虚拟化
一文吃透云原生 Docker 容器,建议收藏!
本文深入解析云原生Docker容器技术,涵盖容器与Docker的概念、优势、架构设计及应用场景等,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
一文吃透云原生 Docker 容器,建议收藏!
|
4天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
5天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
5天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
5天前
|
安全 持续交付 Docker
微服务架构和 Docker 容器化部署的优点是什么?
微服务架构和 Docker 容器化部署的优点是什么?
|
7天前
|
运维 开发者 Docker
Docker Compose:简化容器化应用的部署与管理
Docker Compose:简化容器化应用的部署与管理
|
7天前
|
NoSQL Redis Docker
【赵渝强老师】使用Docker Compose管理容器
Docker Compose 通过 YAML 文件管理多个容器,简化复杂系统的部署和管理。本文介绍了 Docker Compose 的基本概念,并通过一个包含 Redis DB 和 Python Web 模块的示例,展示了如何使用 Docker Compose 部署和管理多容器应用。手动部署和 Docker Compose 部署的对比突显了 Docker Compose 在系统复杂度增加时的优势。
|
15天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
11天前
|
关系型数据库 MySQL API