【云原生】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:latest
    environment:
      - TZ=Asia/Shanghai
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
      update_config:
        parallelism: 2
        delay: 10s
        monitor: 30s
        max_failure_ratio: 0.1
        order: start-first
    ports:
      - 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容器化相关技术的学习,本篇到此结束,感谢观看。