Docker Swarm管理

Docker Swarm管理

本章资源请访问:
https://download.csdn.net/download/weixin_54373617/18740064

技能目标:

  • 了解 Docker Swarm 基本特性

  • 理解 Docker Swarm 基本架构

  • 掌握 Docker Swarm 集群部署

  • 掌握 Docker Swarm 节点管理

  • 掌握 Docker Swarm 服务管理

容器编排部署工具除 Google 推出的 Kubernetes 之外,还有 Docker 发布的 Swarm 与Mesos 推出的 Marathon。本章将从基本概念、工作原理与安装部署及管理等方面介绍Docker 官方推出的 Docker Swarm。


案例一 Docker Swarm 群集部署

Docker 自诞生以来,其容器特性以及镜像特性给 Dev(b编程)Ops(运维) 爱好者带来诸多方便。然而在很长一段时间内,Docker 只能在单机上运行,其跨主机部署、运行与管理能力颇受外界诟病。跨主机能力薄弱,导致 Docker 容器与主机的形成高度耦合,降低了 Docker 容器的灵活性,难以实现容器的迁移、分组等功能。

案例概述

在这里插入图片描述


案例前置知识点

Docker Swarm 概述

Docker Swarm 是 Docker 社区提供的基于 Docker 的集群管理调度工具,能够将多台主机构建成一个 Docker 集群,用户通过 API 来管理多个主机上的 Docker,并结合 Overlay 网络实现容器的调度与相互访问。
在这里插入图片描述
Docker Swarm 默认对外提供两种 API。

  • 标准的 Docker API:包括 Docker Client、Dokku、Compose、DockerUI、Jenkins 等, 它们可以通过 Swarm 工具与 Docker 集群进行通信;
  • 集群管理 API:用于集群的管理。

在这里插入图片描述


基本特性

Docker 集群管理和编排的特性是通过 SwarmKit 进行构建的, 其中 Swarm 模式是Docker 内置支持的一种默认实现。Docker 1.12 以及更新的版本,都支持 Swarm 模式。用户可以基于 Docker 构建 Swarm 集群,然后就可以将应用服务(Application Service)部署到 Swarm 集群中。

在这里插入图片描述

  • 集群管理集成进 Docker Engin(引擎):使用内置的集群管理功能,可以直接通过 Docker CLI(命令行) 命令来创建 Swarm 集群,并部署应用服务,而不需要其它外部软件来创建和管理Swarm 集群。
  • 去中心化设计: Swarm 集群中包含管理节点(Manager)和工作节点(Worker)两类, 可以直接基于 Docker Engine 来部署任何类型的节点。在 Swarm 集群运行期间,可以对其作出任何改变,实现对集群的扩容和缩容等,如添加与删除节点。而做这些操作时不需要暂停或重启当前的 Swarm 集群服务。
  • 声明式服务模型:在实现的应用栈中,Docker Engine 使用了一种声明的方式,可以定义各种所期望的服务状态。
  • 缩放:对于每个服务,可以声明要运行的任务数。向上或向下扩展时,Swarm 集群会通过添加或删除任务来自动调整以维持所需的状态。
  • 协调预期状态与实际状态的一致性:管理节点会不断地监控并协调集群的状态,使得Swarm 集群的预期状态和实际状态保持一致。例如启动一个应用服务,指定服务副本为 10,则会启动 10 个 Docker 容器去运行。如果某个工作节点上面运行的 2 个 Docker 容器挂掉了,管理节点会在 Swarm 集群中其它可用的工作节点上创建 2 个服务副本, 使得实际运行的 Docker 容器数保持与预期的 10 个一致。
  • 多主机网络:Swarm 集群支持多主机网络,可以为服务指定覆盖网络。管理节点在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
  • 服务发现:管理节点会给 Swarm 集群中每一个服务分配一个唯一的 DNS 名称,对运行中的 Docker 容器进行负载均衡。可以通过 Swarm 内置的 DNS 服务器,查询 Swarm 集群中运行的 Docker 容器状态。
  • 负载均衡:在 Swarm 集群中,可以指定如何在各个 Node 之间分发服务容器(Service Container),实现负载均衡。如果想要使用 Swarm 集群外部的负载均衡器,可以将服务容器的端口暴露到外部。
  • 默认安全:Swarm 集群中的每个节点都强制执行 TLS 相互身份验证和加密,以保护自身与所有其他节点之间的通信。用户可以选择使用自签名根证书或自定义根 CA 的证书。
  • 滚动更新:对于服务需要更新的场景,可以在多个节点上进行增量部署更新,在 Swarm 管理节点使用 Docker CLI 设置一个 delay(延迟)时间间隔,实现多个服务在多个节点上依次进行部署,这样可以非常灵活地控制。如果有一个服务更新失败,则暂停后面 的更新操作,重新回滚到更新之前的版本。

关键概念

下面是 Docker Swarm 中主要的关键概念。

节点
每个参与到 Swarm 集群中的 Docker Engine 都称之为一个节点。在单个物理计算机或云服务器上运行一个或多个节点,但是生产环境下的集群部署通常包括分布在多个物理和 云机器上的 Docker 节点。集群中节点主要分为管理节点与工作节点。

若要将应用程序部署到集群中,则需要将服务定义提交给管理节点。管理节点将被称为 任务的工作单元分派给工作节点。为了维持 Swarm 集群的目标状态,管理节点还将承担编排和集群管理的功能。一旦存在多个管理节点时,会选出一个领导来进行任务编排。

工作节点用于接收并执行来自管理节点分发的任务。默认情况下,管理节点也是工作节 点,也可以把它配置成只充当管理节点的角色。工作节点将所负责任务的当前状态通知给管 理节点,以便管理节点可以维护每个工作节点的期望状态。

服务与任务
服务定义了需要在工作节点上执行的任务。它是 Swarm 系统的中心结构,也是用户和 Swarm 交互的主要根源。

创建服务时,可以指定要使用的容器镜像以及在运行容器中执行的命令。

在复制服务模型中,Swarm 管理器根据所需状态中设置的比例在节点之间分配特定数量的副本任务。

任务是 Swarm 集群中最小的调度单位,每个任务都包含一个容器和需要在容器中执行的指令。管理器根据服务中定义的副本数量将任务分配给工作节点。一旦某个任务被分配 到某个节点,就不能再移动到其他节点。它只能在分配的节点上运行或者失败。

负载均衡
集群管理器使用负载均衡入口来公开对外提供的服务。集群管理器可以自动为
PublishedPort(对外发布的端口)分配服务,也可以为服务配置 PublishedPort。部署服务时可以指定任何未使用的端口为服务端口;如果部署服务时未指定端口,Swarm 管理器会为服务自动分配 30000-32767 范围内的端口。

外部组件(例如云负载均衡器)可以访问集群中任何节点的 PublishedPort 上的服务, 无论该节点当前是否正在运行该服务的任务。集群中的所有节点都将入口连接到正在运行的任务实例。

Swarm 模式有一个内部 DNS 组件,可以自动为 Swarm 中的每个服务分配一个 DNS条目。集群管理器使用内部负载均衡来根据服务的 DNS 名称在集群内的服务之间分发请求。

工作原理

在 Swarm 集群中部署镜像创建一个服务时。在一些大的应用上下文环境中需要各种服务配合工作,这样的服务通常称之为微服务。微服务可能是一个 HTTP 服务器、数据库、或者分布式环境中运行的任何其他可执行的程序。

在创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令。服务还可以定义 下面选项:

  • 集群要对外服务的端口;

  • 在集群中用于服务之间相连的 Overlay 网络;

  • 滚动更新策略;

  • 集群总运行的副本数量。
    在这里插入图片描述

下面从以下几个方面具体介绍服务、任务与容器的具体工作方法。

服务、任务与容器

当服务部署到集群时,Swarm 管理节点会将服务定义作为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群节点上彼此独立运行。

容器是一个独立的进程。在 Swarm 集群中,每个任务都会调用一个容器。一旦容器运行,调度程序认为该任务处于运行状态。如果容器健康监测失败或者终止,那么任务也终止。

任务与调度
任务是集群内调度的原子单位。当创建或者更新服务来声明所需的服务状态时,协调器 通过调度任务来实现所需的状态。

任务是单向的机制,它通过一系列状态单独进行:分配、准备、运行等操作。如果任务失败,协调器将删除任务与容器,然后根据服务指定的所需状态创建一个新的任务来代替它。

待处理的服务
配置服务时,若集群中当前没有可用的节点。在这种情况下,也可以成功配置服务,但所配置服务会处于待处理状态(挂起状态)。以下是服务可能处于待处理状态的几个示例。

如果在集群中所有节点被暂停或耗尽时,创建了一个服务,服务则被挂起,直到节点可 用。实际上,当节点恢复时,第一个可用的节点将会获得所有的任务,这在生产环境中并不是一件好事。

  • 配置服务时可以为服务预留特定数量的内存。如果集群中没有节点满足所需的内存量, 服务则被挂起,直到有可用的节点运行其任务。如果指定了非常大的内存值(如 500G),任务将永久挂起,除非确实有一个满足该条件的节点。
  • 配置服务时可以对服务施加约束,并且可能无法在给定时间履行约束,服务则被挂起。

副本和全局服务

服务部署分为两种类型:副本服务和全局服务。

  • 副本服务:指定要运行的相同任务的数量,每个副本都是相同的内容。

  • 全局服务:是在每个节点上运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到集群中,调度器将创建一个任务,并且调度器将任务分配给新加入的节点。 全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。


案例一:Docker Swarm 群集部署

案例环境

在这里插入图片描述
案例实验环境的网络拓扑如下图

在这里插入图片描述

案例需求

本案例的需求如下:

部署 Docker Swarm 集群,要求集群中包含一个管理节点(manager)和两个工作节点(worker01、worker02)。
在这里插入图片描述

案例实现思路

本案例的实现思路如下:

(1) 准备 Docker Swarm 部署环境;

(2) 部署 Docker Swarm 集群。

案例一实施

在部署 Docker Swarm 之前需要先对服务器进行基础的环境配置。

主机配置

设置主机名
在三台主机上分别设置相对应的主机名。

  • manager节点操作
    [root@localhost ~]# hostnamectl set-hostname manager
    [root@localhost ~]# su
    [root@manager ~]#

  • worker1节点操作
    [root@localhost ~]# hostnamectl set-hostname worker1
    [root@localhost ~]# su
    [root@worker1 ~]#

  • worker2节点操作
    [root@localhost ~]# hostnamectl set-hostname worker2
    [root@localhost ~]# su
    [root@worker2 ~]#

所有节点关闭防火墙、Selinux
这里以manager节点为例,其他节点操作相同

  • manager节点操作
    [root@manager ~]# systemctl stop firewalld
    [root@manager ~]# systemctl disable firewalld
    [root@manager ~]# vim /etc/selinux/config
    在这里插入图片描述

所有主机修改 hosts 文件
以manager为例,其他节点也是相同配置这里就不作演示了

  • manager节点操作
    [root@manager ~]# vim /etc/hosts
    在这里插入图片描述

添加外网 DNS 服务器
在所有主机上添加外网 DNS 服务器,也可以根据本地的网络环境添加相对应的 DNS服务器。如果没有DNS服务器,就不用添加了。

下面以 manager 主机为例进行操作。
DNS服务器名字 服务器IP
[root@manager ~]# echo ”nameserver 223.6.6.6”>> /etc/resolv.conf
修改网卡中配置文件中的DNS地址

我这里没有DNS服务器,就不添加了

所有节点安装 Docker
以manager节点为例,其他节点操作相同

  • manager节点操作
    [root@manager ~]# curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
    [root@manager ~]# systemctl start docker
    [root@manager ~]# systemctl enable docker

部署 Docker Swarm 集群

安装完 Docker 后,可以使用 docker swarm 命令创建 Docker Swarm 集群。

创建 Docker Swarm 集群

创建 Docker Swarm 集群命令格式为:

docker swarm init --advertise-addr (manager节点IP)

其中:–advertise-addr 选项用于指定 Swarm 集群中管理节点(manager 节点)的 IP 地址,后续工作节点(worker 节点)加入集群时,必须能够访问管理节点的 IP 地址。在manager 主机上,执行如下命令即可创建一个 Swarm 集群。

[root@manager ~]# docker swarm init --advertise-addr 192.168.10.106
在这里插入图片描述画红线处出现的命令是为了让你复制到工作节点执行的,记得是所有工作节点都要执行,这样工作节点就加入了Swarm群集中了,如下图

  • worker1节点操作
    在这里插入图片描述
  • worker2节点操作
    在这里插入图片描述

注意:如果未看到让worker节点加入群居的命令时,就是前面图片中画线的地方,也可以通过 docker swarm join-token worker 命令重新获取worker节点加入群集的命令,无论是获取管理节点加入swarm群集还是工作节点加入swarm都是在节点manager节点操作

在manager节点操作:
在这里插入图片描述

管理节点加入集群:执行 docker swarm join-token manager 命令,获取管理节点加入到 Swarm 集群的命令。当配置 Swarm 集群的 HA 时可以使用该命令设置多个管理节点。
在这里插入图片描述

查看 Swarm 集群的信息

manager节点操作
前面命令执行完成后,使用 docker info 命令在管理节点上查看 Swarm 集群的信息,具体操作如下所示。

[root@manager ~]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
scan: Docker Scan (Docker Inc.)

Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.6
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: x8pjvcgrqrbae3aeu036p43b8
Is Manager: true
ClusterID: xkam2su60438t54kciovzxd2m
Managers: 1
Nodes: 3
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 192.168.10.106
Manager Addresses:
192.168.10.106:2377
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-1160.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 972.3MiB
Name: manager
ID: QC5E:6NTQ:EMNM:LTLL:MVTB:BGER:ONHZ:2IAX:F2R6:YN7B:NG5M:5CWB
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

查看 Swarm 集群中 所有节点的详细状态信息

manager节点操作
使用 docker node ls 命令可以查看 Swarm 集群中全部节点的详细状态信息。
在这里插入图片描述leader:领导者,管理者
上图说明了manager节点是这个群集的管理节点

上面信息中,AVAILABILITY 表示 Swarm Scheduler 是否可以向集群中的某个节点指派任务,对应有如下三种状态:

  • Active:集群中该节点可以被指派任务。

  • Pause:集群中该节点不可以被指派新的任务,但是其他已经存在的任务保持运行。

  • Drain:集群中该节点不可以被指派新的任务,Swarm Scheduler 停掉已经存在的任务, 并将它们调度到可用的节点上。

查看某一个 节点 的详细状态信息

只可以在管理节点上执行如下命令。

命令格式如下:

docker node inspect 节点名

[root@manager ~]# docker node inspect manager
在这里插入图片描述在这里插入图片描述在这里插入图片描述上面的查看方法显示的内容太看着不太方便,我们还可以使用下面的命令查看

docker node inspect --pretty 节点名

[root@manager ~]# docker node inspect --pretty manager
在这里插入图片描述

  • 查看 worker1 节点详细信息:docker node inspect worker1。

  • 查看 worker2 节点详细信息:docker node inspect worker2。至此,Docker Swarm 集群部署完成。

案例二 Docker Swarm 管理

案例概述

在企业中,相对于 Docker Swarm 集群的安装部署,更重要的是 Docker Swarm 集群的管理。公司要求云计算工程师可对 Docker Swarm 进行日常管理。包括不限于节点管理、服务管理、网络管理、数据卷管理等等,以便对应公司可能提出的各种管理需求。

案例前置知识点

Docker Swarm 中的节点
运行 Docker 主机时可以自动初始化一个 Swarm 集群,或者加入一个已存在的 Swarm集群,如此运行的 Docker 主机将成为 Swarm 集群中的节(Node)。

Swarm 集群中的节点分为管理节点和工作节点。

在这里插入图片描述

  • 管理节点用于 Swarm 集群的管理,负责执行编排和集群管理工作,保持并维护 Swarm 处于期望的状态。Swarm 集群中如果有多个管理节点,就会自动协商并选举出一个leader 执行编排任务;

  • 工作节点是任务执行节点,管理节点将服务(Service)下发至工作节点执行。管理节点默 认也作为工作节点。

管理节点与工作节点通过提权和降权命令相互转换角色,大部分 Docker Swarm 命令只能在管理节点执行,但工作节点退出集群的命令则是在工作节点上执行。

服务和任务
在这里插入图片描述
任务Task)是 Swarm 集群中最小的调度单位,对应一个单一的容器。

服务Service)是指一组任务的集合,服务定义了任务的属性。服务包含两种工作模式:

  • 副本服务(replicated services):按照一定规则在各个工作节点上运行指定个数的任务;

  • 全局服务(global services):每个工作节点上运行一个任务。
    在这里插入图片描述服务的两种模式可以在执行 docker service create 命令创建服务时,通过-mode 参数指定。

在 Swarm 集群上部署服务,必须在管理节点上进行操作。下图是 Service(服务)、Task(任务)、Container(容器)三者之间的关系。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

案例需求

本案例的需求如下:

实现 Docker Swarm 日常操作管理,包括:节点管理、服务管理、网络管理、数据卷管理。

案例实现思路

本案例的实现思路如下:

(1) 日常管理 Docker Swarm 节点;

(2) 创建实现与管理 Docker Swarm 服务。

案例二 实施

Docker Swarm 节点管理

注意:管理节点的操作都是在manager节点进行
在这里插入图片描述

按照对节点的不同操作,通过命令的方式做详细说明。

节点状态变更管理
在这里插入图片描述
Swarm 支持设置一组管理节点,通过支持多管理节点实现 HA(高可用)。这些管理节点之间的状态的一致性是非常重要的。在上面提到过,节点的 AVAILABILITY 有三种状态:Active、Pause、Drain。对某个节点进行变更,可以将其 AVAILABILITY 值通过 Docker CLI (命令行) 修改为对应的状态。
下面是常见的变更操作:

  • 设置管理节点只具有管理功能;

  • 对服务进行停机维护,可以修改 AVAILABILITY 为 Drain 状态;

  • 暂停一个节点,使该节点就不再接收新的 Task;

  • 恢复一个不可用或者暂停的节点。

例如,将管理节点的 AVAILABILITY 值修改为 Drain 状态,使其只具备管理功能,具体操作如下所示。

[root@manager ~]# docker node update --availability drain manager
在这里插入图片描述从上图可以看出manager节点状态为drain

如此,管理节点就不能被指派任务,也就是不能部署实际的 Docker 容器来运行服务, 而只是担任管理者的角色。

添加删除标签元数据

在生产环境中,可能每个节点的主机配置情况不同,比如:有的适合运行 CPU 密集型应用、有的适合运行 IO 密集型应用。Swarm 支持给每个节点添加标签元数据,根据节点的标签,选择性地调度某个服务部署到期望的一组节点上。
在这里插入图片描述
[root@manager ~]# docker node update --label-add name=workerone worker1

[root@manager ~]# docker node inspect worker1
查看 worker01 主机的标签是否添加成功
[root@manager ~]# docker node inspect worker1
在这里插入图片描述从上图可以看出已经设置成功

删除标签标签元数据

docker node update --label-rm 键 节点名

[root@manager ~]# docker node update --label-rm name worker1
在这里插入图片描述经过查看可以看到键值已经没有了

节点提权/降权

前面提到,在 Swarm 集群中节点分为管理节点与工作节点两种。在实际的生产环境中根据实际需求可更改节点的角色,常见操作有:

  • 工作节点变为管理节点:提权操作;

  • 管理节点变为工作节点:降权操作。

示例:将 worker1 和 worker2 都升级为管理节点,具体操作如下所示。

[root@manager ~]# docker node promote worker1 worker2
Node worker1 promoted to a manager in the swarm.
Node worker2 promoted to a manager in the swarm.

在这里插入图片描述
示例:对上面已提权的 worker1 和 worker2 执行降权操作,需要执行如下命令。
[root@manager ~]# docker node demote worker1 worker2
Manager worker1 demoted in the swarm.
Manager worker2 demoted in the swarm.
在这里插入图片描述

退出 Swarm 集群
如果管理节点想要退出 Swarm 集群, 在管理节点上执行 docker swarm leave 命令, 具体操作如下所示。
[root@manager ~]# docker swarm leave

若群集中还存在其他的Worker Node 时,Manager想强制退出集群,后面跟上 – force
[root@manager ~]# docker swarm leave --force

注意:管理节点一旦退出Swarm 集群就不能加入集群了,所以这里就不作演示了
如果是在想让管理节点退出Swarm群集可以先把管理节点改为工作节点

如果工作节点想要退出 Swarm 集群,在工作节点上执行 docker swarm leave
命令,具体操作如下所示。

[root@worker1 ~]# docker swarm leave

即使管理节点已经退出 Swarm 集群,执行上述命令也可以使得工作节点退出集群。之后,根据需要,加入到其它新建的 Swarm 集群中。需要注意的是,管理节点退出集群后无法重新加入之前退出的集群;工作节点退出集群后通过 docker swarm join 命令并指定对应的 token 值重新加入集群。

Docker Swarm 服务管理

在 Swarm 模式下使用 Docker,可以实现部署运行服务、服务扩容缩容、删除服务、滚动更新等功能,下面依次进行说明。

创建服务

使用 docker service create 命令可以创建 Docker 服务。

示例:从 Docker 镜像 nginx 创建一个名称为 web 的服务,指定服务副本数为 2。具体操作如下所示。

docker service create --replicas 副本数 --name 服务名称 镜像名

[root@manager ~]# docker service create --replicas 2 --name web nginx

–replicas 指定副本数
–name 指定名字
nginx 这个位置是镜像,这里用的是nginx镜像
在这里插入图片描述

也可以添加-p选项,让我们可以访问nginx

[root@manager ~]# docker service create --replicas 2 --name web -p 4001:80 nginx

-p:指定宿主机端口映射到容器中的80端口
这样我们就可以访问nginx了
在这里插入图片描述在这里插入图片描述
然后我们用浏览器访问worker节点IP+映射到容器中的端口来访问就行了,
在这里插入图片描述在这里插入图片描述这里我的两个worker节点IP都可以访问nginx服务,说明两个副本平均分配到了两台节点上,这里如果你访问manager节点是访问不到的,它的状态是drain 是不运行任何服务的,只是充当一个管理者


查看部署服务日志
-f 实时查看
web 指定要查看的服务,这里我指定的是刚才创建的web

[root@manager ~]# docker service logs -f web

执行如下命令可查看当前已经部署启动的全部应用服务。

[root@manager ~]# docker service ls
在这里插入图片描述

执行如下命令可以查询指定服务的详细信息。

[root@manager ~]# docker service ps web
在这里插入图片描述从上图中可以看出,两个副本分别部署在了连个工作节点上,实现咋负载

上面信息显示,在 worker01 和 worker02 节点上部署了 Web 应用服务,也包含了它们对应的当前状态信息。

此时,可以通过执行 docker ps 命令,在工作节点上查看当前启动的Docker 容器。

worker1节点操作
在这里插入图片描述
worker2节点操作
在这里插入图片描述

显示服务详细信息

manager节点操做
常见服务详细信息有以 JSON 格式显示、易于阅读显示两种显示方式。

(1) 以 JSON 格式显示

可以通过下面的命令,以 JSON 格式显示方法 Web 服务的详细信息。
[root@manager ~]# docker service inspect web

(2) 易于阅读显示

可以通过执行下面命令,以易于阅读方式显示 Web 服务的详细信息

[root@manager ~]# docker service inspect --pretty web
在这里插入图片描述

服务的扩容缩容

当使用服务并涉及到高可用时,可能会有服务的扩容和缩容等操作。服务扩容缩容的命 令格式如下所示,通过 Task 总数确定服务是扩容还是缩容,这个数值可随意变化,0 也是可以的。

docker service scale 服务名/ID=服务Task总数

示例:将前面已经部署的 2 个副本的 Web 服务,缩容到 0 个副本,具体操作如下所示。

进行服务缩容操作时只需要设置副本数小于当前应用服务拥有的副本数即可,大于指定缩容副本数的副本 会被删除。

[root@manager ~]# docker service scale web=0
web scaled to 0
overall progress: 0 out of 0 tasks
verify: Service converged

通过 docker service ps web 命令查看服务缩容结果,具体操作如下所示,可以看到已经没有服务了。
在这里插入图片描述还可以在worker节点上使用docker ps -a 查看

根据上述命令结果得知,worker01 节点上有两个 Web 应用服务的副本。进行服务扩容操作时只需要设置副本数大于当前应用服务拥有的副本数即可,小于指定扩容副本数的副本会增加。

[root@manager ~]# docker service scale web=2
在这里插入图片描述
在这里插入图片描述
可以看到服务又有了

删除服务

删除服务的命令格式如下所示

docker service rm 服务名称

示例:删除集群中所有 Web 应用服务。

[root@manager ~]# docker service rm web

[root@manager ~]# docker service ps web
no such service: web

滚动更新

在创建服务时通过–update-delay 选项可以设置容器的更新间隔时间,每次成功部署一个服务,延迟 10 秒钟,然后再更新下一个服务。如果某个服务更新失败,Swarm 的调度器就会暂停本次服务的部署更新。具体操作如下所示。

首先先创建4个redis服务,现在镜像为redis:3.0.6,然后滚动更新,下图因为我之前部署过一次,worker节点中已经有了镜像,所有过程很快就过去了,如果是没创建的情况下它会一个一个更新的,而且还会有间隔时间。

[root@manager ~]# docker service create --replicas 4 --name redis --update-delay 10s redis:3.0.6
在这里插入图片描述在这里插入图片描述
然后滚动更新镜像(一个一个更新)为redis:3.0.7的
[root@manager ~]# docker service update --image redis:3.0.7 redis
在这里插入图片描述这里可以看出四个副本是一个一个更新的,而不是一起更新

在这里插入图片描述可以看到镜像已经更新成redis:3.0.7了。

添加自定义 Overlay 网络

在 Swarm 集群中使用 Overlay 网络可以连接到一个或多个服务。添加 Overlay 网络需要在管理节点上先创建一个 Overlay 网络,具体操作如下所示。

创建名为 my-network 的 Overlay 网络 my-network
[root@manager ~]# docker network create --driver overlay my-network
x4wgio3tcxi4libnjty23b33u

创建之后,在创建服务时,通过–network 选项指定使用的网络为已存在的 Overlay 网络即可,具体操作如下所示。

[root@manager ~]# docker service create --replicas 2 --network my-network --name myweb nginx
xo2tumc2af6g3n1uqokxthu4f
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged

如果 Swarm 集群中其他节点上的 Docker 容器也使用 my-network 网络,那么处于该Overlay 网络中的所有容器之间都可以进行通信。

数据卷创建与应用

使用 docker volume create 命令可以创建数据卷,具体操作如下所示。

docker volume create [数据卷名称]

创建一个叫product-kgc的数据卷
[root@manager ~]# docker volume create product-kgc
product-kgc

查看数据卷
[root@manager ~]# docker volume ls
DRIVER VOLUME NAME
local product-kgc

应用上述创建的数据卷,具体操作如下所示。

[root@manager ~]# docker service create --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html --replicas 1 --name kgc-web-1 nginx
在这里插入图片描述src:是创建的宿主机的挂载位置
dst:这个指的是副本容器中挂载的位置

在这里插入图片描述
查看数据卷的详细信息
[root@manager ~]# docker volume inspect product-kgc
在这里插入图片描述画红线处是创键的product-kgc挂在卷的位置

但是这个挂载位置是在哪个节点上呢?manager节点不会有,它的状态为Drain

我们去worker1上去查看一下
在这里插入图片描述这里可以看到副本容器中的nginx的网页文件已经同步过来了,而且我也创建了连个文件

我们进入副本容器看一下
从上面的图中可以看到服务部署在了worker1节点上面
在worker1操作

列出所有在运行的容器信息
在这里插入图片描述
[root@worker1 _data]# docker exec -it feec5ee8865e /bin/bash
root@feec5ee8865e:/#

查看到副本容器中是有我在宿主机创建的文件的
root@feec5ee8865e:/# cd /usr/share/nginx/html
root@feec5ee8865e:/usr/share/nginx/html# ls
1.txt 2.txt 50x.html index.html

从上面的验证结果得出,在本地数据卷目录下创建几个文件,进入到容器后,找到对应 的目录,数据依然存在。

数据卷的挂载类型除 volume 之外,还经常使用 bind 类型。具体操作如下所示。
[root@manager ~]# mkdir -p /var/vhost/www/aa
[root@worker1 ~]# mkdir -p /var/vhost/www/aa
[root@worker2 ~]# mkdir -p /var/vhost/www/aa

创建 2 个 kgc-web-2 服务。
[root@manager ~]# docker service create --replicas 2 --mount type=bind,src=/var/vhost/www/aa,dst=/usr/share/nginx/html/ --name kgc-web-2 nginx

下面命令用于验证数据是否同步。

[root@worker1 ~]# touch /var/vhost/www/aa/1
[root@worker1 ~]# docker ps -a

[root@worker1 ~]# docker exec -it d5a28f08fbf9 /bin/bash

root@d5a28f08fbf9:/# ls /usr/share/nginx/html/
1