Docker Swarm集群部署管理
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.9 | 2C4G | manager | 192.168.93.101 | Docker 26.1.4 |
CentOS 7.9 | 2C4G | worker01 | 192.168.93.102 | Docker 26.1.4 |
CentOS 7.9 | 2C4G | worker02 | 192.168.93.103 | Docker 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 - CommunityVersion: 26.1.4Context: defaultDebug Mode: falsePlugins:buildx: Docker Buildx (Docker Inc.)Version: v0.14.1Path: /usr/libexec/docker/cli-plugins/docker-buildxcompose: Docker Compose (Docker Inc.)Version: v2.27.1Path: /usr/libexec/docker/cli-plugins/docker-composeServer:Containers: 0Running: 0Paused: 0Stopped: 0Images: 0Server Version: 26.1.4Storage Driver: overlay2Backing Filesystem: xfsSupports d_type: trueUsing metacopy: falseNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: cgroupfsCgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
################################################################### swarm当前状态为活跃Swarm: active# swarm管理节点IDNodeID: aa0o6ufowgxxn20choza7nsba# 是否为管理节点?是的Is Manager: true# 集群IDClusterID: bmvz1t6x9kcidk1jsnuwdh3q2# 一个管理节点Managers: 1# 三个工作节点(管理节点默认也是可以作为工作节点使用) Nodes: 3
##################################################################Data Path Port: 4789Orchestration:Task History Retention Limit: 5Raft:Snapshot Interval: 10000Number of Old Snapshots to Retain: 0Heartbeat Tick: 1Election Tick: 10Dispatcher:Heartbeat Period: 5 secondsCA Configuration:Expiry Duration: 3 monthsForce Rotate: 0Autolock Managers: falseRoot Rotation In Progress: falseNode Address: 192.168.93.101Manager Addresses:192.168.93.101:2377Runtimes: io.containerd.runc.v2 runcDefault Runtime: runcInit Binary: docker-initcontainerd version: d2d58213f83a351ca8f528a95fbd145f5654e957runc version: v1.1.12-0-g51d5e94init version: de40ad0Security Options:seccompProfile: builtinKernel Version: 3.10.0-1160.71.1.el7.x86_64Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 2Total Memory: 3.682GiBName: managerID: 5443edc1-fd3f-4a36-a647-ea0a5424e886Docker Root Dir: /var/lib/dockerDebug Mode: falseExperimental: falseInsecure Registries:127.0.0.0/8Registry 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:2377To 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 webID: q7muz8icza1akh0dmuxem7tn3
Name: web
Service Mode: ReplicatedReplicas: 2
Placement:
UpdateConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Update order: stop-first
RollbackConfig:Parallelism: 1On failure: pauseMonitoring Period: 5sMax failure ratio: 0Rollback order: stop-first
ContainerSpec:Image: nginx:latest@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31Init: 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
相关文章:

Docker Swarm集群部署管理
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中的…...

碎片化知识如何被系统性地吸收?
一、方法论 碎片化知识指的是通过各种渠道快速获取的零散信息和知识点,这些信息由于其不完整性和孤立性,不易于记忆和应用。为了系统性地吸收碎片化知识,可以采用以下策略: 1. **构建知识框架**: - 在开始吸收之前&am…...

安鸾学院靶场——安全基础
文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包,可以拿到包含flag的txt文件。…...

ChatGPT:自然语言处理的新纪元与OpenAI的深度融合
随着人工智能技术的蓬勃发展,自然语言处理(NLP)领域取得了显著的进步。OpenAI作为这一领域的领军者,以其卓越的技术实力和创新能力,不断推动着NLP领域向前发展。其中ChatGPT作为OpenAI的重要成果更是在全球范围内引起了…...

AI引领项目管理新时代:效率与智能并驾齐驱
在数字化浪潮的推动下,项目管理领域正迎来一场由AI技术引领的革新。从自动化任务执行到智能决策支持,AI技术的应用正让项目管理变得更加高效、精准和智能化。本文将探讨项目管理人员及其实施团队如何运用AI技术,以及这些技术如何助力项目管理…...
AUTOSAR汽车电子嵌入式编程精讲300篇-电池管理系统中 CAN 通信模块的设计与应用(中)
目录 2.3 BMS 中 CAN 通信模块软硬件设计 2.3.1 CAN 通信模块硬件电路设计 2.3.2 CAN 通信模块软件设计 2.3.2.1 CAN 底层程序设计 2.3.2.2 CAN 底层初始化 2.3.2.3 CAN 底层接收 3.3.1.3 CAN 底层发送 2.4 通信协议的实现 2.4.1 整车通信协议的实现 2.4.2 充电机通信协议的实现…...

k8s概述
文章目录 一、什么是Kubernetes1、官网链接2、概述3、特点4、功能 二、Kubernetes架构1、架构图2、核心组件2.1、控制平面组件(Control Plane Components)2.1.1、kube-apiserver2.1.2、etcd2.1.3、kube-scheduler2.1.4、kube-controller-manager 2.2、No…...
多线程的运用
在现代软件开发中,多线程编程是一个非常重要的技能。多线程编程不仅可以提高应用程序的性能,还可以提升用户体验,特别是在需要处理大量数据或执行复杂计算的情况下。本文将详细介绍Java中的多线程编程,包括其基本概念、实现方法、…...
TF-IDF(Term Frequency-Inverse Document Frequency)算法
TF-IDF(Term Frequency-Inverse Document Frequency)是一种用于文本挖掘和信息检索的统计方法,主要用于评估一个单词在一个文档或一组文档中的重要性。它结合了词频(TF)和逆文档频率(IDF)两个指…...
富格林:细心发现虚假确保安全
富格林指出,现货黄金市场内蕴藏着丰富的盈利机会,然而并非所有人都能够抓住这些机会。要想从市场中获取丰厚的利润并且保障交易的安全,必须要求我们掌握一些交易技巧利用此去发现虚假陷阱。当我们不断汲取技巧过后,才可利用此来发…...
6.2 文件的缓存位置
1. 文件的缓冲 1.1 缓冲说明 将文件内容写入到硬件设备时, 则需要进行系统调用, 这类I/O操作的耗时很长, 为了减少I/O操作的次数, 文件通常使用缓冲区. 当需要写入的字节数不足一个块时, 将数据放入缓冲区, 当数据凑够一个块的大小后才进行系统调用(即I/O操作).系统调用: 向…...
在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制
在Elasticsearch中,过滤器(Filter)是用于数据筛选的一种机制,它通常用于结构化数据的精确匹配,如数字范围、日期范围、布尔值、前缀匹配等。过滤器不计算相关性评分,因此比查询(Query࿰…...
MySQL----主键、唯一、普通索引的创建与删除
创建索引 CREATE INDEX index_name ON table_name (column1 [ASC|DESC], column2 [ASC|DESC], ...);CREATE INDEX: 用于创建普通索引的关键字。index_name: 指定要创建的索引的名称。索引名称在表中必须是唯一的。table_name: 指定要在哪个表上创建索引。(column1, column2, ……...
css预处理是什么?作用是什么?
CSS预处理器是一种增强和扩展标准CSS的工具。它们允许开发者使用变量、嵌套规则、Mixin(混合)以及函数等高级功能,以更模块化和可维护的方式编写CSS代码。预处理器如Sass(SCSS)、Less和Stylus等,通过引入这…...

镜像拉取失败:[ERROR] Failed to pull docker image
问题描述 执行 bash docker/scripts/dev_start.sh 命令提示错误: permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post “http://%2Fvar%2Frun%2Fdocker.sock/v1.45/images/create?fromImageregistry.b…...

FM全网自动采集聚合影视搜索源码
源码介绍 FM 全网聚合影视搜索(响应式布局),基于 TP5.1 开发的聚合影视搜索程序,本程序无数据库,本程序内置P2P 版播放器,承诺无广告无捆绑。片源内部滚动广告与本站无关,谨防上当受骗,资源搜索全部来自于网络。 环境…...
【DevOps】什么是 pfSense?免费构建SDWAN
目录 一、详细介绍pfSense 1、 什么是 pfSense? 2、原理 3、 特点 4、 优点 5、 缺点 6、应用场景 7、 典型部署 二、pfSense实战:免费构建企业SD-WAN 1、拓扑图 2、准备工作 3、安装和基本配置pfSense 4、配置VPN 配置IPsec VPN 配置OpenV…...
elementui table超出两行显示...鼠标已入tip显示
elementui el-table超出两行显示…鼠标已入tip显示 方式一 <el-table-column label"描述"prop"note"class-name"myNoteBox"><template slot-scope"scope"><!-- tips悬浮提示 --><el-tooltip placement"to…...
空白服务器安装系统
一、准备工作 确定服务器的硬件配置,包括处理器、内存、硬盘等信息。选择合适的操作系统镜像文件,可以从官方网站或者第三方网站下载。 二、制作启动盘或镜像 如果服务器支持从光盘启动,可以使用光盘制作软件(如UltraISO&#…...

【车载音视频电脑】嵌入式AI分析车载DVR,支持8路1080P
产品特点 采用H.265 & H.264编解码,节约存储空间、传输流量; 高分辨率:支持8路1080P*15FPS/4路1080P*30FPS、720P、D1等编解码; 支持1张SATA硬盘,取用方便,满足大容量存储要求; 支持1个…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案
一、延迟敏感行业面临的DDoS攻击新挑战 2025年,金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征: AI驱动的自适应攻击:攻击流量模拟真实用户行为,差异率低至0.5%,传统规则引…...