Docker Swarm集群部署管理

news2024/11/15 17:31:25

Docker Swarm集群管理

文章目录

  • Docker Swarm集群管理
    • 资源列表
    • 基础环境
    • 一、安装Docker
    • 二、部署Docker Swarm集群
      • 2.1、创建Docker Swarm集群
      • 2.2、添加Worker节点到Swarm集群
      • 2.3、查看Swarm集群中Node节点的详细状态信息
    • 三、Docker Swarm管理
      • 3.1、案例概述
      • 3.2、Docker Swarm中的节点
      • 3.3、服务和任务
    • 四、Docker Swarm节点管理
      • 4.1、节点状态变更管理
      • 4.2、添加标签元数据
      • 4.3、节点提权/降权
      • 4.4、退出Swarm集群
    • 五、Docker Swarm服务管理
      • 5.1、创建服务
      • 5.2、显示服务详细信息
        • 5.2.1、以JSON格式显示
        • 5.2.2、易于阅读显示
      • 5.3、服务的扩容缩容
      • 5.4、删除服务
      • 5.5、滚动更新
      • 5.6、添加自定义Overlay网络
      • 5.7、数据卷创建与应用

资源列表

操作系统配置主机名IP所需软件
CentOS 7.92C4Gmanager192.168.93.101Docker 26.1.4
CentOS 7.92C4Gworker01192.168.93.102Docker 26.1.4
CentOS 7.92C4Gworker02192.168.93.103Docker 26.1.4

基础环境

  • 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
  • 修改主机名
hostnamectl set-hostname manager
hostnamectl set-hostname worker01
hostnamectl set-hostname worker02
  • 绑定映射关系
cat >> /etc/hosts << EOF
192.168.93.101 manager
192.168.93.102 worker01
192.168.93.103 worker02
EOF

一、安装Docker

  • 所有节点主机上安装并配置Docker,以manager主机为例进行演示
[root@manager ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@manager ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@manager ~]# yum clean all && yum makecache
[root@manager ~]# yum -y install docker-ce docker-ce-cli containerd.io


# 启动Docker
[root@manager ~]# systemctl start docker
[root@manager ~]# systemctl enable docker


# 查看Docker版本
[root@manager ~]# docker -v
Docker version 26.1.4, build 5650f9b


# 配置Docker加速器
[root@manager ~]# cd /etc/docker/
[root@manager docker]# cat >> daemon.json << EOF
{  
"registry-mirrors": ["https://8xpk5wnt.mirror.aliyuncs.com"]  
}
EOF
[root@manager docker]# systemctl restart docker

二、部署Docker Swarm集群

  • 安装完Docker后,可以直接使用Docker swarm命令创建Docker Swarm集群(Docker默认支持Swarm模式)

2.1、创建Docker Swarm集群

  • 命令格式:docker swarm init --advertise-addr
  • 其中:–advertise-addr选项用于指定Swarm集群中管理节点(manager node)的IP地址,后续工作节点(worker node)加入集群时,必须能够访问管理节点的IP地址。
# 在manager主机上,执行如下命令即可创建一个Swarm集群
[root@manager ~]# docker swarm init --advertise-addr 192.168.93.101
Swarm initialized: current node (aa0o6ufowgxxn20choza7nsba) is now a manager.

To add a worker to this swarm, run the following command:
# 使用如下命令可以向集群中添加工作节点
    docker swarm join --token SWMTKN-1-52hwnksbwzair59tbw2canzs501wpbu6dcu2med0cve8vyzcxu-3cefz89okcgwr24e82fd33mla 192.168.93.101:2377
# 使用如下命令可以向集群中添加管理节点
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.



# 使用如下命令可以重新获取加入集群工作节点的提示信息
[root@manager ~]# docker swarm join-token worker 
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-52hwnksbwzair59tbw2canzs501wpbu6dcu2med0cve8vyzcxu-3cefz89okcgwr24e82fd33mla 192.168.93.101:2377


# 使用如下命令可以重新获取加入集群管理节点的提示信息
[root@manager ~]# docker swarm join-token manager 
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-52hwnksbwzair59tbw2canzs501wpbu6dcu2med0cve8vyzcxu-e4x6v2n0mkjxq40y23awx5iim 192.168.93.101:2377

2.2、添加Worker节点到Swarm集群

  • 在worker01、worker02两个工作节点上,执行以下命令,将工作节点加入到Swarm集群中
# 注意:每个人加入集群的令牌都是不一样的,根据上面的的加入群集工作节点的令牌为准进行加入集群

[root@worker01 ~]# docker swarm join --token SWMTKN-1-52hwnksbwzair59tbw2canzs501wpbu6dcu2med0cve8vyzcxu-3cefz89okcgwr24e82fd33mla 192.168.93.101:2377
This node joined a swarm as a worker.

[root@worker02 ~]# docker swarm join --token SWMTKN-1-52hwnksbwzair59tbw2canzs501wpbu6dcu2med0cve8vyzcxu-3cefz89okcgwr24e82fd33mla 192.168.93.101:2377
This node joined a swarm as a worker.
  • 命令执行完成后,使用docker info命令在管理节点上查看Swarm集群的信息
[root@manager ~]# docker info
Client: Docker Engine - Community
 Version:    26.1.4
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.14.1
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.27.1
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 0
 Server Version: 26.1.4
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Using metacopy: false
  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 splunk syslog
##################################################################
 # swarm当前状态为活跃
 Swarm: active
 # swarm管理节点ID
  NodeID: aa0o6ufowgxxn20choza7nsba
 # 是否为管理节点?是的
  Is Manager: true
 # 集群ID
  ClusterID: bmvz1t6x9kcidk1jsnuwdh3q2
 # 一个管理节点
  Managers: 1
 # 三个工作节点(管理节点默认也是可以作为工作节点使用) 
  Nodes: 3
##################################################################
  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.93.101
  Manager Addresses:
   192.168.93.101:2377
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: d2d58213f83a351ca8f528a95fbd145f5654e957
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
 Kernel Version: 3.10.0-1160.71.1.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 3.682GiB
 Name: manager
 ID: 5443edc1-fd3f-4a36-a647-ea0a5424e886
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://8xpk5wnt.mirror.aliyuncs.com/
 Live Restore Enabled: false

2.3、查看Swarm集群中Node节点的详细状态信息

  • 使用docker node ls命令可以查看Swarm集群中全部节点的相信状态信息
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
aa0o6ufowgxxn20choza7nsba *   manager    Ready     Active         Leader           26.1.4
t20vr5utpq9s72ukrnzihdj88     worker01   Ready     Active                          26.1.4
tncaekyw2synma931269f3pzn     worker02   Ready     Active                          26.1.4
# 上面信息中,AVAILABILITY表示Swarm Scheduler(调度器)是否可以向集群中的某个节点指派任务,对用有如下三种状态
Active:集群中该节点可以被指派任务
Pause:集群中该节点不可以被指派新的任务,但是其他已经存在的任务保持运行
Drain:集群中该节点不可以被指派新的任务,Swarm Scheduler停止已经存在的任务,并将它们调度到可用的节点上
  • 查看某一个Node状态信息,只可以在管理节点上执行如下命令
# 查看manager节点的详细信息
[root@manager ~]# docker node inspect manager 
[
    {
        "ID": "aa0o6ufowgxxn20choza7nsba",
        "Version": {
            "Index": 9
        },
        "CreatedAt": "2024-06-10T00:24:09.721501544Z",
        "UpdatedAt": "2024-06-10T00:24:10.247087948Z",
        "Spec": {
            "Labels": {},
            "Role": "manager",
            "Availability": "active"
        },
        "Description": {
            "Hostname": "manager",
            "Platform": {
                "Architecture": "x86_64",
                "OS": "linux"
            },
            "Resources": {
                "NanoCPUs": 2000000000,
                "MemoryBytes": 3953922048
            },
            "Engine": {
                "EngineVersion": "26.1.4",
                "Plugins": [
                    {
                        "Type": "Log",
                        "Name": "awslogs"
                    },
                    {
                        "Type": "Log",
                        "Name": "fluentd"
                    },
                    {
                        "Type": "Log",
                        "Name": "gcplogs"
                    },
                    {
                        "Type": "Log",
                        "Name": "gelf"
                    },
                    {
                        "Type": "Log",
                        "Name": "journald"
                    },
                    {
                        "Type": "Log",
                        "Name": "json-file"
                    },
                    {
                        "Type": "Log",
                        "Name": "local"
                    },
                    {
                        "Type": "Log",
                        "Name": "splunk"
                    },
                    {
                        "Type": "Log",
                        "Name": "syslog"
                    },
                    {
                        "Type": "Network",
                        "Name": "bridge"
                    },
                    {
                        "Type": "Network",
                        "Name": "host"
                    },
                    {
                        "Type": "Network",
                        "Name": "ipvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "macvlan"
                    },
                    {
                        "Type": "Network",
                        "Name": "null"
                    },
                    {
                        "Type": "Network",
                        "Name": "overlay"
                    },
                    {
                        "Type": "Volume",
                        "Name": "local"
                    }
                ]
            },
            "TLSInfo": {
                "TrustRoot": "-----BEGIN CERTIFICATE-----\nMIIBazCCARCgAwIBAgIUTybzspUWdYbOAJRfnyDau2d5050wCgYIKoZIzj0EAwIw\nEzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjQwNjEwMDAxOTAwWhcNNDQwNjA1MDAx\nOTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH\nA0IABMkANStcqGO2+B2FOm5mLk1T55oj2zBIZTtoYLCqtRljcjKMHcu8f2QgI3Nu\nrO5WJ+lkCMEd5Mtaqbz5dCOuJ+mjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB\nAf8EBTADAQH/MB0GA1UdDgQWBBTiicu9VqQiX/OQxmwOygMlaQ5tbDAKBggqhkjO\nPQQDAgNJADBGAiEA4G2vH7RU3qL9aFkVjn5qVvXRPKGo5EQEPsNTObYjDN0CIQD8\ncH9CxBcO+gOk1N2K/iSJsPHnN2n9qWRIm1HXd1fGOA==\n-----END CERTIFICATE-----\n",
                "CertIssuerSubject": "MBMxETAPBgNVBAMTCHN3YXJtLWNh",
                "CertIssuerPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEyQA1K1yoY7b4HYU6bmYuTVPnmiPbMEhlO2hgsKq1GWNyMowdy7x/ZCAjc26s7lYn6WQIwR3ky1qpvPl0I64n6Q=="
            }
        },
        "Status": {
            "State": "ready",
            "Addr": "192.168.93.101"
        },
        "ManagerStatus": {
            "Leader": true,
            "Reachability": "reachable",
            "Addr": "192.168.93.101:2377"
        }
    }
]
# 查看worker01节点的详细信息
[root@manager ~]# docker node inspect worker01
# 查看worker02节点的详细信息
[root@manager ~]# docker node inspect worker02

三、Docker Swarm管理

3.1、案例概述

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

3.2、Docker Swarm中的节点

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

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

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

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

3.3、服务和任务

任务(task)是Swarm集群中最小的调度单位,对应一个单一的容器

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

  • 副本服务:按照一定规则在各个工作节点上运行指定个数的任务
  • 全局服务:每个工作节点上运行一个任务

服务的工作模式可以在执行docker service create命令创建服务时,通过-mode参数指定

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

四、Docker Swarm节点管理

4.1、节点状态变更管理

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

  • 设置管理节点只具有管理功能
  • 对服务进行停机维护,可以修改AVAILABILITY为Drain状态
  • 暂停一个节点,使该节点就不再接收新的Task(任务)
  • 恢复一个不可用或暂停的节点
# 例如,将管理节点的AVAILABILITY值修改为Drain状态(不接收任务),使其只具备管理功能
[root@manager ~]# docker node update --availability drain manager 
manager
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
############################################################################################################
aa0o6ufowgxxn20choza7nsba *   manager    Ready     Drain          Leader           26.1.4
############################################################################################################
t20vr5utpq9s72ukrnzihdj88     worker01   Ready     Active                          26.1.4
tncaekyw2synma931269f3pzn     worker02   Ready     Active                          26.1.4
# 如此,管理节点就不能被指派新任务,也就是不能部署实际的Docker容器来运行服务,而只是担任管理者的角色

4.2、添加标签元数据

  • 在生产环境中,可能每个节点的主机配置情况不同,比如:有的适合运行CPU密集型应用、有的适合运行IO密集型应用。Swarm支持给每个节点添加标签元数据,根据节点的标签,选择性地调度某个服务部署到期望的一组节点上

添加标签的命令格式如下所示

  • docker node update --label-add 值 键
# 示例1:worker01主机在名称为GM-IDC-01的数据中心,为worker01节点添加标签为“CM-IDC-01”
[root@manager ~]# docker node update --label-add GM-IDC-01 worker01
worker01

# 查看worker01主机的标签是否添加成功
[root@manager ~]# docker node inspect worker01
[
    {
        "ID": "t20vr5utpq9s72ukrnzihdj88",
        "Version": {
            "Index": 22
        },
        "CreatedAt": "2024-06-10T00:31:04.564510894Z",
        "UpdatedAt": "2024-06-10T01:08:23.261990244Z",
        "Spec": {
            "Labels": {
                "GM-IDC-01": ""
            },
## 部分内容省略

4.3、节点提权/降权

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

  • 工作节点变为管理节点:提权操作
  • 管理节点变为工作节点:降权操作
# 示例2:将worker01和worker02都升级为管理节点,具体操作如下所示。
[root@manager ~]# docker node promote worker01 worker02
Node worker01 promoted to a manager in the swarm.
Node worker02 promoted to a manager in the swarm.

# 可以看到两个工作节点的MANAGER STATUS配置段增加了Reachable
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
aa0o6ufowgxxn20choza7nsba *   manager    Ready     Drain          Leader           26.1.4
t20vr5utpq9s72ukrnzihdj88     worker01   Ready     Active         Reachable        26.1.4
tncaekyw2synma931269f3pzn     worker02   Ready     Active         Reachable        26.1.4


# 示例3:对上面已经提前的worker01和worker02执行降权操作,需要执行如下命令
[root@manager ~]# docker node demote worker01 worker02
Manager worker01 demoted in the swarm.
Manager worker02 demoted in the swarm.

# 可以看到执行了降权之后,两个工作节点的MANAGER STATUS值为空
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
aa0o6ufowgxxn20choza7nsba *   manager    Ready     Drain          Leader           26.1.4
t20vr5utpq9s72ukrnzihdj88     worker01   Ready     Active                          26.1.4
tncaekyw2synma931269f3pzn     worker02   Ready     Active                          26.1.4

4.4、退出Swarm集群

  • 如果管理节点想要退出Swarm集群,在管理节点上执行docker swarm leave命令,具体操作如下
[root@manager ~]# docker swarm leave
# 忽略如下报错信息,因为集群中存在别的节点所以管理节点不能先退出
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Removing the last manager erases all current state of the swarm. Use `--force` to ignore this message.


# 使用如下命令可以强制退出集群,则需要加上一个强制选项
[root@manager ~]# docker swarm leave --force
Node left the swarm.

  • 同理,如果工作节点想要退出Swarm集群,在工作上执行docker swarm leave命令
[root@worker01 ~]# docker swarm leave
Node left the swarm.
# 即使管理节点已经退出Swarm集群,执行上述命令也可以使得工作节点退出集群。之后,根据需要,加入到其他新键的Swarm集群中。需要注意的是,管理节点退出集群后无法重新加入之前退出的集群;工作节点退出集群通过docker swarm join命令指定对应的token值重新加入集群

五、Docker Swarm服务管理

5.1、创建服务

  • 使用docker service create命令可以创建Docker服务
# 示例4:从Docker镜像nginx创建一个名为Web的服务,指定服务副本数为。具体操作如下
# 重新创建集群
[root@manager ~]# docker swarm init --advertise-addr 192.168.93.101
Swarm initialized: current node (h4wy4loy8d63ufojudngef1fu) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-37t9a5b5y21u5aah9o3l5hwrt8aujgso18iavcnw3egewfekao-b66serglaiqs6tzhm9whi10xf 192.168.93.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


# 更改管理节点的状态,不接受任务
[root@manager ~]# docker node update --availability drain manager 
manager


# 将两个工作节点退出旧集群
[root@worker01 ~]# docker swarm leave
Node left the swarm.
[root@worker02 ~]# docker swarm leave
Node left the swarm.


# 将两个工作节点加入新集群
[root@worker01 ~]# docker swarm join --token SWMTKN-1-37t9a5b5y21u5aah9o3l5hwrt8aujgso18iavcnw3egewfekao-b66serglaiqs6tzhm9whi10xf 192.168.93.101:2377
This node joined a swarm as a worker.
[root@worker02 ~]# docker swarm join --token SWMTKN-1-37t9a5b5y21u5aah9o3l5hwr
This node joined a swarm as a worker.


# 查看集群状态信息
[root@manager ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
h4wy4loy8d63ufojudngef1fu *   manager    Ready     Active         Leader           26.1.4
tfgwzuhvc9og2hhq57r4m85bi     worker01   Ready     Active                          26.1.4
buu4v3t6ljcyjgci68d28l65w     worker02   Ready     Active                          26.1.4


# 创建服务
[root@manager ~]# docker service create --replicas 2 --name web nginx
45jowgy1comocs5oez1u0352l
overall progress: 2 out of 2 tasks 
1/2: running   
2/2: running   
verify: Service 45jowgy1comocs5oez1u0352l converged 


# 执行如下命令可以查看当前已经部署启动的全局应用服务
[root@manager ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
45jowgy1como   web       replicated   2/2        nginx:latest   


# 执行如下命令可以查询指定服务的详细信息
[root@manager ~]# docker service ps web
ID             NAME      IMAGE          NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
1hx3e8z6ehj6   web.1     nginx:latest   worker02   Running         Running 27 seconds ago             
uhsw5wew3sae   web.2     nginx:latest   worker01   Running         Running 47 seconds ago   

# 上面信息显示,在worker01和worker02节点上部署了Web应用服务,也包含了它们对应的当前状态信息,此时,可以通过执行docker ps命令,在工作节点上查看当前启动的Docker容器
[root@worker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS     NAMES
032941efc659   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web.2.uhsw5wew3sae254swcuv3kecy
[root@worker02 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS     NAMES
67494c75dc9c   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    web.1.1hx3e8z6ehj61ldcnm48tluk8

5.2、显示服务详细信息

  • 常见服务详细信息有以JSON格式显示、易于阅读显示两种显示方式
5.2.1、以JSON格式显示
  • 可以通过下面的命令,以JSON格式显示方法Web服务的详细信息
[root@manager ~]# docker service inspect web
[
    {
        "ID": "q7muz8icza1akh0dmuxem7tn3",
        "Version": {
            "Index": 22
        },
        "CreatedAt": "2024-06-10T02:03:11.039981869Z",
        "UpdatedAt": "2024-06-10T02:03:11.039981869Z",
        "Spec": {
            "Name": "web",
            "Labels": {},
            "TaskTemplate": {
                "ContainerSpec": {
                    "Image": "nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31",
                    "Init": false,
                    "StopGracePeriod": 10000000000,
                    "DNSConfig": {},
                    "Isolation": "default"
                },
                "Resources": {
                    "Limits": {},
                    "Reservations": {}
                },
                "RestartPolicy": {
                    "Condition": "any",
                    "Delay": 5000000000,
                    "MaxAttempts": 0
                },
                "Placement": {
                    "Platforms": [
                        {
                            "Architecture": "amd64",
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "OS": "linux"
                        },
                        {
                            "Architecture": "arm64",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "386",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "mips64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "ppc64le",
                            "OS": "linux"
                        },
                        {
                            "Architecture": "s390x",
                            "OS": "linux"
                        }
                    ]
                },
                "ForceUpdate": 0,
                "Runtime": "container"
            },
            "Mode": {
                "Replicated": {
                    "Replicas": 2
                }
            },
            "UpdateConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "RollbackConfig": {
                "Parallelism": 1,
                "FailureAction": "pause",
                "Monitor": 5000000000,
                "MaxFailureRatio": 0,
                "Order": "stop-first"
            },
            "EndpointSpec": {
                "Mode": "vip"
            }
        },
        "Endpoint": {
            "Spec": {}
        }
    }
]
5.2.2、易于阅读显示
  • 可以通过执行下面的命令,以易于阅读方式显示Web服务的详细信息
[root@manager ~]# docker service inspect --pretty web

ID:		q7muz8icza1akh0dmuxem7tn3
Name:		web
Service Mode:	Replicated
 Replicas:	2
Placement:
UpdateConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:	1
 On failure:	pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:		nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
 Init:		false
Resources:
Endpoint Mode:	vip

5.3、服务的扩容缩容

  • 当使用服务并涉及到高可用时,可能会有服务的扩容和缩容操作。服务扩容缩容的命令格式如下所示,通过Task总数确定服务是扩容还是缩容

  • docker service scale 服务=Task总数

# 示例5:将前面已经部署的2个副本的Web服务,扩容到3个副本
[root@manager ~]# docker service scale web=3
web scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service web converged 


# 通过docker service ps web命令查看服务扩容结果
[root@manager ~]# docker service ps web
ID             NAME      IMAGE          NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
1hx3e8z6ehj6   web.1     nginx:latest   worker02   Running         Running 8 minutes ago              
uhsw5wew3sae   web.2     nginx:latest   worker01   Running         Running 8 minutes ago              
15jt1khj5ggc   web.3     nginx:latest   worker01   Running         Running 41 seconds ago   


# 根据上述命令结果得知,worker01节点上有两个Web应用服务的副本。进行服务缩容操作时只需要设置副本的数小于当前应用服务拥有的副本数即可,大于指定缩容副本数的副本会被删除
[root@manager ~]# docker service scale web=1
web scaled to 1
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service web converged 
[root@manager ~]# docker service ps web
ID             NAME      IMAGE          NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
1hx3e8z6ehj6   web.1     nginx:latest   worker02   Running         Running 10 minutes ago 

5.4、删除服务

  • 命令格式:docker service rm 服务名称
# 示例6:删除集群中所有Wen应用服务
[root@manager ~]# docker service rm web
web
[root@manager ~]# docker service ps web
no such service: web

5.5、滚动更新

  • 在创建服务时通过–update-delay选项可以设置容器的更新间隔时间,每次成功部署一个服务,延迟10秒钟,然后再更新下一个服务。如果某个服务更新失败,Swarm的调度器就会暂停本次服务的部署更新
[root@manager ~]# docker service create --replicas 3 --name redis --update-delay 10s redis:4.0.4
zsdc8ket1754piiz479tf622a
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service zsdc8ket1754piiz479tf622a converged
[root@manager ~]# docker service ps redis
ID             NAME      IMAGE         NODE       DESIRED STATE   CURRENT STATE            ERROR     PORTS
gfvq0se0amfw   redis.1   redis:4.0.4   worker02   Running         Running 25 seconds ago             
onyfq787ajql   redis.2   redis:4.0.4   worker01   Running         Running 23 seconds ago             
57klpkbthm60   redis.3   redis:4.0.4   worker02   Running         Running 25 seconds ago  

# 更新已经部署服务所在容器中使用的镜像版本。示例6:将redis服务对用image版本由4.0.4更新为4.0.5,但是服务更新之前的4.0.4镜像版本的容器不会删除,只会停止
[root@manager ~]# docker service update --image redis:4.0.5 redis 
redis
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service redis converged 
[root@manager ~]# docker service ps redis
ID             NAME          IMAGE         NODE       DESIRED STATE   CURRENT STATE                 ERROR     PORTS
nt53g2a5dnbe   redis.1       redis:4.0.5   worker02   Running         Running 38 seconds ago                  
gfvq0se0amfw    \_ redis.1   redis:4.0.4   worker02   Shutdown        Shutdown about a minute ago             
zcipt652sett   redis.2       redis:4.0.5   worker01   Running         Running 27 seconds ago                  
onyfq787ajql    \_ redis.2   redis:4.0.4   worker01   Shutdown        Shutdown 27 seconds ago                 
j0jkmibnnn3t   redis.3       redis:4.0.5   worker01   Running         Running about a minute ago              
57klpkbthm60    \_ redis.3   redis:4.0.4   worker02   Shutdown        Shutdown about a minute ago    

5.6、添加自定义Overlay网络

  • 可以让服务之间的容器通过容器名称进行通信
  • 在Swarm集群中使用Overlay网络可以连接到一个或多个服务。添加Overlay网络需要在管理节点上先创建一个Overlay网络
[root@manager ~]# docker network create --driver overlay my-network
6mmvljs63afzic7o9ojivctpw

# 创建名为my-network的Overlay网络之后,在创建服务时,通过--network选项使用的网络已经存在的Overlay网络即可
[root@manager ~]# docker service create --replicas 3 --network my-network --name web nginx
166p2g47svuf48eho8ijqj9la
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service 166p2g47svuf48eho8ijqj9la converged 

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

5.7、数据卷创建与应用

  • 命令格式:docker volume create 卷名
# 创建数据卷
[root@manager ~]# docker volume create product-kgc
product-kgc

# 查看数据卷
[root@manager ~]# docker volume ls
DRIVER    VOLUME NAME
local     product-kgc挂载到服务容器中的/usr/share/nginx/html

# 应用上述创建的数据卷(将本机product-kgc挂载到服务容器中的/usr/share/nginx/html)
[root@manager ~]# docker service create --mount type=volume,src=product-kgc,dst=/usr/share/nginx/html --replicas 1 --name kgc-web-01 nginx
4zobmebf2wuzoonvtt4a53z5r
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service 4zobmebf2wuzoonvtt4a53z5r converged 

# 查看你数据卷的详细信息
[root@manager ~]# docker volume inspect product-kgc 
[
    {
        "CreatedAt": "2024-06-10T10:32:36+08:00",
        "Driver": "local",
        "Labels": null,
        # 此卷真正存放数据的地方
        "Mountpoint": "/var/lib/docker/volumes/product-kgc/_data",
        "Name": "product-kgc",
        "Options": null,
        "Scope": "local"
    }
]

# 查看数据是否进行同步的命令如下
# 在工作节点上执行以下命令
[root@worker01 ~]# cd /var/lib/docker/volumes/product-kgc/_data/
[root@worker01 _data]# mkdir test01 test02
# 列出所有在运行的容器信息
[root@worker01 _data]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS          PORTS      NAMES
##################################################################
e844eee8ef04   nginx:latest   "/docker-entrypoint.…"   4 minutes ago    Up 4 minutes    80/tcp     kgc-web-01.1.3bclleosvtp9vk4qv2cgl873x
##################################################################
932f42fdab17   nginx:latest   "/docker-entrypoint.…"   9 minutes ago    Up 9 minutes    80/tcp     web.2.wrfkjb6cevf22g4ds963ich91
47d7ce4ecb54   redis:4.0.5    "docker-entrypoint.s…"   13 minutes ago   Up 13 minutes   6379/tcp   redis.2.zcipt652settbxk9r9gto5mz9
c7fed90dceda   redis:4.0.5    "docker-entrypoint.s…"   14 minutes ago   Up 14 minutes   6379/tcp   redis.3.j0jkmibnnn3txrvupa4htej29

# 进入docker容器
[root@worker01 _data]# docker exec -it kgc-web-01.1.3bclleosvtp9vk4qv2cgl873x bash
root@e844eee8ef04:/# ls /usr/share/nginx/html/
50x.html  index.html  test01  test02


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


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

# 创建2个kgc-web-02服务
[root@manager ~]# docker service create --replicas 2 --mount type=bind,src=/var/vhost/www/aa,dst=/usr/share/nginx/html --name kgc-web-02 nginx
utulrkf6xxy9fpkpf16f33e36
overall progress: 2 out of 2 tasks 
1/2: running   
2/2: running   
verify: Service utulrkf6xxy9fpkpf16f33e36 converged 

# 下面命令用于验证数据是否同步
# 在共组节点上执行如下命令
[root@worker01 ~]# touch /var/vhost/www/aa/1
# 列出所有容器信息
[root@worker01 ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                   CREATED              STATUS              PORTS      NAMES
##################################################################
13baa8bb60de   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp     kgc-web-02.2.neo42xgzu6dzet1g6w1qnwbqm
##################################################################
e844eee8ef04   nginx:latest   "/docker-entrypoint.…"   11 minutes ago       Up 11 minutes       80/tcp     kgc-web-01.1.3bclleosvtp9vk4qv2cgl873x
932f42fdab17   nginx:latest   "/docker-entrypoint.…"   16 minutes ago       Up 16 minutes       80/tcp     web.2.wrfkjb6cevf22g4ds963ich91
47d7ce4ecb54   redis:4.0.5    "docker-entrypoint.s…"   21 minutes ago       Up 21 minutes       6379/tcp   redis.2.zcipt652settbxk9r9gto5mz9
c7fed90dceda   redis:4.0.5    "docker-entrypoint.s…"   22 minutes ago       Up 22 minutes       6379/tcp   redis.3.j0jkmibnnn3txrvupa4htej29
[root@worker01 ~]# docker exec -it kgc-web-02.2.neo42xgzu6dzet1g6w1qnwbqm bash
root@13baa8bb60de:/# ls /usr/share/nginx/html/
1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

拓扑排序-java

主要通过宽度优先搜索&#xff08;BFS&#xff09;来实现有向无环图的拓扑序列&#xff0c;邻接表存储图。数组模拟单链表、队列&#xff0c;实现BFS基本操作。 文章目录 前言 一、有向图的拓扑序列 二、算法思路 1.拓扑序列 2.算法思路 三、使用步骤 1.代码如下&#xff08;示…

【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【西瓜书】大题

1.线性回归 思路&#xff1a;ywxb&#xff0c;w为一维数组&#xff0c;求均方误差MSE&#xff0c;对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路&#xff1a;先计算每个算法测试结果的混淆矩阵&#xff0c;再根据混淆矩阵…

Matlab|混合策略改进的蝴蝶优化算法

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 程序主要对蝴蝶算法&#xff08;BOA&#xff09;进行改进&#xff0c;参考文献《基于改进蝴蝶优化算法的冗余机器人逆运动学求解》&#xff0c;有如下改进策略&#xff1a; 改进1&#xff1a;采用反向学习策…

RK3568平台(显示篇)FrameBuffer 应用编程

一.FrameBuffer介绍 FrameBuffer&#xff08;帧缓冲器&#xff09;是一种计算机图形学概念&#xff0c;用于在显示器上显示图形和文本。在 计算机显示系统中&#xff0c;FrameBuffer 可以看作是显存的一个抽象概念&#xff0c;用于存储显示屏幕上显示 的像素点的颜色和位置信息…

ElementUi el-tree动态加载节点数据 load方法触发机制

需求背景&#xff1a;需要根据点击后获取的数据动态渲染一个 el-tree&#xff0c;同时渲染出来的 el-tree&#xff0c;需要点击节点时才能获取该节点的层数的获取&#xff0c;如图所示&#xff0c;我需要点击“组”节点才能渲染“设备列表”树&#xff0c;同时“设备列表”树的…

Vue16-绑定class样式

一、vue绑定class样式 1-1、需求一&#xff1a;字符串写法 vue实现class样式绑定 1-2、需求二 点击div&#xff0c;随机切换样式。 math.random()&#xff1a;随机数的范围[0, 1) 1-3、需求三&#xff1a;数组写法 样式的追加 1-4、需求四 &#xff1a;对象写法 二、vue绑定…

浅解Reids持久化

Reids持久化 RDB redis的存储方式&#xff1a; rdb文件都是二进制&#xff0c;很小&#xff0c;里面存的是数据 实现方式 redis-cli链接到redis服务端 使用save命令 注&#xff1a;不推荐 因为save命令是直接写到磁盘里面&#xff0c;速度特别慢&#xff0c;一般都是redis…

MySQl基础----Linux下搭建mysql软件及登录和基本使用(附实操图超简单一看就会)

绪论​ 涓滴之水可磨损大石&#xff0c;不是由于他力量强大&#xff0c;而是由于昼夜不舍地滴坠。 只有勤奋不懈地努力&#xff0c;才能够获得那些技巧。 ——贝多芬。新开MySQL篇章&#xff0c;本章非常基础包括如何在Linux上搭建&#xff08;当然上面的SQL语句你在其他能执行…

UnityXR Interaction Toolkit 如何使用XRHand手部识别

前言 Unity的XR Interaction Toolkit是一个强大的框架,允许开发者快速构建沉浸式的VR和AR体验。随着虚拟现实技术的发展,手部追踪成为了提升用户交互体验的关键技术之一。 本文将介绍如何在Unity中使用XR Interaction Toolkit实现手部识别功能。 准备工作 在开始之前,请…

Chat-TTS:windows本地部署实践【有手就行】

最近Chat-TTS模型很火&#xff0c;生成的语音以假乱真&#xff0c;几乎听不出AI的味道。我自己在本地部署玩了一下&#xff0c;记录一下其中遇到的问题。 环境&#xff1a; 系统&#xff1a;windows 11 GPU&#xff1a; Nvidia 4060 Cuda&#xff1a;12.1&#xff08;建议安…

后方碰撞预警系统技术规范(简化版)

后方碰撞预警系统技术规范(简化版) 1 系统概述2 预警区域3 预警目标4 功能需求功能条件5 显示需求6 指标需求1 系统概述 后方碰撞预警系统RCW(Rear Collision Warning)是在后方车辆即将与自车发生碰撞之前,激活危险警告灯以较高频率闪烁,从而吸引后方驾驶员的注意力,避免…

PG 数据库常用参数调整

1.shard_buffers Postgresql使用自己的缓冲区,也使用操作系统缓冲区。这意味着数据存储在内存中两次,首先是 Postgresql缓冲区,然后是操作系统缓冲区。 与其他数据库不同, Postgresql不提供直接IO。这称为双缓冲&#xff08;就是磁盘中的时候读的时候先放在数据库的缓冲区&am…

【Python教程】3-控制流、循环结构与简单字符串操作

在整理自己的笔记的时候发现了当年学习python时候整理的笔记&#xff0c;稍微整理一下&#xff0c;分享出来&#xff0c;方便记录和查看吧。个人觉得如果想简单了解一名语言或者技术&#xff0c;最简单的方式就是通过菜鸟教程去学习一下。今后会从python开始重新更新&#xff0…

Vue17-条件渲染

一、使用v-show属性做条件渲染 控制元素的显示和隐藏 v-show里面也能是表达式&#xff0c;只要表达式的值是boolean就行。 或者 当时结构还在&#xff1a; 二、使用v-if属性做条件渲染 结构也不在了 三、示例 方式一&#xff1a; 方式二&#xff1a; 当元素有很高的切换频率&am…

【web本地存储】storage事件,StorageEvent对象介绍

storage事件 Web Storage API 内建了一套事件通知机制&#xff0c;当存储区域的内容发生改变&#xff08;包括增加、修改、删除数据&#xff09;时&#xff0c;就会自动触发storage事件&#xff0c;并把它发送给所有感兴趣的监听者&#xff0c;因此&#xff0c;如果需要跟踪存…

第十二届蓝桥杯单片机国赛练习代码

文章目录 前言一、问题重述二、主函数总结 前言 第十五蓝桥杯国赛落幕已有十天&#xff0c;是时候总结一下&#xff0c;这个专栏也将结束。虽然并没有取得预期的结果&#xff0c;但故事结尾并不总是美满的。下面是赛前练习的第十二届国赛的代码。 一、问题重述 二、主函数 完整…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

MATLAB实现磷虾算法(Krill herd algorithm)

1.算法介绍 磷虾算法&#xff08;Krill Herd Algorithm, KH&#xff09;是一种基于生物启发的优化算法&#xff0c;其原理模拟了南极磷虾&#xff08;Euphausia superba&#xff09;群体的聚集行为。该算法旨在通过模拟磷虾个体间的相互作用、觅食行为和随机扩散&#xff0c;来…

设计模式 —— 观察者模式

设计模式 —— 观察者模式 什么是观察者模式观察者模式定义观察者模式的角色观察者模式的使用场景观察者模式的实现 被观察者&#xff08;Subject&#xff09;观察者&#xff08;Observer&#xff09;通知&#xff08;notify&#xff09;更新显示&#xff08;update&#xff09…