Docker 集群之 Swarm

简介: 了解什么是 Docker 集群以及为什么要使用 Docker 集群,并介绍 Docker 集群工具 Swarm 和 Docker 集群搭建。

什么是 Docker 集群?

image.png

Swarm 将一个或多个 Docker 【节点】组织起来,使得用户能够以集群方式管理它们;

  • 这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例;
  • 节点会被配置为管理节点(Manager)或工作节点(Worker)。

    1. 管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。
    2. 工作节点接收来自管理节点的任务并执行。

集群搭建的注意事项

  • 安全性:要求所有节点通过可靠的网络相连;

搭建 Swarm 集群时将不可避免地使用 TLS(安全传输层协议),因为它被 Swarm 紧密集成。在安全意识日盛的今天,这样的工具值得大力推广。Swarm 使用 TLS 进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic Key Rotation)更是锦上添花!其在后台默默进行,用户甚至感知不到这一功能的存在。

为什么要使用 Docker 集群?

image.png

docker 在单机(单节点)环节下面,部署两个容器分别是 nginx 和 netcore ,假如 docker 主机宕机,意味着其上面的容器服务也随之不可用,再从客户端角度看,客户端的访问数量是不确定性的,随时都可能增多,而相对于单节点的 docker 主机,提供服务的负载能力也有上限,不能满足高并发场景,最终导致容器服务不可用,总结为以下两点:

  1. 服务器角度:单节点 docker 主机不能提供服务的高可用性;
  2. 客户端角度:单节点 docker 主机不能满足高并发服务访问;

Docker 集群解决什么问题?

针对以上面临的问题,因此需要对单节点 docker 主机进行集群,集群展示如下:

image.png

Docker 集群解决的问题(提供服务的高可用):

  1. 提高并发量;
  2. 解决单点故障问题;

Docker Swarm 集群工具简介

  • Swarm 是 Dcoker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源;
  • Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些;
  • Docker Swarm 包含两方面:1.企业级的 Docker 安全集群 & 2.微服务应用编排引擎;
  • Swarm 的配置和状态信息保存在一套位于所有管理节点上的分布式 etcd 数据库中。该数据库运行于内存中,并保持数据的最新状态。关于该数据库最棒的是,它几乎不需要任何配置,作为 Swarm 的一部分被安装,无须管理;
  • Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点;
  • Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得更加方便。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。甚至还可以执行滚动升级、回滚以及扩缩容操作;

关于应用编排,Swarm 中的最小调度单元是服务;它是随 Swarm 引入的,在 API 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。

Swarm 如何管理 Docker 集群?

image.png

以上环节中,docker swarm 通过角色(manager-worker)配置实现 docker 主机集群,同样管理节点(manager)也可以多个节点集群。

  • manager(管理节点)

    1. 集群配置;
    2. 容器服务管理;
    3. 负载均衡;
    4. 集群其他配置;
  • worker(工作节点)

    1. 提供容器服务
说明:类似 redis 中的主(mastere)从(slaver)配置;

如何搭建 Swarm 集群?

通过 service,task,stack 去配置容器;

  • service =》docker 不同主机(工作节点)容器的集合;
  • task =》供 service 启动集群环境容器;
  • stack =》多个 service 的集合;

image.png

Swarm 集群准备

  1. 两台云主机或 VM,分别安装 docker;
  2. docker-swarm;
备注:在哪里操作哪个就是管理节点,所有操作只需在管理节点处理,工作节点无需担心;

上面我们对 docker 集群的原理做了简单的介绍,接下来我们实践操作,【docker-swarm】集群的搭建过程;

Swarm 集群搭建过程

  • 首先初始化一个集群工作节点 =》docker swarm init --advertise-addr [localhost] 默认为管理节点,
  • 如果该节点已经存在,删除节点 =》docker swarm leave -f

image.png

  • 另外一台 docker 主机加入集群节点(work工作节点)

image.png

  • 查看节点详细列表信息 =》docker --info

image.png

集群环境中如何配置 services(容器)集合

  • 镜像仓库准备所需的部署的镜像,比如:nginx 和 netcore

image.png

  • 创建 service =》docker service create --replicas 1 --name netcoreservice 参数 --replicas 指定集群数量,--name 为service取名;

image.png

  • 查看【rmcoreservice】在哪个 docker 主机节点运行 =》docker service ps rmcoreservice

image.png

  • 查看容器列表信息 =》docker container ls -a

image.png

  • 删除 rmcoreservice 服务 =》docker service rm rmcoreservice

image.png

备注:所有 service 的操作,全在管理节点操作,管理节点删除service 集群的工作节点也随之删除,
证明:在 worker 工作节点查看 service 列表=》docker serice ls 工作节点无权操作,显示如下:

image.png

  • 从镜像 rmcore 创建服务,指定两个工作节点,并暴露服务端口(映射) =》docker service create --replicas 2 --name rmcoreservice --publish 6066:80 rmcore

image.png

集群中 stack 创建两个 service

image.png

deploy 可选参数配置详解

endpoint_mode:访问集群服务的方式。
    endpoint_mode: vip 
    # Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
    endpoint_mode: dnsrr
    # DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
 
mode:指定服务提供的模式。
    replicated:复制服务,复制指定服务到集群的机器上。
    global:全局服务,服务将部署至集群的每个节点。    
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
 
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
 
restart_policy:配置如何在退出容器时重新启动容器。
 
condition:可选 none,on-failure 或者 any(默认值:any)。
    delay:设置多久之后重启(默认值:0)。
    max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
    window:设置容器重启超时时间(默认值:0)。
    rollback_config:配置在更新失败的情况下应如何回滚服务。
 
parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
    delay:每个容器组回滚之间等待的时间(默认为0s)。
    failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
    monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
    max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
    order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
    update_config:配置应如何更新服务,对于配置滚动更新很有用。
 
parallelism:一次更新的容器数。
    delay:在更新一组容器之间等待的时间。
    failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
    monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
    max_failure_ratio:在更新过程中可以容忍的故障率。
    order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)
  • 管理节点创建 stack 目录 =》mkdir stack
  • 查看当前目录列表,切换到 compose

image.png

  • 如果管理节点不存在 docker-compose.yaml 文件就创建一个 =》 vi docker-compose.yml 创建文件并且进入编辑

image.png

  • 管理节点的 stack 目录中创建的 docker-compose.yaml 文件配置编辑信息如下:

image.png

  • Stack 命令 =》docker stack --help

image.png

  • 通过 docker-compose.yml 中的 deploy 配置信息,使用 stack 管理命令启动 =》docker stack deploy -c docker-compose.yml rmstack 创建的stack标识为rmstack
  • 查看 stack 创建的列表目录信息 =》docker stack ls

image.png

  • 查看 stack 中创建的 service =》docker service ls 创建的服务 rmstack_nginx, rmstack_rmcore

image.png

  • 再次查看容器列表目录 =》docker container ls

image.png

以上过程就完成 stack 的集群配置;

  • 删除 stack 配置 =》docker stack rm rmstack

image.png

注意:管理节点创建和删除集群操作,工作节点也随之删除。

docker-swarm 命令集合

  • 查看 swarm 工具管理命令 =》docker swarm --help
指令 说明
ca 显示CA证书
init 初始化swarm 集群,并创建管理节点
join 将其他docker节点加入集群,创建工作节点,被管理节点管理
join-token 将其他docker节点加入集群,创建工作节点,被管理节点管理[这个是管理节点令牌]
leave 离开集群
unlock 打开集群
unlock-key 管理解锁键key
update 更新群集群

Swarm 缺陷

  1. 无法监控某一个docker节点(主机)=》解决方案 k8s
  2. 安装docker主机耗时;每安一次OS环境都需要对应的配置一次docker主机,比如:10台linux系统,需要安装10个docker主机 =》docker-machine(关键),参考:https://www.cnblogs.com/sparkdev/p/7066789.html
  3. 集群容器如何做数据持久化? =》volums 数据卷(关键)
  4. 当 service 的 work 节点容器宕机,无法监控和感知;

针对以上【swarm缺陷】的解决方案 =》【k8s/Kubermetes

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
5月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
713 6
|
10月前
|
Prometheus 监控 Cloud Native
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
除了Prometheus,还有哪些工具可以监控Docker Swarm集群的资源使用情况?
824 79
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
1751 91
|
Prometheus 监控 Cloud Native
如何使用Prometheus监控Docker Swarm集群的资源使用情况?
还可以根据实际需求进行进一步的配置和优化,如设置告警规则,当资源使用超出阈值时及时发出警报。通过这些步骤,能够有效地使用 Prometheus 对 Docker Swarm 集群的资源进行监控和管理。
737 161
|
Prometheus 监控 Cloud Native
如何监控Docker Swarm集群的性能?
如何监控Docker Swarm集群的性能?
882 163
|
调度 开发者 Docker
Docker Swarm
Docker Swarm 为容器化应用的部署和管理提供了一种高效、可靠的方式,使开发者能够更轻松地构建和运行分布式应用。随着容器技术的不断发展,Docker Swarm 在企业级应用中的应用也将越来越广泛。
486 162
|
监控 Docker 容器
Docker Swarm集群的扩展与缩容策略,涵盖其意义、方法、步骤及注意事项
本文深入探讨了Docker Swarm集群的扩展与缩容策略,涵盖其意义、方法、步骤及注意事项,旨在帮助用户高效管理集群资源,适应业务变化,确保服务稳定性和资源优化。
357 12
|
Kubernetes 负载均衡 调度
Docker Swarm 核心概念及详细使用
Docker Swarm 是 Docker 的原生集群管理工具,用于将多个 Docker 主机整合成一个虚拟主机,提供集群管理和调度功能。其核心特点包括集群管理、容错与高可用性、负载均衡、声明式服务模型、服务发现和安全性。本文档详细介绍了 Docker Swarm 的安装配置、服务部署、节点管理、网络配置及故障模拟等关键操作,适用于中小型项目或对 Kubernetes 复杂性有所顾虑的用户。
1319 6
|
应用服务中间件 nginx Docker
Docker Swarm、Docker Stack和Portainer的使用
Docker Swarm、Docker Stack 和 Portainer 各有其独特的功能和优势。Docker Swarm 适用于分布式服务的管理和编排,Docker Stack 便于多容器应用的定义和部署,而 Portainer 提供了直观的 UI,简化了 Docker 环境的管理。结合使用这些工具,可以大大提高容器化应用的部署和管理效率。希望本文对您理解和应用这些工具有所帮助。
866 5
|
API Docker 容器
【赵渝强老师】构建Docker Swarm集群
本文介绍了如何使用三台虚拟主机构建Docker Swarm集群。首先在master节点上初始化集群,然后通过特定命令将node1和node2作为worker节点加入集群。最后,在master节点上查看集群的节点信息,确认集群构建成功。文中还提供了相关图片和视频教程,帮助读者更好地理解和操作。
215 0