【云原生】docker swarm 使用详解

目录

一、前言

二、容器集群管理问题

2.1 docker集群管理问题概述

2.1.1 docker为什么需要容器部署

2.2 docker容器集群管理面临的挑战

三、docker集群部署与管理解决方案

四、Docker Swarm概述

4.1 Docker Swarm是什么

4.1.1 Docker Swarm架构图

4.1.2 Docker Swarm几个概念

4.1.3 Swarm工作流程

4.2 Docker Swarm特点

4.2.1 Docker Swarm优势

4.3 Docker Swarm应用场景

五、Docker Swarm使用实践

5.1 前置准备

5.1.1 服务器

5.1.2 提前安装docker

5.1.3 安装指定版本docker过程

5.2 集群基本操作

5.2.1 初始化集群操作

5.2.2 其他节点加入到集群

5.2.3 查看集群节点信息

5.2.4 解散集群

5.3 集群管理操作常用命令

5.3.1 查看集群节点信息

5.3.2 节点升级和降级

5.3.3 节点下线与上线

5.4 swarm服务管理操作实践

5.4.1 服务定义命令

5.4.2 使用swarm创建nginx容器

5.4.3 swarm 服务常用命令

5.4.4 swarm 创建mysql容器

5.5 swarm 集群弹性伸缩

5.5.1 弹性伸缩概念

5.5.2 mysql 弹性伸缩操作实践

5.5.3 update 命令对服务进行扩缩容

5.5.4 scale命令对服务扩缩容

5.6 swarm 集群服务滚动更新

5.6.1 滚动更新概念

5.6.2 swarm 滚动更新命令格式

5.6.3 升级mysql镜像为8.0

5.7 swarm 结合docker-compose使用

5.7.1 Docker Stack 简介

5.7.2 Docker Stack 使用过程

5.7.3 Docker Stack 核心特性

5.7.4 Docker Stack 部署nginx服务

5.7.5 Docker Stack 部署服务参数补充说明

5.7.6 Docker Stack 于Docker Service 差异

六、写在文末


一、前言

随着容器化部署越来越普遍,docker作为容器化部署最底层的支撑技术,也在云原生技术火热的当下占据着越来越重要的地位,但随之而来的也带来了新的问题,比如如何高效、便捷的对docker容器进行运维管理,如何可视化监控docker运行过程中的各种指标等等,尽管市面上也逐渐出现了一些解决方案,但如何结合项目或团队自身的状况去实践,也成了很多技术团队在使用docker做容器化部署时的一个难题。

二、容器集群管理问题

2.1 docker集群管理问题概述

相信做过微服务开发的同学应该不陌生,微服务经常与集群、分布式联系在一起,为什么呢?简单来说,任何一个跑在线上的系统,都无法忍受单点故障带来的级联问题的损失。

对于docker部署也是如此,尽管docker容器部署,可以尽可能的提升服务器利用率,让单台服务器部署尽可能多的应用,但这依然不符合高可用的部署思想,为此,大家熟悉的k8s就派上用场了,而k8s第一次登场,就强调集群,从而从根本上避免容器的单点故障。

2.1.1 docker为什么需要容器部署

Docker需要集群部署出于以下几个重要的原因:

  • 高可用性

    • 集群部署可以确保容器化应用的高可用性,当某个节点出现故障时,集群可以自动迁移容器实例,保证应用的持续可用。

  • 资源利用率

    • 集群部署可以统一管理多个节点上的资源,实现资源的共享和统一调度,提高资源利用率。

  • 横向扩展

    • 集群部署能够实现容器实例的动态横向扩展,根据负载情况自动增加或减少实例数量,以适应应用的需求。

  • 简化管理

    • 集群部署可以简化容器的管理和部署,统一调度和监控多个节点上的容器实例,简化运维工作。

  • 灵活性

    • 集群部署可以使得容器化应用更加灵活,能够支持大规模的应用部署和快速响应变化的业务需求。

  • 性能和可伸缩性

    • 集群部署可以提高容器化应用的性能和可伸缩性,能够更好地适应高负载和复杂的应用场景。

2.2 docker容器集群管理面临的挑战

docker集群管理可以为应用部署带来高可用的保障,但是Docker容器集群管理涉及一系列复杂问题,以下是一些常见的挑战:

  • 容器编排

    • 在集群中对容器进行调度和管理,确保应用高可用性、负载均衡和资源优化。

  • 服务发现

    • 确保容器能够动态地发现和通信,以及自动适应容器的动态变化。

  • 负载均衡

    • 均衡流量负载以确保集群中的容器应用能够平稳运行,同时提高整体性能和可用性。

  • 自动扩展

    • 根据负载情况自动扩展或缩减容器实例,以适应应用的需求。

  • 故障恢复

    • 在节点故障时自动转移容器实例,确保容器应用的高可用性。

  • 安全性与监控

    • 管理集群中的容器安全性,监控容器的运行状况、日志和性能。

  • 版本管理和滚动更新

    • 管理容器镜像的版本,实现滚动更新和灰度发布,确保服务的稳定性。

三、docker集群部署与管理解决方案

针对上述提到的问题,随着docker自身技术发展和大规模应用中出现的行业通用痛点,市场上也逐渐出现了不少解决方案,下面列举一些通用的解决方案提供参考。

  • Docker Swarm

    • Docker官方提供的集群管理工具,具有简单易用的特点,适合小规模集群和初学者使用。

  • Kubernetes

    • 开源的容器编排平台,具有强大的自动化部署、扩展和管理功能,适合大规模集群和复杂应用场景。也是目前最流行的容器化编排工具。

  • Apache Mesos

    • 面向大规模分布式系统的集群管理框架,支持多种工作负载包括Docker容器,适用于复杂的集群部署场景。

  • Rancher

    • 开源的容器管理平台,支持Docker Swarm和Kubernetes,提供了友好的图形化界面和丰富的功能,适合快速部署和管理集群。

  • Amazon ECS

    • 亚马逊云服务提供的容器编排服务,支持托管Docker容器的集群部署,适合在云环境中部署容器化应用。

四、Docker Swarm概述

4.1 Docker Swarm是什么

Docker Swarm是Docker官方提供的容器编排和集群管理工具。它允许将多个Docker主机(节点)组成一个虚拟的、统一的Docker集群,从而实现对容器化应用的自动化部署、扩展和管理。

官方文档:https://docs.docker.com/swarm/

4.1.1 Docker Swarm架构图

在结构图可以看出 Docker Client使用Swarm对 集群(Cluster)进行调度使用。图中可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持。

Docker Swarm实际在部署时,呈现如下架构:

4.1.2 Docker Swarm几个概念

Swarm

集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm。

Node

  • 一个节点是docker引擎集群的一个实例。

    • 您还可以将其视为Docker节点,您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。

  • 要将应用程序部署到swarm,请将服务定义提交给 管理器节点。管理器节点将称为任务的工作单元分派 给工作节点。

  • Manager节点还执行维护所需群集状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。

  • 工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。

  • 代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态。

Service

一个服务是任务的定义,管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。

Task

任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

4.1.3 Swarm工作流程

如下是关于Dcoker Swarm的工作流程,具体来说,主要步骤如下:

  • 集群初始化:通过docker Swarm init 初始化集群,执行该命令之后,docker主机自动成为manager节点(leader);

  • 节点加入:将其他主机加入集群,manager节点会为新加入节点分配角色和相应的任务;

  • 服务定义:用户通过定义服务来描述容器化应用程序,定义完成后,由manager节点分配;

    • 任务是swarm中最小化的调度单位,表现为一个单一的容器,服务是一组任务的集合并且定义了任务的属性;

  • 调度策略:leader节点根据调度策略(spread - 默认策略,binpack和random),在集群中选择合适的节点部署容器实例;

  • 容器编排:leader节点负责对容器进行编排和管理,包括创建、启动、停止、重启实例等操作;

4.2 Docker Swarm特点

Docker Swarm在工作时具有如下的特点:

  • 集群管理

    • Docker Swarm允许将多个Docker主机组成一个集群,统一管理和调度集群中的容器应用。

  • 自动容错

    • Swarm支持自动容错和恢复,能够在节点故障时自动转移容器应用,确保应用的高可用性。

  • 服务发现

    • Swarm提供服务发现机制,允许容器应用之间进行动态的服务发现和通信。

  • 负载均衡

    • Swarm集成了负载均衡功能,能够自动将流量分配到集群中的不同节点上。

  • 滚动更新

    • 支持滚动更新功能,能够在不中断服务的情况下对应用进行升级和更新。

  • 内置安全性

    • Swarm内置了安全通信机制,支持TLS加密和认证,确保集群通信的安全性。

  • 简单扩展

    • Swarm能够根据应用的需求进行动态扩展和收缩,实现自动化的横向扩展。

4.2.1 Docker Swarm优势

Docker Swarm具有以下优势:

  • 使用简单

    • 相对于其他容器编排工具,比如k8s来说,Docker Swarm的学习曲线更为平缓,因此对于新手来说更易上手。它与Docker Engine集成紧密,使得用户能够在短时间内开始使用和部署。

  • 无状态服务

    • Docker Swarm对无状态服务的支持较好,能够轻松地扩展和部署无状态的微服务应用。

  • Docker原生支持

    • 作为Docker官方提供的容器编排工具,与Docker Engine天然集成,能够直接使用Docker命令行工具来操作集群,如 docker servicedocker node 命令。

  • 简单的高可用性

    • Docker Swarm的高可用性设置相对简单,只需在集群中增加一个或多个管理节点即可实现高可用性。

  • 适用于小规模环境

    • 对于小规模的应用场景,Docker Swarm提供了一个轻量级的容器编排方案,具备一定的灵活性和可扩展性。

  • 社区支持

    • 作为Docker官方提供的解决方案,Docker Swarm拥有庞大的社区支持和丰富的文档资源,用户能够方便地获取帮助和支持。

4.3 Docker Swarm应用场景

Docker Swarm在实际应用中,如果有下面的场景符合你的需求可以考虑使用:

  • 小规模应用部署

    • 对于小规模的应用部署,如个人项目、小型企业应用等,Docker Swarm提供了一个简单易用的容器编排解决方案,可以帮助用户快速部署和管理容器化应用。

  • 简单的无状态服务

    • 对于一些无状态的服务,如Web服务、API服务等,Docker Swarm能够提供简单而有效的扩展和高可用性方案。

  • 混合环境部署

    • 在需要同时管理虚拟机和容器的混合环境中,Docker Swarm可以作为一个统一的部署和管理工具,帮助用户简化操作和管理。

  • 快速开发和测试环境

    • 在开发和测试阶段,Docker Swarm可以提供一个快速部署和管理容器的环境,使得开发人员能够更加高效地进行开发和测试工作。

  • 微服务架构

    • 针对一些小型的微服务应用,Docker Swarm能够提供简单的容器编排和管理方案,帮助用户实现微服务的部署和管理。

五、Docker Swarm使用实践

接下来通过实际操作全面演示下Docker Swarm的功能的使用。

5.1 前置准备

5.1.1 服务器

两台(至少,建议使用3台)服务器,并提前安装了docker环境,推荐使用云服务器,如下,我这里使用的是两台云服务器

5.1.2 提前安装docker

最好确保多台机器上的docker版本保持一致

5.1.3 安装指定版本docker过程

可以参照下面的步骤安装指定版本docker

1)安装必要的一些系统工具

yum install -y yum-utils device-mapper-persistent-data lvm2 

2)添加软件源信息

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

3)yum重新更新缓存

yum makecache fast 

4)查看可安装的docker版本信息

yum list docker-ce.x86_64 --showduplicates | sort -r 

5)安装指定版本的docker服务

选择上述系统展示出来的某个版本的docker进行安装

yum -y install docker-ce-17.09.0.ce-1.el7.centos 

6)查看docker版本信息

docker -v

7)加入开机自启动(非必须,根据自己情况而定)

systemctl enable docker.service

8)启动docker

systemctl start docker

9)配置docker镜像

建议提前配置好,否则后面使用swarm命令启动服务时会有问题

cd /etc/docker

vi daemon.json

将下面的信息拷贝到daemon.json文件中

{
"registry-mirrors": ["https://zfzbet67.mirror.aliyuncs.com"]}

然后使用下面两个命令让配置生效

sudo systemctl daemon-reload
sudo systemctl restart docker

5.2 集群基本操作

5.2.1 初始化集群操作

docker swarm集群的创建,首先需要初始化创建出一个manager的角色,即选择一个节点作为 Swarm 集群的管理节点(Manager Node),有点类似于搭建k8s时指定master节点,通过 --help命令也能看到;

使用下面的命令来初始化 Swarm 集群:

docker swarm init --advertise-addr IP地址

执行完成后,看到如下的效果,注意拷贝 docker swarm join那一串命令,后面其他节点加入的时候使用

5.2.2 其他节点加入到集群

在其他Docker节点上,使用上面初始化时生成的那串令牌来加入 Swarm 集群。在每个需要加入的节点上运行以下命令:

docker swarm join --token SWMTKN-1-50bjtqvphd4mwmmmeqm7ebqqv91pf2kcrd4dfj8hzi5kii6d3p-clfcap1nte6hr8n1jhjltxvu5 上一个IP:2377

将上面这段命令拷贝到另一台机器上面执行,如果出现下面的超时错误,表示新的node节点加入集群超时,可能是防火墙端口未开;

经过确认之后,我开放了manager的2377端口,并且在 /etc/docker/daemon.json中添加了对node节点的授信

最后,再次执行上面的节点加入命令,此时新的node就加入进去了

5.2.3 查看集群节点信息

通过下面的命令可以查看当前的swarm集群节点信息,可以看到目前是两个节点,其中一个被标准了Leader的标签极为manager节点

docker node ls

要注意的是,这个命令运行在其他node节点会报错,即普通的节点没有权限操作管理命令

5.2.4 解散集群

如果不再需要使用swarm管理docker集群,可以通过下面的几个命令对集群进行解散

#节点退出集群,如果是manager节点退出集群,需要加 -- force
docker swarm leave --force
#manager节点上面的操作
docker node rm 退出节点的主机名称

5.3 集群管理操作常用命令

集群节点管理命令均在管理节点上操作,工作节点上面没有操作权限

5.3.1 查看集群节点信息

查看集群所有节点

docker node ls

查看指定节点主机信息

docker node inspect 节点主机名

也可以通过 --pretty 参数格式化内容展示

docker service inspect --pretty 服务名称

5.3.2 节点升级和降级

使用升降级命令可以对集群节点的身份进行更改

#worker节点升级为manager节点
docker node promote 节点主机名
#manager节点降级为worker节点
docker node demote 节点主机名

比如这里将其中一个worker节点升级为manager,关键命令:promote 

docker node promote iZbp15j00qb04ypobayn5eZ

然后再降级回去,关键命令:demote 

docker node demote iZbp15j00qb04ypobayn5eZ

5.3.3 节点下线与上线

#节点暂停接受服务
docker node update --availability drain 节点主机名
#节点重新接受服务
docker node update --availability active 节点主机名

使用下线命令对worker节点操作,执行之后再次查看时,STATUS状态已经发生变化

docker node update --availability drain iZbp15j00qb04ypobayn5eZ

再次使用上线命令操作

docker node update --availability active iZbp15j00qb04ypobayn5eZ

5.4 swarm服务管理操作实践

5.4.1 服务定义命令

在管理节点上,你可以部署某个服务到 Swarm 集群,使用 docker service create 命令来创建一个新服务。完整的命令格式如下:

docker service create --name 服务名称 \
[-d] [-p] [-e] [--network] [--replicas] [--mount] \
image:tag

参数说明

  • -d ,表示后台运行;

  • -p ,端口映射;

  • --network ,表示使用得网络;

  • --replicas ,表示副本数;

  • --mount ,代表文件系统挂载;

5.4.2 使用swarm创建nginx容器

在几台机器上都提前创建nginx的映射目录,路径和内容都保持一致

mkdir -p nginx/html

然后再在该目录下添加一个index.html作为nginx的访问主页,内容如下:

执行如下命令创建nginx容器

docker service create -d --name nginx_01 --replicas=2 -p 81:80 --mount type=bind,source=/root/nginx/html,target=/usr/share/nginx/html nginx

执行之后,服务的任务有没有成功呢,可以通过 docker service ls进行查看,效果如下:

通过浏览器可以正常访问自定义的nginx页面信息

另一台机器上面也能正常访问

只要是swarm集群中的节点,通过上面的命令启动的容器服务,在每个节点上面都能访问到服务,其原理就是,当外界的请求到达时,如果请求的这个IP上面的服务正好存在,则直接由当前机器提供服务,如果当前IP没有,则会转发到其他能够提供服务的机器上去

5.4.3 swarm 服务常用命令

查看当前swarm集群服务列表

docker service ls

查看某个具体的服务信息

docker service ps 服务名称

服务移除

docker service rm 服务名称

执行完成后再次查看,服务已经看不到了

查看服务日志

docker service logs 服务名称

5.4.4 swarm 创建mysql容器

还记得我们在使用docker启动mysql容器的时候,在docker命令中通过-e参数来指定mysql容器的端口号,root账户的用户名和密码,使用swarm 创建服务容器时,也可以通过-e参数来指定,看下面的命令:

docker service create -d --name mysql_02 --replicas=2 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=db_01 \
mysql:5.7

执行成功后,通过docker service ls检查下服务信息

也可以使用客户端连接测试一下,可以看到默认的数据库db_01已经被创建出来了

5.5 swarm 集群弹性伸缩

5.5.1 弹性伸缩概念

Swarm弹性伸缩,是指在使用Docker Swarm集群管理容器时,能够根据当前的资源负载自动调整容器数量的能力。当负载增加时,Swarm会自动启动更多的容器来满足需求,而当负载减少时,Swarm也会自动停止一些容器以节省资源。这种弹性伸缩的能力可以帮助用户实现高可用性和高效率的容器管理。

5.5.2 mysql 弹性伸缩操作实践

使用下面的命令创建一个副本数为2的容器集群

docker service create -d --name mysql_01 --replicas=2 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
mysql:5.7

等待服务创建完成

5.5.3 update 命令对服务进行扩缩容

update 方式进行扩缩容操作命令

docker service update --replicas=新副本数 服务名称

如下,我们将上面的mysql_01服务副本数扩展为3个

docker service update --replicas=3 mysql_01

等待其执行完成

5.5.4 scale命令对服务扩缩容

如果不需要那么多服务时,可以考虑缩减服务的副本数,从而节省集机器资源的占用,命令格式如下:

docker service scale 服务名=新副本数

如下命令,将上面的mysql_01服务副本数缩减为2个

docker service scale mysql_01=1

5.6 swarm 集群服务滚动更新

5.6.1 滚动更新概念

 滚动更新也叫灰度更新,Swarm集群滚动更新是指在Docker Swarm集群中对容器进行逐步更新的过程。当需要更新集群中的容器时,Swarm可以按照指定的策略逐个或批量地替换旧的容器为新的容器,从而实现无缝的应用更新。

  • 滚动更新可以确保应用在更新过程中的持续可用性,避免因一次性更新所有容器而导致应用的停机时间。Swarm集群可以根据指定的更新策略(如逐个更新、批量更新、并行更新等)依次替换容器,以保证在整个更新过程中至少存在一定数量的可用容器。

  • 滚动更新还提供了回滚机制,即在更新过程中出现问题时可以自动回滚到之前的版本,以确保应用的稳定性。

  • 通过使用Swarm集群滚动更新功能,用户可以方便地更新和管理容器应用,提高应用的可用性和稳定性。

5.6.2 swarm 滚动更新命令格式

在swarm集群模式下,滚动更新的命令格式如下:

docker service update --replicas=副本数
--image 基础镜像
--update-delay 定义滚动更新的时间间隔(默认为0),单位:s/m/h/ms,1h20m30s,表示1小时20分30秒
--update-parallelism 定义并行更新服务时的最大数量(正在更新的这些任务不可用)
服务名称

5.6.3 升级mysql镜像为8.0

当前mysql_01服务只有过一个副本

将上述的mysql服务镜像升级为8.0,同时副本数由1个扩展为3个,每30秒扩展1个,完整的操作命令如下:

docker service update --replicas=3 \
--image mysql:8.0 \
--update-delay 30s \
--update-parallelism 3 \
mysql_01

等待上述命令执行完成之后,通过命令检查发现mysql已经由5.7升级为8.0,同时副本数也扩展为3个

5.7 swarm 结合docker-compose使用

通过上文的操作不难发现,使用docker service 创建出来的容器服务需要编写一大段的命令,如果是单个容器服务还不够明显,但涉及到较多的容器编排操作,比如部署一些微服务应用时,通过这种方式无异于给自己带来了很大的工作量,这就像使用原始的docker命令来创建容器一样,怎么解决这个问题呢?

在docker学习中,使用docker-compose可以协助完成规模化的容器编排工作,同样在这里,docker swarm也可以结合docker-compose一起使用,从而完成容器编排。

5.7.1 Docker Stack 简介

Docker Stack 是 Docker 的一种部署模式,旨在解决大规模场景下的多服务部署和管理问题。Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。基于此,不得不说下Docker Stack与Docker -compose的差异了。

  • docker-compose:可以在一台机器上使用docker-compose.yml轻松部署多个服务(如nginx,php,mysql)

  • docker swarm:将一个服务部署至多台机器(如nginx,部署到机器1,机器2,机器3)

通过 Docker Stack,用户可以使用相同的 Compose 文件来部署应用,但可以在该文件中增加针对 Swarm的特定配置,如副本数量和部署模式。这些配置包括重启策略、更新配置(如并行更新的容器数量、更新一组容器之间的等待时间等),以及部署堆栈的具体命令。

官方文档:docs.docker.com

5.7.2 Docker Stack 使用过程

  • 创建一个名为 docker-compose.yml 的文件

    • 定义了服务及其配置,如端口映射、副本数量和重启策略等

  • 初始化 Docker Swarm 并使用 docker stack deploy 命令部署 Stack

  • 部署完成后,用户可以使用 docker stack servicesdocker service ls 命令查看 Stack 的状态。

5.7.3 Docker Stack 核心特性

Docker Stack 的关键特性包括:

  • 期望状态管理:确保服务按照预期的状态运行。

  • 滚动升级:允许无缝更新应用,减少服务中断。

  • 简单易用:通过声明式模型简化多服务部署和管理。

  • 扩缩容:根据需求动态调整服务的副本数量。

  • 健康检查:监控服务的健康状态,确保服务可用性。

通过这些特性,Docker Stack 提供了一个强大且灵活的工具,用于在 Docker 环境中管理和扩展复杂的应用服务。

5.7.4 Docker Stack 部署nginx服务

使用Docker Stack的方式部署一个服务,需要下面几步:

  • 定义一个docker-compose.yml文件;

  • 在docker-compose.yml文件中按照docker-compose的相关语法格式编写编排指令;

  • 在swarm集群中的所有节点中,将上述的docker-compose.yml文件都存储一份,并确保目录完全相同;

  • 在真正执行Docker Stack命令之前,建议提前将docker-compose.yml文件中需要的镜像提前准备好;

  • 运行Docker Stack命令,对docker-compose.yml进行构建部署;

如下,在当前的目录下创建了一个docker-compose.yml文件,是部署nginx服务的,内容如下:

version: '3.6'
services:nginx:image: nginx:latestenvironment:- TZ=Asia/Shanghaideploy:replicas: 2restart_policy:condition: on-failureupdate_config:parallelism: 2delay: 10smonitor: 30smax_failure_ratio: 0.1order: start-firstports:- 81:80- 443:443

定义完成之后,需要将其拷贝到其他swarm集群中的节点相同目录下,然后使用下面的命令进行部署:

docker stack deploy -c docker-compose.yml 你自定义的stack名字

运行之后,如果一切顺利会看到下面的效果

然后你可以使用以下命令来查看 Stack 的状态

docker stack services mystack

也可以使用上面的那个 docker service ls查看,效果差不多

访问效果如下:

Docker Stack 移除命令

如果要移除 Stack,可以使用命令: docker stack rm 自定义的stack名称

5.7.5 Docker Stack 部署服务参数补充说明

在使用Swarm 进行服务部署时,你可以使用相同的 Compose 文件来部署这个应用。但有些参数是 Swarm 特有的配置,比如副本数量和部署模式,如deploy标签下是针对堆栈我们在原有 Compose 文件里增加的内容。下面结合其中几个关键参数进行说明。

restart_policy

  • 配置容器的重新启动,代替 restart

    • condition:值可以为 none 、on-failure 以及 any(默认)

    • delay:尝试重启的等待时间,默认为 0

    • max_attempts:在放弃之前尝试重新启动容器次数(默认:从不放弃)。如果重新启动在配置中没有成功 window,则此尝试不计入配置 max_attempts 值。例如,如果 max_attempts 值为 2,并且第一次尝试重新启动失败,则可能会尝试重新启动两次以上。windows:在决定重新启动是否成功之前的等时间,指定为持续时间(默认值:立即决定)。

update_config

  • 配置更新服务,用于无缝更新应用(rolling update)

    • parallelism:一次性更新的容器数量

    • delay:更新一组容器之间的等待时间。

    • failure_action:如果更新失败,可以执行的的是 continue、rollback 或 pause (默认)

    • monitor:每次任务更新后监视失败的时间(ns|us|ms|s|m|h)(默认为 0)

    • max_failure_ratio:在更新期间能接受的失败率

    • order:更新次序设置,top-first(旧的任务在开始新任务之前停止)、start-first(新的任务首先启动,并且正在运行的任务短暂重叠)(默认 stop-first)

Docker Stack其他常用命令补充

  • docker stack deploy 部署新的堆栈或更新现有堆栈

  • docker stack ls 列出现有堆栈

  • docker stack ps 列出堆栈中的任务

  • docker stack rm 删除一个或多个堆栈

  • docker stack services 列出堆栈中的服务

5.7.6 Docker Stack 于Docker Service 差异

docker stack和docker service 命令有点类似,实际上,Docker Stack是建立在Docker Service之上的一种更高级的抽象。

  • 使用Docker Service,可以单独管理每个服务,并对其进行伸缩、更新和删除;

  • 使用Docker Stack,可以将一组相关的服务捆绑在一起,并通过编排文件定义它们之间的关系和依赖性,方便一次性部署和管理整个应用程序;

一般来说,可以根据个人需求选择合适的工具,单个服务可以考虑使用Docker Service,而复杂得应用程序,或涉及到较多的服务需要编排时可以考虑使用Docker Stack。

六、写在文末

本文通过较大的篇幅详细介绍了docker swarm 的使用,容器化技术发展到今天已经愈加成熟,而围绕着容器化相关的技术体系也越来越丰富,因此有必要加深对docker容器化相关技术的学习,本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351293.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【最新鸿蒙应用开发】——鸿蒙中的“Slot插槽”?@BuilderParam

构建函数-BuilderParam 传递 UI 1. 引言 BuilderParam 该装饰器用于声明任意UI描述的一个元素,类似slot占位符。 简而言之:就是自定义组件允许外部传递 UI Entry Component struct Index {build() {Column({ space: 15 }) {SonCom() {// 直接传递进来…

机器学习笔记 - 用于3D点云数据分割的Point Net的训练

一、数据集简述 ​在本教程中,我们将学习如何在斯坦福 3D 室内场景数据集 ( S3DIS )上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集,包含来自多栋建筑的室内空间点云,占地面积超过 6000 平方米。Point Net使用整个点云,能够执行分类和分割任务。如果你一直在关注 …

LVS负载均衡集群企业级应用实战-LVS-DR(四)

目录 LVS-DR 一. 环境准备 二. 对虚拟主机操作 三. 对真实服务器操作 四. 打开网页测试 LVS-DR 一. 环境准备 三台虚拟机,都要在同一网段内,统一关闭防火墙和selinux,时间同步,配置好YUM源。系统用centos和roucky都行。 主…

matlab-2-simulink-小白教程-如何绘制电路图进行电路仿真

以上述电路图为例:包含D触发器,时钟CLK,与非门 一、启动simulink的三种方式 方式1 在MATLAB的命令行窗口输入“Simulink”命令。 方式2 在MATLAB主窗口的“主页”选项卡中,单击“SIMULINK”命令组中的Simulink命令按钮。 方式3 从MATLAB…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…

光明网发稿投稿流程与要求,光明日报如何投稿?附光明网多少钱(价格表)

对于想要在光明网发稿的作者来说,媒介多多网发稿平台是一个绝佳的投稿选择。光明网作为国内一流的新闻媒体平台,其严谨的文章审核标准和广泛的读者基础吸引着无数作者。然而,由于其严格的发稿标准,一些作者可能会遇到一些困难&…

基于Python+OpenCV高速公路行驶车辆的速度检测系统

简介: 基于Python和OpenCV的高速公路行驶车辆的速度检测系统旨在实时监测高速公路上的车辆,并测量它们的速度。该系统可以用于交通监控、道路安全管理等领域,为相关部门提供重要的数据支持。 系统实现: 视频流输入:系…

快速理解 Node.js 版本差异:3 分钟指南

Node.js 是一个广泛使用的 JavaScript 运行时环境,允许开发者在服务器端运行 JavaScript 代码。随着技术的发展,Node.js 不断推出新版本,引入新特性和改进。了解不同版本之间的差异对于开发者来说至关重要。以下是一个快速指南,帮…

Docker安装Nginx(各种错误版)

Docker安装-CSDN博客 看过程就一点点看,看结果直接看最后 安装启动Docker之后 docker run -d -p 81:81 --name nginx nginx 这样没有指定版本 docker run:启动一个新的容器。-d:以分离模式运行容器(后台运行)。-p 81:81&…

【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)

最终效果 文章目录 最终效果前言素材下载简单搭建环境控制小鸟生成弹簧 限制小鸟的控制范围弹簧线的显示隐藏飞行新增木头木头销毁不同血量的木头状态配置更多物品爆炸效果创建敌人的小猪创建多个小鸟循环游戏结束相机跟随加分特效不同定义技能的鸟加速鸟回旋鸟爆炸鸟效果 轨迹…

【MySQL】服务器配置和管理

本文使用的MySQL版本是8.0 MySQL服务器介绍 MySQL服务器通常说的是mysqld程序。 mysqld 是 MySQL 数据库服务器的核心程序,负责处理客户端的请求、管理数据库和执行数据库操作。管理员可以通过配置文件和各种工具来管理和监控 mysqld 服务器的运行 官方文档&…

YOLOv10涨点改进SPPF创新结构,重新设计全局平均池化层和全局最大池化层,增强全局视角信息和不同尺度大小的特征

本文改进:SPPF_improve利用全局平均池化层和全局最大池化层,加入一些全局背景信息和边缘信息,从而获取全局视角信息并减轻不同尺度大小所带来的影响,强烈推荐,适合直接使用,paper创新级。 目录 1,YOLOv10介绍 1.1 C2fUIB介绍 1.2 PSA介绍 1.3 SCDown 2.SPP &SP…

Hvv--知攻善防应急响应靶机--Linux1

HW–应急响应靶机–Linux1 所有靶机均来自 知攻善防实验室 靶机整理: 夸克网盘:https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘:https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP:https://mp.weixin.…

工业自动化领域常见的通讯协议

工业自动化领域常见的通讯协议,包括PROFINET、PROFIBUS、Modbus、Ethernet/IP、CANopen、DeviceNet和BACnet。通过分析这些协议的技术特点、应用场景及优势,比较它们在工业自动化中的性能和适用性,帮助选择最合适的协议以优化系统性能和可靠性…

基于某评论的TF-IDF下的LDA主题模型分析

完整代码: import numpy as np import re import pandas as pd import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.decomposition import LatentDirichletAllocationdf1 pd.read_csv(小红书评论.csv) # 读取同目录下csv文件…

Java | Leetcode Java题解之第151题反转字符串中的单词

题目: 题解: class Solution {public String reverseWords(String s) {StringBuilder sb trimSpaces(s);// 翻转字符串reverse(sb, 0, sb.length() - 1);// 翻转每个单词reverseEachWord(sb);return sb.toString();}public StringBuilder trimSpaces(S…

HAL库开发--SPI的配置方式和读写操作

知不足而奋进 望远山而前行 目录 文章目录 前言 目标 内容 需求 SPI配置 SPI编码 OLED驱动拷贝 OLED的GPIO初始化修改 实现SPI的读写 总结 前言 SPI(Serial Peripheral Interface)是一种常见的串行通信协议,在嵌入式系统中被广泛…

记录一次root过程

设备: Redmi k40s 第一步, 解锁BL(会重置手机系统!!!所有数据都会没有!!!) 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是,这个手机…

Java基础——网络编程(一)

初识网络编程 网络编程:在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件…… BS架构的优缺点: 1、不需要开发客户端,只需要页面服务端 2、…

可视化大屏开发系列——页面布局

页面布局是可视化大屏的基础,想要拥有一个基本美观的大屏,就得考虑页面整体模块的宽高自适应,我们自然就会想到具有强大灵活性flex布局,再借助百分比布局来辅助。至此,大屏页面布局问题即可得到解决。 写在前面&#x…