当前位置: 首页 > news >正文

Docker Swarm实战

文章目录

  • 1、docker swarm介绍
  • 2、docker swarm概念与架构
    • 2.1 架构
    • 2.2 概念
  • 3、docker swarm集群部署
    • 3.1 容器镜像仓库 Harbor准备
    • 3.2 主机准备
      • 3.2.1 主机名
      • 3.2.2 IP地址
      • 3.2.3 主机名与IP地址解析
      • 3.3.4 主机时间同步
      • 3.2.5 主机安全设置
    • 3.3 docker安装
      • 3.3.1 docker安装
      • 3.3.2 配置docker daemon使用harbor
    • 3.4 docker swarm集群初始化
      • 3.4.1 获取docker swarm命令帮助
      • 3.4.2 在管理节点初始化
      • 3.4.3 添加工作节点到集群
      • 3.4.4 添加管理节点到集群
      • 3.4.5 模拟管理节点出现故障
        • 3.4.5.1 停止docker服务并查看结果
        • 3.4.5.2 启动docker服务并查看结果
  • 4、docker swarm集群应用
    • 4.1 容器镜像准备
      • 4.1.1 v1版本
      • 4.1.2 v2版本
    • 4.2 发布服务
      • 4.2.1 使用`docker service ls`查看服务
      • 4.2.2 发布服务
      • 4.2.3 查看已发布服务
      • 4.2.4 查看已发布服务容器
      • 4.2.5 访问已发布的服务
    • 4.3 服务扩展
    • 4.4 服务裁减
    • 4.5 负载均衡
    • 4.6 删除服务
    • 4.7 服务版本更新
    • 4.8 服务版本回退
    • 4.9 服务版本滚动间隔更新
    • 4.10 副本控制器
    • 4.11 在指定网络中发布服务
    • 4.12 服务网络模式
    • 4.13 服务数据持久化存储
      • 4.13.1 本地存储
        • 4.13.1.1 在集群所有主机上创建本地目录
        • 4.13.1.2 发布服务时挂载本地目录到容器中
        • 4.13.1.3 验证是否使用本地目录
      • 4.13.2 网络存储
        • 4.13.2.1 部署NFS存储
        • 4.13.2.2 为集群所有主机安装nfs-utils软件
        • 4.13.2.3 创建存储卷
        • 4.13.2.4 发布服务
        • 4.13.2.5 验证
    • 4.14 服务互联与服务发现
    • 4.15 docker swarm网络
  • 5、docker stack
    • 5.1 docker stack介绍
    • 5.2 docker stack与docker compose区别
    • 5.3 docker stack常用命令
    • 5.4 部署wordpress案例
    • 5.5 部署nginx与web管理服务案例
    • 5.6 nginx+haproxy+nfs案例


1、docker swarm介绍

Docker Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源。

Swarm和Kubernetes比较类似,但是更加轻,具有的功能也较kubernetes更少一些。

  • 是docker host集群管理工具
  • docker官方提供的
  • docker 1.12版本以后
  • 用来统一集群管理的,把整个集群资源做统一调度
  • 比kubernetes要轻量化
  • 实现scaling 规模扩大或缩小
  • 实现rolling update 滚动更新或版本回退
  • 实现service discovery 服务发现
  • 实现load balance 负载均衡
  • 实现route mesh 路由网格,服务治理

2、docker swarm概念与架构

参考网址:https://docs.docker.com/swarm/overview/

2.1 架构

在这里插入图片描述

在这里插入图片描述

2.2 概念

节点 (node): 就是一台docker host上面运行了docker engine.节点分为两类:

  • 管理节点(manager node) 负责管理集群中的节点并向工作节点分配任务
  • 工作节点(worker node) 接收管理节点分配的任务,运行任务

可以使用如下命令查看节点

docker node ls

服务(services): 在工作节点运行的,由多个任务共同组成

docker service ls

任务(task): 运行在工作节点上容器或容器中包含应用,是集群中调度最小管理单元

在这里插入图片描述


3、docker swarm集群部署

部署3主2从节点集群,另需提前准备1台本地容器镜像仓库服务器(Harbor)

3.1 容器镜像仓库 Harbor准备

在这里插入图片描述

3.2 主机准备

3.2.1 主机名

设置主机名

hostnamectl set-hostname xxx

说明:

sm1 管理节点1
sm2 管理节点2
sm3 管理节点3
sw1 工作节点1
sw2 工作节点2

3.2.2 IP地址

编辑网卡配置文件

vim /etc/sysconfig/network-scripts/ifcfg-ens33

内容如下

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"DEVICE="ens33"
ONBOOT="yes"IPADDR="192.168.150.xxx"
PREFIX="24"
GATEWAY="192.168.150.2"
DNS1="192.168.150.2"

说明:

sm1 管理节点1 192.168.150.108
sm2 管理节点2 192.168.150.111
sm3 管理节点3 192.168.150.112
sw1 工作节点1 192.168.150.110
sw2 工作节点2 192.168.150.109

3.2.3 主机名与IP地址解析

编辑主机/etc/hosts文件,添加主机名解析

vim /etc/hosts

添加如下内容

192.168.150.108 sm1
192.168.150.111 sm2
192.168.150.112 sm3
192.168.150.110 sw1
192.168.150.109 sw2

3.3.4 主机时间同步

添加计划任务,实现时间同步,同步服务器为time1.aliyun.com

crontab -e

查看添加后计划任务

[root@localhost ~]# crontab -l
0 */1 * * * ntpdate time1.aliyun.com

3.2.5 主机安全设置

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

使用非交互式修改selinux配置文件

sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

重启所有的主机系统

reboot

重启后验证selinux是否关闭

sestatus

3.3 docker安装

3.3.1 docker安装

下载YUM源

wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker-ce

yum -y install docker-ce

启动docker服务并设置为开机自启动

systemctl enable docker
systemctl start docker

3.3.2 配置docker daemon使用harbor

编辑daemon.json文件,配置docker daemon使用harbor

vim /etc/docker/daemon.json

添加harbor域名解析

echo "192.168.150.145 hub.harbor.com" >> /etc/hosts

将私有仓库标记为不安全

{"insecure-registries": ["hub.harbor.com"]
}

重启docker服务

systemctl restart docker

深度登录harbor

[root@localhost ~]# docker login hub.harbor.com
Username: admin
Password: 123456
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

3.4 docker swarm集群初始化

3.4.1 获取docker swarm命令帮助

获取docker swarm命令使用帮助

[root@localhost ~]# docker swarm --helpUsage:  docker swarm COMMANDManage SwarmCommands:ca          Display and rotate the root CAinit        Initialize a swarm                    初始化join        Join a swarm as a node and/or manager 加入集群join-token  Manage join tokens                    集群加入时token管理leave       Leave the swarm                       离开集群unlock      Unlock swarmunlock-key  Manage the unlock keyupdate      Update the swarm                      更新集群

这个只能在20.10.12之前的版本看到这么多输出,现在只有initjoin存在。

3.4.2 在管理节点初始化

查看更多帮助--help

[root@sm1 ~]# docker swarm init --helpUsage:  docker swarm init [OPTIONS]Initialize a swarmOptions:--advertise-addr string                  Advertised address (format: "<ip|interface>[:port]")--autolock                               Enable manager autolocking (requiring an unlock key to start a stopped manager)--availability string                    Availability of the node ("active", "pause", "drain") (default "active")--cert-expiry duration                   Validity period for node certificates (ns|us|ms|s|m|h) (default 2160h0m0s)--data-path-addr string                  Address or interface to use for data path traffic (format: "<ip|interface>")--data-path-port uint32                  Port number to use for data path traffic (1024 - 49151). If no value is set or is set to 0, the default port (4789) is used.--default-addr-pool ipNetSlice           default address pool in CIDR format (default [])--default-addr-pool-mask-length uint32   default address pool subnet mask length (default 24)--dispatcher-heartbeat duration          Dispatcher heartbeat period (ns|us|ms|s|m|h) (default 5s)--external-ca external-ca                Specifications of one or more certificate signing endpoints--force-new-cluster                      Force create a new cluster from current state--listen-addr node-addr                  Listen address (format: "<ip|interface>[:port]") (default 0.0.0.0:2377)--max-snapshots uint                     Number of additional Raft snapshots to retain--snapshot-interval uint                 Number of log entries between Raft snapshots (default 10000)--task-history-limit int                 Task history retention limit (default 5)

本次在sm1上初始化,初始化集群

[root@sm1 ~]# docker swarm init --advertise-addr 192.168.150.108 --listen-addr 192.168.150.108:2377
Swarm initialized: current node (3vny5618cymqu3se2u6hrm8dv) is now a manager.To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-0vpzhptq7kh7qk1p6jvgxoew6 192.168.150.108:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

说明:

  • --advertise-addr:当主机有多块网卡时使用其选择其中一块用于广播,用于其它节点连接管理节点使用
  • --listen-addr:监听地址,用于承载集群流量使用

3.4.3 添加工作节点到集群

使用初始化过程中生成的token加入集群

[root@sw1 ~]# docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-0vpzhptq7kh7qk1p6jvgxoew6 192.168.150.108:2377
This node joined a swarm as a worker.

查看已加入的集群

[root@sm1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
3vny5618cymqu3se2u6hrm8dv *   sm1        Ready     Active         Leader           26.1.4
yr60hl09ykkm9pgeclsxogsti     sw1        Ready     Active                          26.1.4

如果使用的token已过期,可以再次生成新的token加入集群,重新生成用于添加工作点的token命令如下:

[root@sm1 ~]# docker swarm join-token worker
To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-0vpzhptq7kh7qk1p6jvgxoew6 192.168.150.108:2377

当然如果token没有过期是不会发生改变的,加入集群:

[root@sw2 ~]# docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-0vpzhptq7kh7qk1p6jvgxoew6 192.168.150.108:2377
This node joined a swarm as a worker.

查看node状态

[root@sm1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
3vny5618cymqu3se2u6hrm8dv *   sm1        Ready     Active         Leader           26.1.4
yr60hl09ykkm9pgeclsxogsti     sw1        Ready     Active                          26.1.4
4ezg4jqp7glqnk3fq8qyeyq3k     sw2        Ready     Active                          26.1.4

3.4.4 添加管理节点到集群

生成用于添加管理节点加入集群所使用的token

[root@sm1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-a1x8y2gsn1sidq18k6c99uqys 192.168.150.108:2377

将管理节点2加入集群

[root@sm2 ~]# docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-a1x8y2gsn1sidq18k6c99uqys 192.168.150.108:2377
This node joined a swarm as a manager.

将管理节点3加入集群

[root@sm3 ~]# docker swarm join --token SWMTKN-1-5jo6zl6w5jxfldy621p5b6j2y6wlisiyx3hh7regommro7llaw-a1x8y2gsn1sidq18k6c99uqys 192.168.150.108:2377
This node joined a swarm as a manager.

查看节点状态

[root@sm1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
3vny5618cymqu3se2u6hrm8dv *   sm1        Ready     Active         Leader           26.1.4
tryv3pguoblxpobx6ahhz1z9y     sm2        Ready     Active         Reachable        26.1.4
sgdtlqzl3sskqyjx7alqqsb28     sm3        Ready     Active         Reachable        26.1.4
yr60hl09ykkm9pgeclsxogsti     sw1        Ready     Active                          26.1.4
4ezg4jqp7glqnk3fq8qyeyq3k     sw2        Ready     Active                          26.1.4

3.4.5 模拟管理节点出现故障

3.4.5.1 停止docker服务并查看结果

停止管理节点sm1的docker服务

systemctl stop docker

查看node状态,发现sm1不可达,状态为未知,并重启选择出leader

[root@sm3 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
3vny5618cymqu3se2u6hrm8dv     sm1        Unknown   Active         Unreachable      26.1.4
tryv3pguoblxpobx6ahhz1z9y     sm2        Ready     Active         Reachable        26.1.4
sgdtlqzl3sskqyjx7alqqsb28 *   sm3        Ready     Active         Leader           26.1.4
yr60hl09ykkm9pgeclsxogsti     sw1        Ready     Active                          26.1.4
4ezg4jqp7glqnk3fq8qyeyq3k     sw2        Ready     Active                          26.1.4
3.4.5.2 启动docker服务并查看结果

再次启动sm1的docker服务

systemctl start docker

观察可以得知sm1是可达状态,但并不是Leader

[root@sm1 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
3vny5618cymqu3se2u6hrm8dv *   sm1        Ready     Active         Reachable        26.1.4
tryv3pguoblxpobx6ahhz1z9y     sm2        Ready     Active         Reachable        26.1.4
sgdtlqzl3sskqyjx7alqqsb28     sm3        Ready     Active         Leader           26.1.4
yr60hl09ykkm9pgeclsxogsti     sw1        Ready     Active                          26.1.4
4ezg4jqp7glqnk3fq8qyeyq3k     sw2        Ready     Active                          26.1.4

4、docker swarm集群应用

4.1 容器镜像准备

准备多个版本的容器镜像,以便于后期使用测试,在harbor服务器中操作。

4.1.1 v1版本

创建新的工作目录:

mkdir nginxing
cd nginxing

生成网站文件v1版

vim index.html # 添加内容 v1

编写Dockerfile文件,用于构建容器镜像,vim Dockerfile

FROM nginx:latest
MAINTAINER  'tom<tom@docker.com>'
ADD index.html /usr/share/nginx/html
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
EXPOSE 80
CMD /usr/sbin/nginx

使用docker build构建容器镜像v1

docker build -t hub.harbor.com/library/nginx:v1 .

登录harbor

[root@harbor nginxing]# docker hub.harbor.com
Username: admin
Password: 12345

推送容器镜像v1至harbor

docker push hub.harbor.com/library/nginx:v1

4.1.2 v2版本

生成v2版本时,和v1流程一样,只不过将index.html文件中的内容变为v2,打tag标记和推送时使用nginx:v2

在这里插入图片描述

4.2 发布服务

docker swarm中,对外暴露的是服务(service),而不是容器。

为了保持高可用架构,它准许同时启动多个容器共同支撑一个服务,如果一个容器挂了,它会自动使用另一个容器

4.2.1 使用docker service ls查看服务

在管理节点(manager node)上操作

[root@sm1 ~]# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

4.2.2 发布服务

docker service create发布服务,其他相关命令使用docker service --help查看

[root@sm1 ~]# docker service create --name nginx-svc-1 --replicas 1 --publish 80:80  hub.harbor.com/library/nginx:v1
jiibbvhsugclfbq5vz4sfpg7o
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service jiibbvhsugclfbq5vz4sfpg7o converged 

说明

  • 创建一个服务,名为nginx_svc-1
  • --replicas 1指定1个副本
  • --publish 80:80 将服务内部的80端口发布到外部网络的80端口
  • 使用的镜像为hub.harbor.com/library/nginx:v1

4.2.3 查看已发布服务

查看服务

[root@sm1 ~]# docker service ls
ID             NAME          MODE         REPLICAS   IMAGE                             PORTS
jiibbvhsugcl   nginx-svc-1   replicated   1/1        hub.harbor.com/library/nginx:v1   *:80->80/tcp

4.2.4 查看已发布服务容器

发现运行在了管理节点sm2上,看来worker和manger的关系并不是很严格

[root@sm2 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED          STATUS          PORTS     NAMES
6250612e77ee   hub.harbor.com/library/nginx:v1   "/docker-entrypoint.…"   20 minutes ago   Up 20 minutes   80/tcp    nginx-svc-1.1.nr46gcgughgyy4g9ov6dsxhu0

4.2.5 访问已发布的服务

所有节点都能访问到

[root@sm1 ~]# curl http://192.168.150.108
v1
[root@sm1 ~]# curl http://192.168.150.109
v1
[root@sm1 ~]# curl http://192.168.150.110
v1
[root@sm1 ~]# curl http://192.168.150.111
v1
[root@sm1 ~]# curl http://192.168.150.112
v1

在集群之外的主机访问

在这里插入图片描述

4.3 服务扩展

使用scale指定副本数来扩展

[root@sm1 ~]# docker service scale nginx-svc-1=2
nginx-svc-1 scaled to 2
overall progress: 2 out of 2 tasks 
1/2: running   [==================================================>] 
2/2: running   [==================================================>] 
verify: Service nginx-svc-1 converged

副本数变为两个

[root@sm1 ~]# docker service ls
ID             NAME          MODE         REPLICAS   IMAGE                             PORTS
jiibbvhsugcl   nginx-svc-1   replicated   2/2        hub.harbor.com/library/nginx:v1   *:80->80/tcp

查看具体都运行在哪个节点上

[root@sm1 ~]# docker service ps nginx-svc-1
ID             NAME            IMAGE                             NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
nr46gcgughgy   nginx-svc-1.1   hub.harbor.com/library/nginx:v1   sm2       Running         Running 48 minutes ago                 
m1hflyisjrca   nginx-svc-1.2   hub.harbor.com/library/nginx:v1   sm1       Running         Running about a minute ago 

验证服务1

[root@sm2 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED             STATUS             PORTS     NAMES
6250612e77ee   hub.harbor.com/library/nginx:v1   "/docker-entrypoint.…"   About an hour ago   Up About an hour   80/tcp    nginx-svc-1.1.nr46gcgughgyy4g9ov6dsxhu0

验证服务2

[root@sm1 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED          STATUS          PORTS     NAMES
911658a9d519   hub.harbor.com/library/nginx:v1   "/docker-entrypoint.…"   17 minutes ago   Up 17 minutes   80/tcp    nginx-svc-1.2.m1hflyisjrcatk0ua53xexgfe

问题:现在仅扩展为2个副本,如果把服务扩展到3个副本,集群会如何分配主机呢?

[root@sm1 ~]# docker service scale nginx-svc-1=3
nginx-svc-1 scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service nginx-svc-1 converged 
[root@sm1 ~]# docker service ps nginx-svc-1
ID             NAME            IMAGE                             NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
nr46gcgughgy   nginx-svc-1.1   hub.harbor.com/library/nginx:v1   sm2       Running         Running about an hour ago             
m1hflyisjrca   nginx-svc-1.2   hub.harbor.com/library/nginx:v1   sm1       Running         Running 27 minutes ago                
j758n23lzir2   nginx-svc-1.3   hub.harbor.com/library/nginx:v1   sw2       Running         Running 21 seconds ago   

说明:

正常来说当把服务扩展到一定数量时,管理节点也会参与到负载运行中来,也就是说先消耗工作节点。

我们目前是5个节点,如果超过了这个阈值呢?

[root@sm1 ~]# docker service ps nginx-svc-1
ID             NAME            IMAGE                             NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
nr46gcgughgy   nginx-svc-1.1   hub.harbor.com/library/nginx:v1   sm2       Running         Running about an hour ago              
m1hflyisjrca   nginx-svc-1.2   hub.harbor.com/library/nginx:v1   sm1       Running         Running 28 minutes ago                 
j758n23lzir2   nginx-svc-1.3   hub.harbor.com/library/nginx:v1   sw2       Running         Running about a minute ago             
kzfmw02wfcrf   nginx-svc-1.4   hub.harbor.com/library/nginx:v1   sw1       Running         Running 17 seconds ago                 
mi9x8x5c7xud   nginx-svc-1.5   hub.harbor.com/library/nginx:v1   sm3       Running         Running 18 seconds ago                 
y0pb194wsg9e   nginx-svc-1.6   hub.harbor.com/library/nginx:v1   sw1       Running         Running 17 seconds ago 

发现sw1节点工作了两个服务,其他节点都是1个

4.4 服务裁减

将服务缩容,还是使用scale指定副本数量

[root@sm1 ~]# docker service scale nginx-svc-1=2
nginx-svc-1 scaled to 2
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

由6个变为两个

[root@sm1 ~]# docker service ls
ID             NAME          MODE         REPLICAS   IMAGE                             PORTS
jiibbvhsugcl   nginx-svc-1   replicated   2/2        hub.harbor.com/library/nginx:v1   *:80->80/tcp

还是我们最开始的那两个服务

[root@sm1 ~]# docker service ps nginx-svc-1
ID             NAME            IMAGE                             NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
nr46gcgughgy   nginx-svc-1.1   hub.harbor.com/library/nginx:v1   sm2       Running         Running 2 hours ago                
m1hflyisjrca   nginx-svc-1.2   hub.harbor.com/library/nginx:v1   sm1       Running         Running 55 minutes ago

4.5 负载均衡

修改sm1主机中容器网页文件

[root@sm1 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED             STATUS             PORTS     NAMES
911658a9d519   hub.harbor.com/library/nginx:v1   "/docker-entrypoint.…"   About an hour ago   Up About an hour   80/tcp    nginx-svc-1.2.m1hflyisjrcatk0ua53xexgfe
[root@sm1 ~]# docker exec -it 91165 bash
root@911658a9d519:/# echo "sm1 web" > /usr/share/nginx/html/index.html
root@911658a9d519:/# exit

修改sm2主机中容器网页文件

[root@sm2 ~]# docker ps
CONTAINER ID   IMAGE                             COMMAND                   CREATED       STATUS       PORTS     NAMES
6250612e77ee   hub.harbor.com/library/nginx:v1   "/docker-entrypoint.…"   2 hours ago   Up 2 hours   80/tcp    nginx-svc-1.1.nr46gcgughgyy4g9ov6dsxhu0
[root@sm2 ~]# docker exec -it 62506 bash
root@6250612e77ee:/# echo "sm2 web" > /usr/share/nginx/html/index.html
root@6250612e77ee:/# exit

访问测试

[root@sm1 ~]# curl http://192.168.150.108
sm1 web
[root@sm1 ~]# curl http://192.168.150.108
sm2 web
[root@sm1 ~]# curl http://192.168.150.108
sm1 web
[root@sm1 ~]# curl http://192.168.150.108
sm2 web

服务中包含多个容器时,每次访问将以轮询的方式访问到每个容器

4.6 删除服务

已经发布了两个服务

[root@sm1 ~]# docker service ls
ID             NAME          MODE         REPLICAS   IMAGE                             PORTS
jiibbvhsugcl   nginx-svc-1   replicated   2/2        hub.harbor.com/library/nginx:v1   *:80->80/tcp

replicated是副本模式,不要尝试删掉主机中的容器,固定两个副本是删不掉的,要直接删除服务

[root@sm1 ~]# docker service rm nginx-svc-1
nginx-svc-1

成功删除

[root@sm1 ~]# docker service ls
ID        NAME      MODE      REPLICAS   IMAGE     PORTS

4.7 服务版本更新

新建服务

[root@sm1 ~]# docker service create --name nginx-svc --replicas=1 --publish 80:80 hub.harbor.com/library/nginx:v1
ydys1r5j0weauabx7g1hb99af
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service ydys1r5j0weauabx7g1hb99af converged

查看响应的版本

[root@sm1 ~]# curl http://192.168.150.108
v1

服务版本升级

[root@sm1 ~]# docker service update nginx-svc --image hub.harbor.com/library/nginx:v2
nginx-svc
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service nginx-svc converged 

访问测试

[root@sm1 ~]# curl http://192.168.150.108
v2

4.8 服务版本回退

将版本回退到v1

[root@sm1 ~]# docker service update nginx-svc --image hub.harbor.com/library/nginx:v1
nginx-svc
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service nginx-svc converged

4.9 服务版本滚动间隔更新

滚动更新其实也就是渐进性更新,先来60个服务副本

[root@sm1 ~]# docker service create --name nginx-svc --replicas 60 --publish 80:80 hub.harbor.com/library/nginx:v1
j490xzxdjt945lnweexhbn5vs
overall progress: 60 out of 60 tasks 
verify: Service j490xzxdjt945lnweexhbn5vs converged 

测试渐进更新,同时更新时也能对外提供服务,看看得到的结果是v1还是v2还是都有呢

[root@sm1 ~]# docker service update --replicas 60 --image hub.harbor.com/library/nginx:v2 --update-parallelism 5 --update-delay 30s nginx-svc
nginx-svc
overall progress: 30 out of 60 tasks

说明

  • --update-parallelism 5指定并行更新数量
  • --update-delay 30s指定更新间隔时间

docker swarm 滚动更新会造成节点上有exit状态的容器,可以考虑清除,命令如下:

[root@sw1 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

4.10 副本控制器

副本控制器,用来为用户维护所期望的服务状态

[root@sm1 ~]# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE                             PORTS
dybls8f9dwvx   nginx-svc   replicated   3/3        hub.harbor.com/library/nginx:v1   *:80->80/tcp

查看运行在哪一台主机上

[root@sm1 ~]# docker service ps nginx-svc
ID             NAME          IMAGE                             NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
tv5uvizjiats   nginx-svc.1   hub.harbor.com/library/nginx:v1   sm1       Running         Running about a minute ago             
wny58obj1aj7   nginx-svc.2   hub.harbor.com/library/nginx:v1   sw2       Running         Running about a minute ago             
m800frly1g61   nginx-svc.3   hub.harbor.com/library/nginx:v1   sm3       Running         Running about a minute ago

将sw2上的容器删除

docker stop wny58obj1aj7
docker rm wny58obj1aj7

查看副本数还是三个,并且sw2上出现了一个新的的任务代替掉了原来的任务

[root@sm1 ~]# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE                             PORTS
dybls8f9dwvx   nginx-svc   replicated   3/3        hub.harbor.com/library/nginx:v1   *:80->80/tcp
[root@sm1 ~]# docker service ps nginx-svc
ID             NAME              IMAGE                             NODE      DESIRED STATE   CURRENT STATE           ERROR                         PORTS
tv5uvizjiats   nginx-svc.1       hub.harbor.com/library/nginx:v1   sm1       Running         Running 5 minutes ago                                 
xni3t7djiywu   nginx-svc.2       hub.harbor.com/library/nginx:v1   sw2       Running         Running 2 minutes ago                                 
wny58obj1aj7    \_ nginx-svc.2   hub.harbor.com/library/nginx:v1   sw2       Shutdown        Failed 2 minutes ago    "task: non-zero exit (137)"   
m800frly1g61   nginx-svc.3       hub.harbor.com/library/nginx:v1   sm3       Running         Running 5 minutes ago  

4.11 在指定网络中发布服务

让服务稳定的运行在某一网络,即使不是同一台主机也能稳定通信,创建一个overlay网络,没有具体指定系统会自动分配。

docker network create -d overlay tomcat-net

查看所拥有的网络

[root@sm1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
51efd7178934   bridge            bridge    local
653ac927bfd9   docker_gwbridge   bridge    local
ae7acb0f9f83   host              host      local
prs03lea4z3t   ingress           overlay   swarm
11a5a5beef46   none              null      local
9pbn3r4qsy3f   tomcat-net        overlay   swarm

查看我们所创建的网络对应的信息

[root@sm1 ~]# docker network inspect tomcat-net
[{"Name": "tomcat-net","Id": "9pbn3r4qsy3fgo6d5tburh0h9","Created": "2024-12-10T01:20:58.415167806Z","Scope": "swarm","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "10.0.1.0/24","Gateway": "10.0.1.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": null,"Options": {"com.docker.network.driver.overlay.vxlanid_list": "4097"},"Labels": null}
]

说明:

创建名为tomcat-net的覆盖网络(Overlay Netowork),这是个二层网络,处于该网络下的docker容器,即使宿主机不一样,也能相互访问

创建名为tomcat的服务,使用刚才创建的覆盖网络

docker service create --name tomcat \
--network tomcat-net \
-p 8080:8080 \
--replicas 2 \
tomcat:7.0.96-jdk8-openjdk

查看服务运行的状态

[root@sm1 ~]# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE                             PORTS
7fqceyg1ypjh   tomcat      replicated   2/2        tomcat:7.0.96-jdk8-openjdk        *:8080->8080/tcp
[root@sm1 ~]# docker service ps tomcat
ID             NAME       IMAGE                        NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
zeyff5juwuk8   tomcat.1   tomcat:7.0.96-jdk8-openjdk   sw1       Running         Running 38 seconds ago             
qf2jmtx1buid   tomcat.2   tomcat:7.0.96-jdk8-openjdk   sm2       Running         Running 52 seconds ago 

在这里插入图片描述

4.12 服务网络模式

服务模式一共有两种:Ingress和Host,如果不指定,则默认的是Ingress;

  • Ingress模式下,到达Swarm任何节点的8080端口的流量,都会映射到任何服务副本的内部8080端口,就算该节点上没有tomcat服务副本也会映射;
  • Host模式下,仅在运行有容器副本的机器上开放端口,

创建ingress模式服务

docker service create --name tomcat \
--network tomcat-net \
-p 8080:8080 \
--replicas 2 \
tomcat:7.0.96-jdk8-openjdk

查看运行在哪台主机上

[root@sm2 ~]# docker service ps tomcat
ID             NAME       IMAGE                        NODE      DESIRED STATE   CURRENT STATE               ERROR     PORTS
zeyff5juwuk8   tomcat.1   tomcat:7.0.96-jdk8-openjdk   sw1       Running         Running about an hour ago             
qf2jmtx1buid   tomcat.2   tomcat:7.0.96-jdk8-openjdk   sm2       Running         Running about an hour ago  

在运行的sm2主机上查看IP地址

[root@sm2 ~]# docker ps
CONTAINER ID   IMAGE                        COMMAND             CREATED             STATUS             PORTS      NAMES
01bd65de39d0   tomcat:7.0.96-jdk8-openjdk   "catalina.sh run"   About an hour ago   Up About an hour   8080/tcp   tomcat.2.qf2jmtx1buidzvqhdptjl34fq
[root@sm2 ~]# docker inspect 01bd65de39d0 | grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "10.0.0.138",ingress IP地址"IPAddress": "10.0.1.4",	容器IP地址

sw1:

[root@sw1 ~]# docker ps
CONTAINER ID   IMAGE                        COMMAND             CREATED             STATUS             PORTS      NAMES
af487bcd3fff   tomcat:7.0.96-jdk8-openjdk   "catalina.sh run"   About an hour ago   Up About an hour   8080/tcp   tomcat.1.zeyff5juwuk8dh8vc1uxz9okt
[root@sw1 ~]# docker inspect af487bcd3fff | grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "10.0.0.137","IPAddress": "10.0.1.3",

发现所有主机都在监听8080端口的消息

[root@sm1 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("dockerd",pid=2727,fd=54))
[root@sm2 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("dockerd",pid=1229,fd=26))
[root@sm3 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("dockerd",pid=1226,fd=22))
[root@sw1 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("dockerd",pid=1229,fd=39))
[root@sw2 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("dockerd",pid=1229,fd=22))

创建host模式服务,使用Host模式的命令如下:

docker service create --name tomcat \
--network tomcat-net \
--publish published=8080,target=8080,mode=host \
--replicas 3 \
tomcat:7.0.96-jdk8-openjdk

查看运行的节点

[root@sm1 ~]# docker service ps tomcat
ID             NAME       IMAGE                        NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
6x80to0wjmze   tomcat.1   tomcat:7.0.96-jdk8-openjdk   sw1       Running         Running 37 seconds ago             *:8080->8080/tcp,*:8080->8080/tcp
ztedsoasva0b   tomcat.2   tomcat:7.0.96-jdk8-openjdk   sm2       Running         Running 37 seconds ago             *:8080->8080/tcp,*:8080->8080/tcp
wfzner3uepbo   tomcat.3   tomcat:7.0.96-jdk8-openjdk   sm1       Running         Running 8 seconds ago              *:8080->8080/tcp,*:8080->8080/tcp

查看端口映射情况

[root@sm1 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128       *:8080                  *:*                   users:(("docker-proxy",pid=71202,fd=4))
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("docker-proxy",pid=71206,fd=4))
[root@sm2 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128       *:8080                  *:*                   users:(("docker-proxy",pid=69094,fd=4))
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("docker-proxy",pid=69102,fd=4))
[root@sm3 ~]# ss -anput | grep ":8080"
# 没有被映射端口
[root@sw1 ~]# ss -anput | grep ":8080"
tcp    LISTEN     0      128       *:8080                  *:*                   users:(("docker-proxy",pid=68251,fd=4))
tcp    LISTEN     0      128    [::]:8080               [::]:*                   users:(("docker-proxy",pid=68260,fd=4))
[root@sw2 ~]# ss -anput | grep ":8080"
# 没有被映射端口

4.13 服务数据持久化存储

4.13.1 本地存储

4.13.1.1 在集群所有主机上创建本地目录

在有主机上创建本地存储目录,

mkdir -p /data/nginxdata
4.13.1.2 发布服务时挂载本地目录到容器中
[root@sm1 ~]# docker service create --name nginx-svc --replicas 3 --mount "type=bind,source=/data/nginxdata,target=/usr/share/nginx/html" --publish 80:80  hub.harbor.com/library/nginx:v1
urk439pgs6as4u5jlkg7ct929
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service urk439pgs6as4u5jlkg7ct929 converged
4.13.1.3 验证是否使用本地目录

查看服务运行在哪个节点上

[root@sm1 ~]# docker service ps nginx-svc
ID             NAME          IMAGE                             NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
ezmb0p5nimi1   nginx-svc.1   hub.harbor.com/library/nginx:v1   sw2       Running         Running about a minute ago             
cmhqfi3sl9t1   nginx-svc.2   hub.harbor.com/library/nginx:v1   sm1       Running         Running about a minute ago             
bkhj7ffeu2d8   nginx-svc.3   hub.harbor.com/library/nginx:v1   sw1       Running         Running about a minute ago 

在sw1上执行

ls /data/nginxdata/
echo "sw1 web" > /data/nginxdata/index.html

在sw2上执行

ls /data/nginxdata/
echo "sw2 web" > /data/nginxdata/index.html

在sm1上执行

ls /data/nginxdata
echo "sm1 web" > /data/nginxdata/index.html

访问测试

[root@sm1 ~]# curl http://192.168.150.108
sw1 web
[root@sm1 ~]# curl http://192.168.150.108
sw2 web
[root@sm1 ~]# curl http://192.168.150.108
sm1 web

发现存在数据一致性问题

4.13.2 网络存储

网络存储卷可以实现跨docker宿主机的数据共享,数据持久保存到网络存储卷中

在创建service时添加卷的挂载参数,网络存储卷可以帮助自动挂载(但需要集群节点都创建该网络存储卷)

4.13.2.1 部署NFS存储

本案例以NFS提供远程存储为例

192.168.150.145服务器上部署NFS服务,共享目录为docker swarm集群主机使用。

mkdir /opt/dockervolume

安装nfs网络存储

yum -y install nfs-utils

配置共享目录

echo "/opt/dockervolume      *(rw,sync,no_root_squash)" >> /etc/exports

启动nfs,并设置开机自启

systemctl enable nfs-server
systemctl start nfs-server

查询本地 NFS 服务器的共享目录

[root@harbor ~]# showmount -e
Export list for harbor:
/opt/dockervolume *
4.13.2.2 为集群所有主机安装nfs-utils软件

安装

yum -y install nfs-utils

测试

[root@sm1 ~]# showmount -e 192.168.150.145
Export list for 192.168.150.145:
/opt/dockervolume *
4.13.2.3 创建存储卷

集群中所有节点执行,使用nfs存储卷

docker volume create  --driver local --opt type=nfs --opt o=addr=192.168.150.145,rw --opt device=:/opt/dockervolume nginx_volume

在任意一节点查看存储卷

[root@sm1 ~]# docker volume ls
DRIVER    VOLUME NAME
local     nginx_volume

查看详细信息

[root@sm1 ~]# docker volume inspect nginx_volume
[{"CreatedAt": "2024-12-10T21:48:46+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data","Name": "nginx_volume","Options": {"device": ":/opt/dockervolume","o": "addr=192.168.150.145,rw","type": "nfs"},"Scope": "local"}
]
4.13.2.4 发布服务

重新发布服务使用存储卷

[root@sm1 ~]# docker service create  --name nginx-svc --replicas 3 --publish 80:80 --mount "type=volume,source=nginx_volume,target=/usr/share/nginx/html"  hub.harbor.com/library/nginx:v1
sdl5c9icw8spyq3ifms7glb7f
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service sdl5c9icw8spyq3ifms7glb7f converged 
4.13.2.5 验证

查看挂载服务的节点

[root@sm1 ~]# docker service ls
ID             NAME        MODE         REPLICAS   IMAGE                             PORTS
sdl5c9icw8sp   nginx-svc   replicated   3/3        hub.harbor.com/library/nginx:v1   *:80->80/tcp
[root@sm1 ~]# docker service ps nginx-svc
ID             NAME          IMAGE                             NODE      DESIRED STATE   CURRENT STATE                ERROR     PORTS
aqji1emxlhhp   nginx-svc.1   hub.harbor.com/library/nginx:v1   sw1       Running         Running about a minute ago             
0n8f5e4lur1r   nginx-svc.2   hub.harbor.com/library/nginx:v1   sw2       Running         Running about a minute ago             
qmcpkxbbhbzb   nginx-svc.3   hub.harbor.com/library/nginx:v1   sm1       Running         Running about a minute ago

查看挂载信息,发现sm1、sw1、sw2已经使用了nfs存储

[root@sm1 ~]# df -Th | grep nfs
:/opt/dockervolume      nfs        37G   14G   24G   36% /var/lib/docker/volumes/nginx_volume/_data
[root@sm2 ~]# df -Th | grep nfs
# 无输出
[root@sm3 ~]# df -Th | grep nfs
# 无输出
[root@sw1 ~]# df -Th | grep nfs
:/opt/dockervolume      nfs        37G   14G   24G   36% /var/lib/docker/volumes/nginx_volume/_data
[root@sw2 ~]# df -Th | grep nfs
:/opt/dockervolume      nfs        37G   14G   24G   36% /var/lib/docker/volumes/nginx_volume/_data

在nfs主机上生成nginx首页文件

echo "nfs test" > /opt/dockervolume/index.html

测试

[root@sm1 ~]# curl http://192.168.150.108
nfs test
[root@sm1 ~]# curl http://192.168.150.108
nfs test
[root@sm1 ~]# curl http://192.168.150.108
nfs test
[root@sm1 ~]# curl http://192.168.150.108
nfs test

4.14 服务互联与服务发现

如果一个nginx服务与一个mysql服务之间需要连接,在docker swarm如何实现呢?

方法1:

把mysql服务也使用 --publish参数发布到外网,但这样做的缺点是:mysql这种服务发布到外网不安全

方法2:

将mysql服务等运行在内部网络,只需要nginx服务能够连接mysql就可以了,在docker swarm中可以使用overlay网络来实现。

但现在还有个问题,服务副本数发生变化时,容器内部的IP发生变化时,我们希望仍然能够访问到这个服务,这就是服务发现(service discovery).

通过服务发现,service的使用者都不需要知道service运行在哪里,IP是多少,有多少个副本,就能让service通信

下面使用docker network ls查看到的ingress网络就是一个overlay类型的网络,但它不支持服务发现

[root@sm1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
51efd7178934   bridge            bridge    local
653ac927bfd9   docker_gwbridge   bridge    local
ae7acb0f9f83   host              host      local
prs03lea4z3t   ingress           overlay   swarm 此处
11a5a5beef46   none              null      local
9pbn3r4qsy3f   tomcat-net        overlay   swarm

我们需要自建一个overlay网络来实现服务发现,需要相互通信的service也必须属于同一个overlay网络

docker network create --driver overlay --subnet 192.168.100.0/24 self-network

说明:

  • --driver overlay:指定为overlay类型
  • --subnet:分配网段
  • self-network: 为自定义的网络名称
[root@sm1 ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
51efd7178934   bridge            bridge    local
653ac927bfd9   docker_gwbridge   bridge    local
ae7acb0f9f83   host              host      local
prs03lea4z3t   ingress           overlay   swarm
11a5a5beef46   none              null      local
rkgawik6dyms   self-network      overlay   swarm 此处
9pbn3r4qsy3f   tomcat-net        overlay   swarm

验证自动发现

1、发布nignx-svc服务,指定在自建的overlay网络

[root@sm1 ~]# docker service create --name nginx-svc --replicas 3 --network self-network --publish 80:80  hub.harbor.com/library/nginx:v1
qi8cft81l6kthwtxf58ef9oyw
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service qi8cft81l6kthwtxf58ef9oyw converged

2、发布一个busybox服务,也指定在自建的overlay网络

[root@sm1 ~]# docker service create --name test --network self-network  busybox sleep 100000
ucynn8aziz3ee0gqgo4gyuq1j
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service ucynn8aziz3ee0gqgo4gyuq1j converged

说明:

  • 服务名为test
  • busybox是一个集成了linux常用命令的软件,这里使用它可以比较方便的测试与nginx_service的连通性
  • 没有指定副本,默认1个副本
  • 因为它并不是长时间运行的daemon守护进程,所以运行一下就会退出。
  • sleep 100000是指定一个长的运行时间,让它有足够的时间给我们测试

3、查出test服务在哪个节点运行的容器

[root@sm1 ~]# docker service ps test
ID             NAME      IMAGE            NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
wfcwg32u4ae3   test.1    busybox:latest   sm3       Running         Running 2 minutes ago 

4、去运行test服务的容器节点查找容器的名称

[root@sm3 ~]# docker ps
CONTAINER ID   IMAGE            COMMAND          CREATED         STATUS         PORTS     NAMES
d3bbf1e846d0   busybox:latest   "sleep 100000"   2 minutes ago   Up 2 minutes             test.1.wfcwg32u4ae32ua175phxfyn4

5, 使用查找出来的容器名称,执行命令测试

[root@sm3 ~]# docker exec -it test.1.wfcwg32u4ae32ua175phxfyn4 ping -c 2 nginx-svc
PING nginx-svc (192.168.100.2): 56 data bytes
64 bytes from 192.168.100.2: seq=0 ttl=64 time=0.090 ms
64 bytes from 192.168.100.2: seq=1 ttl=64 time=0.128 ms--- nginx-svc ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.090/0.109/0.128 ms

测试的结果为: test服务可以ping通nginx_service服务,并且返回的IP为自建网络的一个IP(192.168.100.2)

[root@sm1 ~]# docker service inspect nginx-svc
[......."VirtualIPs": [{"NetworkID": "prs03lea4z3tfkcagy6hkpbhv","Addr": "10.0.0.72/24"},{"NetworkID": "rkgawik6dymse7dc6jn1e9l6f","Addr": "192.168.100.2/24"}]}}
]

6、分别去各个节点查找nginx_service服务的各个容器(3个副本),发现它们的IP与上面ping的IP都不同

[root@sm1 ~]# docker inspect nginx-svc.1.y5us4d4ia9ri4c9gfnjlb74ny | grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "10.0.0.73","IPAddress": "192.168.100.3",
[root@sw1 ~]# docker inspect nginx-svc.2.ip2a7k68cgjs1zn9ua1nic7wj | grep -i ipaddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "10.0.0.74","IPAddress": "192.168.100.4",
[root@sm2 ~]# docker inspect nginx-svc.3.qxleseps0phhr0hkdf7qqi05y | grep IPAddress"SecondaryIPAddresses": null,"IPAddress": "","IPAddress": "10.0.0.75","IPAddress": "192.168.100.5",

7、后续测试,将nginx_service服务扩展、裁减、更新、回退,都不影响test服务访问nginx-svc。

结论: 在自建的overlay网络内,通过服务发现可以实现服务之间通过服务名(不用知道对方的IP)互联,而且不会受服务内副本个数和容器内IP变化等的影响。

4.15 docker swarm网络

在 Swarm Service 中有三个重要的网络概念:

  • Overlay networks 管理 Swarm 中 Docker 守护进程间的通信。你可以将服务附加到一个或多个已存在的 overlay 网络上,使得服务与服务之间能够通信。
  • ingress network 是一个特殊的 overlay 网络,用于服务节点间的负载均衡。当任何 Swarm 节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有IP地址,选择其中的一个,并通过 ingress 网络将请求路由到它。
    初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置,但是 docker 17.05 和更高版本允许你自定义。
  • docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。
    docker_gwbridge 网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。
名称类型注释
docker_gwbridgebridgenone
ingressoverlaynone
custom-networkoverlaynone
  • docker_gwbridge和ingress是swarm自动创建的,当用户执行了docker swarm init/connect之后。
  • docker_gwbridge是bridge类型的负责本机container和主机直接的连接
  • ingress负责service在多个主机container之间的路由。
  • custom-network是用户自己创建的overlay网络,通常我们都需要创建自己的network并把service挂在上面。

在这里插入图片描述


5、docker stack

5.1 docker stack介绍

早期使用service发布,每次只能发布一个service。

yaml可以发布多个服务,但是使用docker-compose只能在一台主机发布。

一个stack就是一组有关联的服务的组合,可以一起编排,一起发布,一起管理。

5.2 docker stack与docker compose区别

Docker stack 会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的,所以docker-compose更适合于开发场景;

Docker Compose是一个Python项目,在内部,它使用Docker API规范来操作容器,所以需要安装Docker-compose,以便与Docker一起在您的计算机上使用;

Docker Stack 功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。

Docker stack 不支持基于第2版写的docker-compose.yml,也就是version版本至少为3。然而Docker Compose对版本为2和3的文件仍然可以处理;

docker stack把docker compose的所有工作都做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用docker stack既不困难,也不需要太多的开销。如果您是Docker新手,或正在选择用于新项目的技术,请使用docker stack。

5.3 docker stack常用命令

命令描述
docker stack --help查看更多命令帮助
docker stack deploy部署新的堆栈或更新现有堆栈
docker stack ls列出现有堆栈
docker stack ps列出堆栈中的任务
docker stack rm删除一个或多个堆栈
docker stack services列出堆栈中的服务

5.4 部署wordpress案例

1、编写YAML文件stack1.yaml

version: '3'
services:db:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpressdeploy:replicas: 1wordpress:depends_on:- dbimage: wordpress:latestports:- "8010:80"environment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressWORDPRESS_DB_NAME: wordpressdeploy:replicas: 1placement:constraints: [node.role == manager]

说明:

  • placement的constraints限制此容器在manager节点

2、使用docker stack发布

[root@sm1 ~]# docker stack deploy -c stack1.yaml stack1
Creating network stack1_default						创建自建的overlay网络
Creating service stack1_db							创建stack1_db服务
Creating service stack1_wordpress					创建stack1_wordpress服务

如果报错,使用docker stack rm stack1删除,排完错再启动

查看服务

[root@sm1 ~]# docker stack ls
NAME      SERVICES
stack1    2

查看服务详细信息,下面这两种方式都可以

[root@sm1 ~]# docker service ls
ID             NAME               MODE         REPLICAS   IMAGE              PORTS
zal9b45ej93m   stack1_db          replicated   1/1        mysql:5.7          
b1k3pg4etfwf   stack1_wordpress   replicated   1/1        wordpress:latest   *:8010->80/tcp
[root@sm1 ~]# docker stack services stack1
ID             NAME               MODE         REPLICAS   IMAGE              PORTS
zal9b45ej93m   stack1_db          replicated   1/1        mysql:5.7          
b1k3pg4etfwf   stack1_wordpress   replicated   1/1        wordpress:latest   *:8010->80/tcp

查看运行在哪个节点上

[root@sm1 ~]# docker stack ps stack1
ID             NAME                 IMAGE              NODE      DESIRED STATE   CURRENT STATE           ERROR     PORTS
n0eeugcgw33w   stack1_db.1          mysql:5.7          sm1       Running         Running 8 minutes ago             
dfcuy0hiek47   stack1_wordpress.1   wordpress:latest   sm3       Running         Running 8 minutes ago

3、验证

在这里插入图片描述

5.5 部署nginx与web管理服务案例

1、编写YAML文件stack2.yaml

version: "3"
services:nginx:image: hub.harbor.com/library/nginx:v1ports:- 80:80deploy:mode: replicatedreplicas: 3visualizer:image: dockersamples/visualizerports:- "9001:8080"volumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:replicas: 1placement:constraints: [node.role == manager]portainer:image: portainer/portainerports:- "9000:9000"volumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:replicas: 1placement:constraints: [node.role == manager]

说明:stack中共有3个service

  • nginx服务,3个副本
  • visualizer服务: 图形查看docker swarm集群
  • portainer服务: 图形管理docker swarm集群

2、使用docker stack发布

[root@sm1 ~]# docker stack deploy -c stack2.yaml stack2
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.
Creating network stack2_default
Creating service stack2_nginx
Creating service stack2_visualizer
Creating service stack2_portainer

查看服务信息

[root@sm1 ~]# docker stack ps stack2
ID             NAME                  IMAGE                             NODE      DESIRED STATE   CURRENT STATE              ERROR     PORTS
zzk6qkuhiymi   stack2_nginx.1        hub.harbor.com/library/nginx:v1   sm3       Running         Running 19 seconds ago               
q2gksal2tj9n   stack2_nginx.2        hub.harbor.com/library/nginx:v1   sw2       Running         Running 19 seconds ago               
2k8471ee4d75   stack2_nginx.3        hub.harbor.com/library/nginx:v1   sm1       Running         Running 19 seconds ago               
ir4n15stkrxa   stack2_portainer.1    portainer/portainer:latest        sm1       Running         Running 9 seconds ago                
jtjvktl7mxki   stack2_visualizer.1   dockersamples/visualizer:latest   sm2       Running         Preparing 14 seconds ago 

3、验证

在这里插入图片描述

在这里插入图片描述

5.6 nginx+haproxy+nfs案例

1、准备工作目录

mkdir -p /docker-stack/haproxy
cd /docker-stack/haproxy/

2、在docker swarm管理节点上准备配置文件haproxy.cfg

globallog 127.0.0.1 local0log 127.0.0.1 local1 noticedefaultslog globalmode httpoption httplogoption dontlognulltimeout connect 5000mstimeout client 50000mstimeout server 50000msstats uri /statusfrontend balancerbind *:8080mode httpdefault_backend web_backendsbackend web_backendsmode httpoption forwardforbalance roundrobinserver web1 nginx1:80 checkserver web2 nginx2:80 checkserver web3 nginx3:80 checkoption httpchk GET /http-check expect status 200

3、编写YAML编排文件stack3.yaml

version: "3"
services:nginx1:image: hub.harbor.com/library/nginx:v1deploy:mode: replicatedreplicas: 1restart_policy:condition: on-failurevolumes:- "nginx_vol:/usr/share/nginx/html"nginx2:image: hub.harbor.com/library/nginx:v1deploy:mode: replicatedreplicas: 1restart_policy:condition: on-failurevolumes:- "nginx_vol:/usr/share/nginx/html"nginx3:image: hub.harbor.com/library/nginx:v1deploy:mode: replicatedreplicas: 1restart_policy:condition: on-failurevolumes:- "nginx_vol:/usr/share/nginx/html"haproxy:image: haproxy:latestvolumes:- "./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro"ports:- "8080:8080"deploy:replicas: 1placement:constraints: [node.role == manager]volumes:nginx_vol:driver: localdriver_opts:type: "nfs"o: "addr=192.168.150.145,rw"device: ":/opt/dockervolume"

4、发布

[root@sm1 haproxy]# docker stack deploy -c stack3.yaml stack3
Since --detach=false was not specified, tasks will be created in the background.
In a future release, --detach=false will become the default.
Creating network stack3_default
Creating service stack3_haproxy
Creating service stack3_nginx1
Creating service stack3_nginx2
Creating service stack3_nginx3

5、验证

在这里插入图片描述

在这里插入图片描述


相关文章:

Docker Swarm实战

文章目录 1、docker swarm介绍2、docker swarm概念与架构2.1 架构2.2 概念 3、docker swarm集群部署3.1 容器镜像仓库 Harbor准备3.2 主机准备3.2.1 主机名3.2.2 IP地址3.2.3 主机名与IP地址解析3.3.4 主机时间同步3.2.5 主机安全设置 3.3 docker安装3.3.1 docker安装3.3.2 配置…...

磁盘空间占用分析工具-wiztree【推荐】

磁盘空间占用分析工具-wiztree【推荐】 如果你遇到过磁盘空间占满、找大文件困难、线上服务器空间飙升等一系列磁盘的问题&#xff0c;并且需要分析文件夹占用空间&#xff0c;传统的方法就是一个一个去看&#xff0c;属实太费劲&#xff0c;效率太低。 而“WizTree”便可解决…...

Vuex在uniapp中的使用

文章目录 一、Vuex概述 1.1 官方解释 1.2 大白话 1.3 组件间共享数据的方式 1.4 再看Vuex是什么 1.5 使用Vuex统一管理好处 二、状态管理 2.1 单页面状态管理 2.2 多页面状态管理 2.3 全局单例模式 2.4 管理哪些状态 三、Vuex的基本使用 3.1 安装 3.2 导入 3.3 创建store对象…...

【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现

开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升&#xff0c;外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统&#xff0c;它无缝整合了餐饮商户资源与广大消费者的…...

Elasticsearch02-安装7.x

零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch &#xff08;1&#xff09;JDK安装 Elasticsearch是基于java开发的&#xff0c;所以需要安装JDK。我们安装的Elasticsearch版本是7.15&#xff0c;对应JDK至少1.8版本以上。也可以不安装jdk&#xff0c;…...

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…...

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…...

渗透测试-前端验签绕过之SHA256+RSA

本文是高级前端加解密与验签实战的第2篇文章&#xff0c;本系列文章实验靶场为Yakit里自带的Vulinbox靶场&#xff0c;本文讲述的是绕过SHA256RSA签名来爆破登录。 绕过 根据提示可以看出这次签名用了SHA2556和RSA两个技术进行加密。 查看源代码可以看到RSA公钥是通过请求服务…...

Maven完整技术汇总

额外知识点 IDE IDE是集成开发环境的缩写&#xff0c;它是一种软件应用程序&#xff0c;提供了编码、调试和部署软件的一站式解决方案。这些功能集成在一起&#xff0c;使开发人员能够在一个环境中完成整个软件开发过程&#xff0c;从编写代码到调试和测试&#xff0c;直到最终…...

NOI系列赛事LaTeX模板

NOI系列赛事 L a T e X LaTeX LaTeX 模板 照搬照抄&#xff1a; s y k s y k C C C syksykCCC syksykCCC 大佬写的&#xff0c;但是看得人不多。真的很好&#xff0c;比其他的板子优秀多了。现在我当一个校友搬运工&#xff0c;搬过来。 \documentclass[UTF8,a4paper]{ctex…...

JustTrustMe是什么

JustTrustMe是什么 JustTrustMe 是一个用于 Android 的 Xposed 模块&#xff0c;主要用于绕过应用程序的 SSL pinning&#xff08;SSL 证书锁定&#xff09;机制。SSL pinning 是一种安全措施&#xff0c;应用程序通过它来验证服务器返回的 SSL 证书是否与应用程序内置的证书匹…...

题解 - 工作分配

题目描述 在工厂里&#xff0c;如果每道工序让不同的工人来做&#xff0c;所要花费的时间往往不一样。精明的老板为了提高效率&#xff0c;总是把生产某一产品所需要的N道工序进行最佳搭配&#xff0c;使生产某一产品所花费的总时间最少。现在就给出N个工人分别做N道工序所要花…...

GLM-4-Plus初体验

引言&#xff1a;为什么高效的内容创作如此重要&#xff1f; 在当前竞争激烈的市场环境中&#xff0c;内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子&#xff0c;还是制作广告&#xff0c;优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…...

【Python基础】Python知识库更新中。。。。

1、Python知识库简介 现阶段主要源于个人对 Python 编程世界的强烈兴趣探索&#xff0c;在深入钻研 Python 核心语法、丰富库函数应用以及多样化编程范式的基础上&#xff0c;逐步向外拓展延伸&#xff0c;深度挖掘其在数据分析、人工智能、网络开发等多个前沿领域的应用潜力&…...

【arm】程序跑飞,SWD端口不可用修复(N32G435CBL7)

项目场景&#xff1a; 国民N32G43X系列&#xff0c;烧录了一个测试程序&#xff0c;在DEBUG中不知什么原因挂掉&#xff0c;然后就无法连接SWD或JLINK。 问题描述 在SWD配置中不可见芯片型号&#xff0c;无法connect&#xff0c;无法烧录。但基本判断是芯片没有损坏。怀疑是程…...

C++如何读取包含空格在内的整行字符串s? ← getline(cin,s);

【问题描述】 问&#xff1a;请分析下面代码&#xff0c;在利用 cin 输入带空格的整行字符串时&#xff0c;会输出什么&#xff1f; #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;for(int i0; i<s.size(); i) {cout<<s[i];}…...

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备

课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课&#xff0c;建立您需要的技能&#xff0c;以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动&#xff0c;学…...

tomcat被检测到目标URL存在htp host头攻击漏洞

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…...

【使用webrtc-streamer解析rtsp视频流】

webrtc-streamer WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&a…...

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;初始化线性表、销毁线性表、判定是否为空表、求线性…...

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用&#xff1f;华为FreeBuds Pro 4有星闪精确查找和离线查找&#xff0c;离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能&#xff0c;当前仅华为FreeBuds Pro 4充电盒支持…...

直流开关电源技术及应用

文章目录 1. 开关电源概论1.1 开关电源稳压原理1.1.1 开关电源稳压原理 1. 开关电源概论 1.1 开关电源稳压原理 为了提高效率&#xff0c;必须使功率调整器件处于开关工作状态。 作为开关而言&#xff0c;导通时压降很小&#xff0c;几乎不消耗能量&#xff0c;关断时漏电流很…...

langchain 结构化输出

主要流程 1. 使用 Pydantic 定义结构化输出&#xff1a; 定义 AnswerWithJustification 类&#xff0c;用于描述输出的结构&#xff0c;包含以下字段&#xff1a; answer&#xff1a;答案内容&#xff08;字符串类型&#xff09;。justification&#xff1a;答案的理由或解释…...

开源Java快速自测工具,可以调用系统内任意一个方法

java快速测试框架&#xff0c;可以调到系统内任意一个方法&#xff0c;告别写单测和controller的困扰。 开源地址&#xff1a;https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码&#xff0c;特别是service层或者是更底层的代码&#xff0c;就…...

挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖&#xff08;打包可执行文件&#…...

相比普通LED显示屏,强力巨彩软模组有哪些优势?

在科技技术的加持下&#xff0c;LED显示屏市场各类创新产品层出不穷&#xff0c;为市场带来了无限可能。其中&#xff0c;强力巨彩R系列H版&#xff08;软模组&#xff09;凭借其独特的技术优势&#xff0c;在行业内脱颖而出。那么&#xff0c;相比常规LED显示屏&#xff0c;强…...

操作系统(7)处理机调度

前言 操作系统中的处理机调度是一个核心概念&#xff0c;它涉及如何从就绪队列中选择进程并将处理机分配给它以运行&#xff0c;从而实现进程的并发执行。 一、调度的层次 高级调度&#xff08;作业调度&#xff09;&#xff1a; 调度对象&#xff1a;作业&#xff08;包含程序…...

【Spark】Spark的两种核心Shuffle工作原理详解

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…...

10.qml使用 shadereffect 实现高斯模糊

目录 高斯模糊sigma获取加权均值获取 高斯二维公式实现高斯一维公式实现使用总结 高斯模糊 高斯模糊应用领域我就不过多讲解&#xff0c;想了解自己去了解 高斯模糊有 一维公式 二维公式 当然我们图像是二维的 但是实际上二维公式用于计算那是消耗大量的算力的&#xff0c…...

2024年12月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案 C C D B B D B C C C D C D B D 1.2024 年 10 月 8 日&#xff0c;诺贝尔物理学奖 “ 意外地 ” 颁给了两位计算机科学家约翰 霍普菲尔德&#xff08; John J. H…...

Nmap脚本参数详解

免责声明&#xff1a;使用本教程或工具&#xff0c;用户必须遵守所有适用的法律和法规&#xff0c;并且用户应自行承担所有风险和责任。 文章目录 一、 按脚本分类1. 检查身份验证机制2. 探测广播行为3. 登录爆破4. 默认脚本运行5. 网络资产发现6. Dos漏洞检测7. 漏洞利用8. 检…...

Rstudio-server的安装、配置、维护

一、安装Rstudio-server (1)安装R语言&#xff1a; sudo apt install r-base # 如果没有管理员权限无法操作 # 这样装上R默认在/usr/bin/R其实基本上的流程都可以参考posit的官网&#xff08;也就是Rstudio的官网&#xff09;&#xff1a; https://posit.co/download/rstudio…...

2024ECCV|DiffBIR: 基于生成扩散先验进行盲图像恢复

文章标题&#xff1a;《DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior》 DiffBIR收录于2024ECCV&#xff0c;是中科院深圳先进技术研究院&#xff08;董超等人&#xff09;、上海AI Lab和香港中文大学联合发布的一项研究。 原文链接&#xff1a;h…...

前端报错npm ERR cb() never called问题

环境使用node版本v14.21.3&#xff0c;npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…...

SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片

SLM510A 系列产品是单通道、高精度、可调电流线性恒流源的 LED 驱动芯片&#xff0c;在各种 LED 照明产品中非常简单易用。其在宽电压输入范围内&#xff0c;能保证极高的输出电流精度&#xff0c;从而在大面积的光源照明中&#xff0c;都能让 LED 照明亮度保持均匀一致。 由于…...

VBA API 概述 / 声明 / 宏编程

注&#xff1a;本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 未整理去重。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前&#xff0c;微软仅提供 32-bit 版本的 Office。而自 Office 2010 起&#xff0…...

Python 开源项目精彩荟萃

一、Web 开发框架 Django 高效路由系统&#xff1a; 支持基于正则表达式的复杂 URL 模式匹配&#xff0c;精准定位视图函数&#xff0c;例如可通过r^articles/(?P<year>\d{4})/$这样的正则表达式来匹配特定年份的文章列表页面 URL&#xff0c;并将年份参数传递给视图函数…...

Debezium系列之:使用Debezium采集oceanbase数据库

Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…...

AI初创企业的未来趋势和潜在挑战

AI初创企业的未来趋势和潜在挑战 AI初创企业的未来趋势和潜在挑战可以从多个方面进行分析&#xff1a; 未来趋势 AI监管: 随着AI技术的快速发展&#xff0c;各国政府开始制定相关法规&#xff0c;以确保AI的安全和伦理使用。这将影响初创企业的运营模式和市场准入。 日常生活…...

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana&#xff0c;并且dashboard接入数据 大屏编号地址&#xff1a;Node Exporter Full | Grafana Labs 创建企微机器人 备注&#xff1a;群里若有第三方外部人员不能创建 机器人创建完成&#xff0c;记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…...

RFDiffusion xyz_to_c6d函数解读

函数 xyz_to_c6d将给定的蛋白质主链坐标 (N,Cα,C)转换为 6D矩阵表示,即用以下几何特征描述两两残基之间的关系: 距离 dist:残基间 Cβ 原子的欧几里得距离。二面角 omega:两个残基的 Cα−Cβ 向量之间的二面角。二面角 theta:由 N−Cα−Cβ和 Cβ间向量定义的二面角。平…...

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...

x2go远程控制

X2Go 优点&#xff1a;专为远程桌面和图形界面优化。性能优越&#xff0c;特别是在网络带宽较低的情况下&#xff0c;采用了高效的压缩和缓存技术。支持多用户、会话恢复功能&#xff0c;适合企业使用。使用 SSH 连接&#xff0c;具有较好的安全性。 安装与配置&#xff1a;需…...

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…...

Ubuntu 安装texstudio sty与texlive

手动安装需要的包 访问CTAN网站&#xff08;Comprehensive TeX Archive Network&#xff09;并下载enumitem宏包&#xff1a; enumitem CTAN页面下载后&#xff0c;将宏包解压到/usr/share/texmf/tex/latex/下。 可打开texstudio/帮助/宏包帮助下载。 如果不想手动安装一个个…...

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

【现代服务端架构】传统服务器 对比 Serverless

在现代开发中&#xff0c;选择合适的架构是至关重要的。两种非常常见的架构模式分别是 传统服务器架构 和 Serverless。它们各有优缺点&#xff0c;适合不同的应用场景。今天&#xff0c;我就带大家一起对比这两种架构&#xff0c;看看它们的差异&#xff0c;并且帮助你选择最适…...

SecureCRT/FX使用[无限试用SecureCRT][新版本SecureFX双击站点总是自动跳到SecureCRT]

无限试用SecureCRT 本文摘录于&#xff1a;https://blog.csdn.net/qq_52162404/article/details/139703993#:~:textSecureCRT只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 我这里修改BAT如下,同时删除CRT和FX的license: echo off re…...

c++ CMakeLists.txt详解

基本结构 CMake 最低版本声明 用于指定需要的最低 CMake 版本&#xff0c;确保兼容性。 cmake_minimum_required(VERSION 3.10)指定 CMake 的最低版本。确保用户的 CMake 版本符合项目需求&#xff0c;否则报错。版本选择建议根据项目使用的功能决定。例如&#xff0c;3.10 引…...