Docker Swarm 集群实践

文章目录

  • Docker Swarm 集群实践
    • **Swarm介绍**
    • **Swarm 特点**
    • **Swarm架构**
    • **Swarm关键概念**
      • 1)Swarm
      • 2)Node
      • 3)服务(Service)
      • 4)任务(Task)
      • 5)命令
    • **Swarm工作方式**
      • 1)Node
      • 2)Service(服务, 任务, 容器)
      • 3)任务与调度
      • 4)服务副本与全局服务
    • **Swarm调度策略**
      • 1)Random
      • 2)Spread
      • 3)Binpack
    • **Swarm Cluster模式的特性**
      • 1)批量创建服务
      • 2)强大的集群的容错性
      • 3)服务节点的可扩展性
      • 4) 调度机制
      • 5)集群步骤
    • **Swarm集群部署实例(Swarm Cluster)**
      • 1)机器环境
      • 2)安装docker
      • 3)创建swarm集群
      • 4)添加节点到swarm集群中
      • 5)在Swarm中部署服务
      • 6)Swarm中使用Volume
    • Swarm 网络
    • 单主机容器网络通信
      • 不同网络间通信
      • 容器间通信
        • IP通信
        • Docker DNS Server通信
        • joined 容器
      • 容器与外部通信
        • 容器访问外部世界
        • 外部世界访问容器
    • 跨主机容器网络通信
    • Service 之间如何通信?
      • **服务发现**
      • **创建 overlay 网络**
      • **部署 service 到 overlay**
      • **验证**
    • 部署微服务
    • Docker 存储
      • storage diver
      • Data Volume
        • bind mount
        • docker managed volume
      • 数据共享
    • Swarm 集群使用 compose
      • 部署服务
      • 查看服务
      • 移除服务
    • 总结
    • 跨 docker host 部署
      • 网络互通
        • 创建overlay网络
        • docker swarm 集群里面服务之间无法调用
        • 健康检查与回滚
      • 数据存储
      • 资源限制
    • 微服务结构划分
    • 参考资料
    • 参考资料

Swarm介绍

Swarm这个项目名称特别贴切。在Wiki的解释中,Swarm behavior是指动物的群集行为。比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavior。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ajM1szva-1599615266540)(assets/907596-20181113172620982-1826542875.png)]

Swarm项目正是这样,通过把多个Docker Engine聚集在一起,形成一个大的docker-engine,对外提供容器的集群服务。同时这个集群对外提供Swarm API,用户可以像使用Docker Engine一样使用Docker集群。

Swarm是Docker公司在2014年12月初发布的容器管理工具,和Swarm一起发布的Docker管理工具还有Machine以及Compose。Swarm是一套较为简单的工具,用以管理Docker集群,使得Docker集群暴露给用户时相当于一个虚拟的整体。Swarm将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。

Docker的Swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面就来认识下Swarm(对于Swarm管理的详细操作可以参考:https://www.centos.bz/tag/swarm/page/3/)

Swarm 特点

  1. 对外以Docker API接口呈现,这样带来的好处是,如果现有系统使用Docker Engine,则可以平滑将Docker Engine切到Swarm上,无需改动现有系统。
  2. Swarm对用户来说,之前使用Docker的经验可以继承过来。非常容易上手,学习成本和二次开发成本都比较低。同时Swarm本身专注于Docker集群管理,非常轻量,占用资源也非常少。简单说,就是插件化机制,Swarm中的各个模块都抽象出了API,可以根据自己一些特点进行定制实现。
  3. Swarm自身对Docker命令参数支持的比较完善,Swarm目前与Docker是同步发布的。Docker的新功能,都会第一时间在Swarm中体现。

Docker自诞生以来,其容器特性以及镜像特性给DevOps爱好者带来了诸多方便。然而在很长的一段时间内,Docker只能在单host上运行,其跨host的部署、运行与管理能力颇受外界诟病。跨host能力的薄弱,直接导致Docker容器与host的紧耦合,这种情况下,Docker容器的灵活性很难令人满意,容器的迁移、分组等都成为很难实现的功能点。

Swarm架构

Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hzQeb1No-1599615266545)(assets/907596-20170518013421541-941251933.png)]

Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。

Swarm关键概念

1)Swarm

集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

2)Node

一个节点(node)是已加入到swarm的Docker引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着Manager管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点.

3)服务(Service)

服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像

4)任务(Task)

任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

5)命令

docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service–help查看帮助)
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)

node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
- manager nodes,也就是管理节点
- worker nodes,也就是工作节点

1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。
2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。
3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。

Swarm工作方式

1)Node

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dwp3SfgT-1599615266548)(assets/907596-20170520194231619-1867210747.png)]

2)Service(服务, 任务, 容器)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mjCl3Csu-1599615266552)(assets/907596-20170520194322822-82295838.png)]

3)任务与调度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GAljiUGl-1599615266554)(assets/907596-20170520194435932-641450568.png)]

4)服务副本与全局服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lKsdbkMs-1599615266557)(assets/907596-20170520194509385-1172179581.png)]

Swarm调度策略

Swarm在scheduler节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread(传播, 扩展, 扩散), binpack, random.

1)Random

顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点可用的CPU, RAM以及正在运行的容器数量来计算应该运行容器的节点。

2)Spread

在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。

3)Binpack

Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

Swarm Cluster模式的特性

1)批量创建服务

建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式。

2)强大的集群的容错性

当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,以及之前设定的值–replicas n,在集群中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的load balance依旧好使!不难看出,docker service其实不仅仅是批量启动服务这么简单,而是在集群中定义了一种状态。Cluster会持续检测服务的健康状态并维护集群的高可用性。

3)服务节点的可扩展性

Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下面,如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"–replicas n"更换成"–mode=global"即可!其中:
复制服务(–replicas n)将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“–replicas 3”。
全局服务(–mode=global)适用于集群内全部可用节点上的服务任务,例如“–mode global”。如果在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。

4) 调度机制

所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。

5)集群步骤

Swarm cluster的创建过程包含以下三个步骤===
1)发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化
2)初始化内部调度(scheduler)模块
3)创建并启动API监听服务模块

一旦创建好这个cluster,就可以用命令docker service批量对集群内的容器进行操作,非常方便!

在启动容器后,docker 会根据当前每个swarm节点的负载判断,在负载最优的节点运行这个task任务,用"docker service ls" 和"docker service ps + taskID"
可以看到任务运行在哪个节点上。容器启动后,有时需要等待一段时间才能完成容器创建。

Swarm集群部署实例(Swarm Cluster)

1)机器环境

(均是centos7.2)

182.48.115.237 swarm的manager节点 manager-node
182.48.115.238 swarm的node节点 node1
182.48.115.239 swarm的node节点 node2

182.48.115.237      swarm的manager节点      manager-node   
182.48.115.238      swarm的node节点         node1
182.48.115.239      swarm的node节点         node2设置主机名
在manager节点上
[root@manager-node ~]# hostnamectl --static set-hostname manager-node在node1节点上
[root@node1 ~]# hostnamectl --static set-hostname node1在node2节点上
[root@node2 ~]# hostnamectl --static set-hostname node2在三台机器上都要设置hosts,均执行如下命令:
[root@manager-node ~]# vim /etc/hosts
......
182.48.115.237 manager-node
182.48.115.238 node1
182.48.115.239 node2关闭三台机器上的防火墙。如果开启防火墙,则需要在所有节点的防火墙上依次放行2377/tcp(管理端口)、7946/udp(节点间通信端口)、4789/udp(overlay 网络端口)端口。
[root@manager-node ~]# systemctl disable firewalld.service
[root@manager-node ~]# systemctl stop firewalld.service

2)安装docker

分别在manager节点和node节点上安装docker,并下载swarm镜像

[root@manager-node ~]# yum install -y docker配置docker
[root@manager-node ~]# vim /etc/sysconfig/docker
......
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'           //在OPTIONS参数项后面的''里添加内容. 或者使用'-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'[root@manager-node ~]# systemctl restart docker下载swarm镜像
[root@manager-node ~]# docker pull swarm
[root@manager-node ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/swarm     latest              36b1e23becab        4 months ago        15.85 MB

3)创建swarm集群

(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)

$ docker swarm init --advertise-addr 182.48.115.237
Swarm initialized: current node (1gi8utvhu4rxy8oxar2g7h6gr) is now a manager.To add a worker to this swarm, run the following command:docker swarm join \--token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej \182.48.115.237:2377To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全局唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

温馨提示:

如果再次执行上面启动swarm集群的命令,会报错说这个节点已经在集群中了
Error response from daemon: This node is already part of a swarm. Use “docker swarm leave” to leave this swarm and join another one.

解决办法:

[root@manager-node ~]# docker swarm leave --help           //查看帮助
[root@manager-node ~]# docker swarm leave --force#使用docker info 或 docker node ls 查看集群中的相关信息
[root@manager-node ~]# docker info
.......
Swarm: activeNodeID: 1gi8utvhu4rxy8oxar2g7h6grIs Manager: trueClusterID: a88a9j6nwcbn31oz6zp9oc0f7Managers: 1Nodes: 1Orchestration:Task History Retention Limit: 5
.......[root@manager-node ~]# docker node ls                 
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader

注意上面node ID旁边那个*号表示现在连接到这个节点上。

4)添加节点到swarm集群中

在docker swarm init 完了之后,会提示如何加入新机器到集群,如果当时没有注意到,也可以通过下面的命令来获取如何加入新机器到集群的 token:

#获取加入管理机的token
$ docker swarm join-token manager
#获取加入工作机的token
$ docker swarm join-token worker

登录到node1节点上,执行前面创建swarm集群时输出的命令:

[root@node1 ~]``# docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377
This node joined a swarm as a worker.

同理在node2节点上,也执行这个命令

[root@node2 ~]``# docker swarm join --token SWMTKN-1-4roc8fx10cyfgj1w1td8m0pkyim08mve578wvl03eqcg5ll3ig-f0apd81qfdwv27rnx4a4y9jej 182.48.115.237:2377
This node joined a swarm as a worker.

如果想要将其他更多的节点添加到这个swarm集群中,添加方法如上一致!然后在manager-node管理节点上看一下集群节点的状态:

[root@manager-node ~]``# docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
ei53e7o7jf0g36329r3szu4fi    node1         Ready   Active      
f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active

温馨提示:更改节点的availablity状态

warm集群中node的availability状态可以为 active或者drain(排水, 排泄, 外流),其中:
active(上线)状态下:node可以接受来自manager节点的任务分派;
drain(下线)状态下:node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)。

[root@manager-node ~]``# docker node update --availability drain node1    //将node1节点下线。如果要删除node1节点,命令是"docker node rm --force node1"
[root@manager-node ~]``# docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
1gi8utvhu4rxy8oxar2g7h6gr *  manager-node  Ready   Active        Leader
ei53e7o7jf0g36329r3szu4fi    node1         Ready   drain      
f1obgtudnykg51xzyj5fs1aev    node2         Ready   Active

如上,当node1的状态改为drain后,那么该节点就不会接受task任务分发,就算之前已经接受的任务也会转移到别的节点上。再次修改为active状态(及将下线的节点再次上线)

$ docker node update --availability active node1

5)在Swarm中部署服务

Docker 1.12版本提供服务的Scaling、health check、滚动升级等功能,并提供了内置的dns、vip机制,实现service的服务发现和负载均衡能力。(这里以nginx服务为例)

在启动容器之前,先来创建一个覆盖网络,用来保证在不同主机上的容器网络互通的网络模式

[root@manager-node ~]# docker network create -d overlay ngx_net
[root@manager-node ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
8bbd1b7302a3        bridge              bridge              local
9e637a97a3b9        docker_gwbridge     bridge              local
b5a41c8c71e7        host                host                local
1x45zepuysip        ingress             overlay             swarm            
3ye6vfp996i6        ngx_net             overlay             swarm            
0808a5c72a0a        none                null                local

在manager-node节点上使用上面这个覆盖网络创建nginx服务:
其中,–replicas 参数指定服务由几个实例组成。
注意:不需要提前在节点上下载nginx镜像,这个命令执行后会自动下载这个容器镜像(比如此处创建tomcat容器,就将下面命令中的镜像改为tomcat镜像)。

[root@manager-node ~]# docker service create --replicas 1 --network ngx_net --name my-test -p 80:80 nginx

就创建了一个具有一个副本(–replicas 1 )的nginx服务,使用镜像nginx

使用 docker service ls 查看正在运行服务的列表

[root@manager-node ~]# docker service ls
ID            NAME     REPLICAS  IMAGE            COMMAND
0jb5eebo8j9q  my-test`  `1/1`       `nginx

查询Swarm中服务的信息
-pretty 使命令输出格式化为可读的格式,不加 --pretty 可以输出更详细的信息:

[root@manager-node ~]# docker service inspect --pretty my-test
ID:   0jb5eebo8j9qb1zc795vx3py3
Name:   my-test
Mode:   ReplicatedReplicas:  1
Placement:
UpdateConfig:Parallelism: 1On failure:  pause
ContainerSpec:Image:   nginx
Resources:
Networks: 3ye6vfp996i6eq17tue0c2jv9
Ports:Protocol = tcpTargetPort = 80PublishedPort = 80

查询到哪个节点正在运行该服务。如下该容器被调度到manager-node节点上启动了,然后访问http://182.48.115.237即可访问这个容器应用(如果调度到其他节点,访问也是如此)

[root@manager-node ~]# docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeua5jbgz1infuy  my-test.1  nginx  manager-node  Running        Running 3 minutes ago

注意,如果上面命令执行后,上面的 STATE 字段中刚开始的服务状态为 Preparing,需要等一会才能变为 Running 状态,其中最费时间的应该是下载镜像的过程。

有上面命令可知,该服务在manager-node节点上运行。登陆该节点,可以查看到nginx容器在运行中

[root@manager-node ~]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
1ea1d72007da        nginx:latest   "nginx -g 'daemon off"`   `4 minutes ago       Up 4 minutes        80/tcp`              `my-test.1.2m8qqpoa0dpeua5jbgz1infuy

-------------------------------------------在Swarm中动态扩展服务(scale)-----------------------------------------------
当然,如果只是通过service启动容器,swarm也算不上什么新鲜东西了。Service还提供了复制(类似kubernetes里的副本)功能。可以通过 docker service scale 命令来设置服务中容器的副本数:

比如将上面的my-test容器动态扩展到5个,命令如下:

[root@manager-node ~]``# docker service scale my-test=5

和创建服务一样,增加scale数之后,将会创建新的容器,这些新启动的容器也会经历从准备到运行的过程,过一分钟左右,服务应该就会启动完成,这时候可以再来看一下 nginx 服务中的容器

[root@manager-node ~]# docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeua5jbgz1infuy  my-test.1  nginx  manager-node  Running        Running 9 minutes ago
aqko8yhmdj53gmzs8gqhoylc2  my-test.2  nginx  node2         Running        Running 2 minutes ago
erqk394hd4ay7nfwgaz4zp3s0  my-test.3  nginx  node1         Running        Running 2 minutes ago
2dslg6w16wzcgboa2hxw1c6k1  my-test.4  nginx  node1         Running        Running 2 minutes ago
bmyddndlx6xi18hx4yinpakf3  my-test.5  nginx  manager-node  Running        Running 2 minutes ago

可以看到,之前my-test容器只在manager-node节点上有一个实例,而现在又增加了4个实例。这5个副本的my-test容器分别运行在这三个节点上,登陆这三个节点,就会发现已经存在运行着的my-test容器。


特别需要清楚的一点:

果一个节点宕机了(即该节点就会从swarm集群中被踢出),则Docker应该会将在该节点运行的容器,调度到其他节点,以满足指定数量的副本保持运行状态。

比如:
将node1宕机后或将node1的docker服务关闭,那么它上面的task实例就会转移到别的节点上。当node1节点恢复后,它转移出去的task实例不会主动转移回来,
只能等别的节点出现故障后转移task实例到它的上面。使用命令"docker node ls",发现node1节点已不在swarm集群中了。

然后过一会查询服务的状态列表

[root@manager-node ~]# docker service ps my-test
ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE           ERROR
2m8qqpoa0dpeua5jbgz1infuy  my-test.1      docker.io/nginxmanager-node  Running        Running 33 minutes ago
aqko8yhmdj53gmzs8gqhoylc2  my-test.2      docker.io/nginx`  `node2         Running        Running 26 minutes ago
di99oj7l9x6firw1ai25sewwc  my-test.3      docker.io/nginxnode2         Running        Running 6 minutes ago
erqk394hd4ay7nfwgaz4zp3s0   _ my-test.3  docker.io/nginx`  `node1         Shutdown       Complete 5 minutes ago
aibl3u3pph3fartub0mhwxvzr  my-test.4      docker.io/nginxnode2         Running        Running 6 minutes ago
2dslg6w16wzcgboa2hxw1c6k1   _ my-test.4  docker.io/nginx`  `node1         Shutdown       Complete 5 minutes ago
bmyddndlx6xi18hx4yinpakf3  my-test.5      docker.io/nginxmanager-node  Running        Running 26 minutes ago

发现,node1节点出现故障后,它上面之前的两个task任务已经转移到node2节点上了。
登陆到node2节点上,可以看到这两个运行的task任务。当访问182.48.115.239节点的80端口,swarm的负载均衡会把请求路由到一个任意节点的可用的容器上。

[root@node2 ~]# docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS               NAMES
216abf6bebea        docker.io/nginx:latest"nginx -g 'daemon off"7 minutes ago       Up 7 minutes        80/tcp`              `my-test.3.di99oj7l9x6firw1ai25sewwc
1afd12cc9140        docker.io/nginx:latest"nginx -g 'daemon off"7 minutes ago       Up 7 minutes        80/tcp`              `my-test.4.aibl3u3pph3fartub0mhwxvzr
cc90da57c25e        docker.io/nginx:latest"nginx -g 'daemon off"27 minutes ago      Up 27 minutes       80/tcp`              `my-test.2.aqko8yhmdj53gmzs8gqhoylc2

再次在node2节点上将从node1上转移过来的两个task关闭

[root@node2 ~]# docker stop my-test.3.di99oj7l9x6firw1ai25sewwc my-test.4.aibl3u3pph3fartub0mhwxvzr
my-test.3.di99oj7l9x6firw1ai25sewwc
my-test.4.aibl3u3pph3fartub0mhwxvzr

再次查询服务的状态列表,发现这两个task又转移到node1上了(即在swarm cluster集群中启动的容器,在worker node节点上删除或停用后,该容器会自动转移到其他的worker node节点上)

[root@manager-node ~]# docker service ps my-test
ID                         NAME           IMAGE            NODE          DESIRED STATE  CURRENT STATE                ERROR
2m8qqpoa0dpeua5jbgz1infuy  my-test.1      docker.io/nginxmanager-node  Running        Running 38 minutes ago    
aqko8yhmdj53gmzs8gqhoylc2  my-test.2      docker.io/nginx`  `node2         Running        Running 31 minutes ago    
7dhmc63rk0bc8ngt59ix38l44  my-test.3      docker.io/nginxnode1         Running        Running about a minute ago
di99oj7l9x6firw1ai25sewwc   _ my-test.3  docker.io/nginx`  `node2         Shutdown       Complete about a minute ago
erqk394hd4ay7nfwgaz4zp3s0   \_ my-test.3  docker.io/nginxnode1         Shutdown       Complete 9 minutes ago    
607tyjv6foc0ztjjvdo3l3lge  my-test.4      docker.io/nginx`  `node1         Running        Running about a minute ago
aibl3u3pph3fartub0mhwxvzr   \_ my-test.4  docker.io/nginxnode2         Shutdown       Complete about a minute ago
2dslg6w16wzcgboa2hxw1c6k1   _ my-test.4  docker.io/nginx`  `node1         Shutdown       Complete 9 minutes ago    
bmyddndlx6xi18hx4yinpakf3  my-test.5      docker.io/nginxmanager-node  Running        Running 31 minutes ago

同理,swarm还可以缩容,如下,将my-test容器变为1个。

[root@manager-node ~]# docker service scale my-test=1
[root@manager-node ~]# docker service ps my-test
ID                         NAME       IMAGE            NODE          DESIRED STATE  CURRENT STATE          ERROR
2m8qqpoa0dpeuasdfsdfdfsdf  my-test.1  nginx  manager-node  Running        Running 3 minutes ago

登录node2节点,使用docker ps查看,会发现容器被stop而非 rm


删除容器服务

[root@manager-node ~]# docker service --help       //查看帮助
[root@manager-node ~]# docker service rm my-test    //这样就会把所有节点上的所有容器(task任务实例)全部删除了my-nginx

除了上面使用scale进行容器的扩容或缩容之外,还可以使用docker service update 命令。 可对 服务的启动 参数 进行 更新/修改。

[root@manager-node ~]# docker service update --replicas 3 my-test
my-test

更新完毕以后,可以查看到REPLICAS已经变成3/3

[root@manager-node ~]# docker service ls
ID            NAME          REPLICAS  IMAGE      COMMAND 
d7cygmer0yy5  my-test`       `3/3nginx     /bin/bash[root@manager-node ~]# docker service ps my-test
ID                         NAME             IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
ddkidkz0jgor751ffst55kvx4  my-test.1      nginx  node1         Running          Preparing 4 seconds ago
1aucul1b3qwlmu6ocu312nyst   \_ my-test.1  nginx  manager-node  Shutdown       Complete 5 seconds ago 
4w9xof53f0falej9nqgq064jz   \_ my-test.1  nginx  manager-node  Shutdown       Complete 19 seconds ago
0e9szyfbimaow9tffxfeymci2   \_ my-test.1  nginx  manager-node  Shutdown       Complete 30 seconds ago
27aqnlclp0capnp1us1wuiaxm  my-test.2      nginx  manager-node  Running        Preparing 1 seconds ago
7dmmmle29uuiz8ey3tq06ebb8  my-test.3      nginx  manager-node  Running        Preparing 1 seconds ago

docker service update 命令,也可用于直接 升级 镜像等。

[root@manager-node ~]``# docker service update --image nginx:new my-test[root@manager-node ~]# docker service ls
ID            NAME          REPLICAS  IMAGE         COMMAND 
d7cygmer0yy5  my-test3/3`       `nginx:new/bin/bash

6)Swarm中使用Volume

(挂载目录: --mount type=volume 或者 --mount type=bind )

#查看docker volume的帮助信息
[root@manager-node ~]``# docker volume --helpUsage:  docker volume COMMANDManage Docker volumesOptions:``--help   Print usageCommands:``create      Create a volume``inspect     Display detailed information on one or ``more` `volumes``ls`          `List volumes``rm`          `Remove one or ``more` `volumesRun ``'docker volume COMMAND --help'` `for` `more` `information on a ``command``.[root@manager-node ~]``# docker volume create --name myvolume
myvolume[root@manager-node ~]``# docker volume ls
DRIVER              VOLUME NAME
local`               `11b68dce3fff0d57172e18bc4e4cfc252b984354485d747bf24abc9b11688171
local`               `1cd106ed7416f52d6c77ed19ee7e954df4fa810493bb7e6cf01775da8f9c475f
local`               `myvolume

参数src写成source也可以;dst表示容器内的路径,也可以写成destination

[root@manager-node ~]``# docker service create --replicas 2 --network ngx_net --mount type=volume,src=myvolume,dst=/wangshibo --name test-nginx nginx

温馨提示:

必须确保各节点服务器的selinux永久关闭,即:

[root@manager-node ~]``# cat /etc/sysconfig/selinux
SELINUX=disabled
[root@manager-node ~]``# reboot
[root@manager-node ~]``# getenforce
Disabled

必须是永久关闭,临时关闭可能都不行,否则上面创建命令后,可能会出现如下报错:

[root@manager-node ~]``# docker service ps test-nginx
"SELinux relabeling of is not allowed"
[root@manager-node ~]# docker service ls
ID            NAME        REPLICAS  IMAGE   COMMAND
8s9m0okwlhvl  test-nginx  2/2`       `nginx
[root@manager-node ~]# docker service ps test-nginx
ID                         NAME          IMAGE  NODE   DESIRED STATE  CURRENT STATE           ERROR
32bqjjhqcl1k5z74ijjli35z3  test-nginx.1  nginx  node1  Running        Running 23 seconds ago
48xoypunb3g401jkn690lx7xt  test-nginx.2  nginx  node2  Running        Running 23 seconds ago

登录node1节点的test-nginx容器查看

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d471569629b2        nginx:latest        "nginx -g 'daemon off"`   `2 minutes ago       Up 2 minutes        80/tcp`              `test-nginx.1.32bqjjhqcl1k5z74ijjli35z3[root@node1 ~]# docker exec -ti d471569629b2 /bin/bash
root@d471569629b2:/# cd /wangshibo/
root@d471569629b2:/wangshibo# ls
root@d471569629b2:/wangshibo# echo "ahahha" > test
root@d471569629b2:/wangshibo# ls
test[root@node1 ~]# docker volume inspect myvolume
[{"Name": "myvolume","Driver": "local","Mountpoint": "/var/lib/docker/volumes/myvolume/_data","Labels": null,"Scope": "local"}
]
[root@node1 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@node1 _data]# ls
test
[root@node1 _data]# cat test
ahahha
[root@node1 _data]# echo "12313" > 123
[root@node1 _data]# ls
123  testroot@d471569629b2:/wangshibo# ls
123  test
root@d471569629b2:/wangshibo# cat test
ahahha

需要注意:

  1. 挂载volume后,宿主机和容器之间就可以通过volume进行双向实时同步.
  2. 如果replicas是多份,则每个节点宿主机上都会有一个volume路径,即每个节点宿主机的/var/lib/docker/volumes/myvolume/_data 和分布到它上面的容器里的/wangshibo进行实时同步。

第二种方法:命令格式:

docker service create --mount` `type=bind,source=/host_data/,destination=/container_data/

其中,参数target表示容器里面的路径,source表示本地硬盘路径

[root@manager-node ~]# docker service create --replicas 1 --mount type=bind,source=/opt/web/,destination=/usr/share/nginx/html/ --network ngx_net --name haha-nginx -p 8880:80 nginx
[root@manager-node ~]# docker service ls
ID            NAME        REPLICAS  IMAGE  COMMAND
9t9d58b5bq4u  haha-nginx  1/1`       `nginx
[root@manager-node ~]# docker service ps haha-nginx
ID                         NAME              IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
bji4f5tikhvm7nf5ief3jk2is  haha-nginx.1      nginx  node2         Running        Running 18 seconds ago

登录node2节点,在挂载目录/opt/web下写测试数据

[root@node2 _data]# cd /opt/web/
[root@node2 web]# ls
[root@node2 web]# cat wang.html
sdfasdf

登录容器查看,发现已经实现数据同步

====================================================
温馨提示:
必须确保各节点服务器的selinux永久关闭,即:
[root@manager-node ~]# cat /etc/sysconfig/selinux
SELINUX=disabled
[root@manager-node ~]# reboot
[root@manager-node ~]# getenforce
Disabled必须是永久关闭,临时关闭可能都不行,否则上面创建命令后,可能会出现如下报错:
[root@manager-node ~]# docker service ps test-nginx
"SELinux relabeling of is not allowed"
====================================================[root@manager-node ~]# docker service ls
ID            NAME        REPLICAS  IMAGE   COMMAND
8s9m0okwlhvl  test-nginx  2/2`       `nginx
[root@manager-node ~]# docker service ps test-nginx
ID                         NAME          IMAGE  NODE   DESIRED STATE  CURRENT STATE           ERROR
32bqjjhqcl1k5z74ijjli35z3  test-nginx.1  nginx  node1  Running        Running 23 seconds ago
48xoypunb3g401jkn690lx7xt  test-nginx.2  nginx  node2  Running        Running 23 seconds ago登录node1节点的test-nginx容器查看
[root@node1 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
d471569629b2        nginx:latest        "nginx -g 'daemon off"`   `2 minutes ago       Up 2 minutes        80/tcp`              `test-nginx.1.32bqjjhqcl1k5z74ijjli35z3[root@node1 ~]# docker exec -ti d471569629b2 /bin/bash
root@d471569629b2:/# cd /wangshibo/
root@d471569629b2:/wangshibo# ls
root@d471569629b2:/wangshibo# echo "ahahha" > test
root@d471569629b2:/wangshibo# ls
test[root@node1 ~]# docker volume inspect myvolume
[{"Name": "myvolume","Driver": "local","Mountpoint": "/var/lib/docker/volumes/myvolume/_data","Labels": null,"Scope": "local"}
]
[root@node1 ~]# cd /var/lib/docker/volumes/myvolume/_data/
[root@node1 _data]# ls
test
[root@node1 _data]# cat test
ahahha
[root@node1 _data]# echo "12313" > 123
[root@node1 _data]# ls
123  testroot@d471569629b2:/wangshibo# ls
123  test
root@d471569629b2:/wangshibo# cat test
ahahha需要注意:
1) 挂载volume后,宿主机和容器之间就可以通过volume进行双向实时同步.
2) 如果replicas是多份,则每个节点宿主机上都会有一个volume路径,即每个节点宿主机的/var/lib/docker/volumes/myvolume/_data和分布到它上面的容器里的/wangshibo进行实时同步.============================================================
第二种方法:命令格式:
docker service create --mount` `type=bind,source=/host_data/,destination=/container_data/
其中,参数target表示容器里面的路径,source表示本地硬盘路径[root@manager-node ~]# docker service create --replicas 1 --mount type=bind,source=/opt/web/,destination=/usr/share/nginx/html/ --network ngx_net --name haha-nginx -p 8880:80 nginx
[root@manager-node ~]# docker service ls
ID            NAME        REPLICAS  IMAGE  COMMAND
9t9d58b5bq4u  haha-nginx  1/1`       `nginx
[root@manager-node ~]# docker service ps haha-nginx
ID                         NAME              IMAGE  NODE          DESIRED STATE  CURRENT STATE            ERROR
bji4f5tikhvm7nf5ief3jk2is  haha-nginx.1      nginx  node2         Running        Running 18 seconds ago登录node2节点,在挂载目录/opt/web下写测试数据
[root@node2 _data]# cd /opt/web/
[root@node2 web]# ls
[root@node2 web]# cat wang.html
sdfasdf登录容器查看,发现已经实现数据同步
[root@node2 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
3618e3d1b966        nginx:latest        "nginx -g 'daemon off"`   `28 seconds ago      Up 24 seconds       80/tcp`              `haha-nginx.1.bji4f5tikhvm7nf5ief3jk2is
[root@node2 ~]# docker exec -ti 3618e3d1b966 /bin/bash
root@3618e3d1b966:/# cd /usr/share/nginx/html
root@3618e3d1b966:/usr/share/nginx/html# ls
wang.html
root@3618e3d1b966:/usr/share/nginx/html# cat wang.html
sdfasdf
root@3618e3d1b966:/usr/share/nginx/html# touch test
touch: cannot touch` `'test': Permission denied由此可见,以上设置后,在容器里的同步目录下没有写权限,更新内容时只要放到宿主机的挂在目录下即可!

由此可见,以上设置后,在容器里的同步目录下没有写权限,更新内容时只要放到宿主机的挂在目录下即可!

Swarm 网络

在Docker版本1.12之后swarm模式原生支持覆盖网络(overlay networks),可以先创建一个覆盖网络,然后启动容器的时候启用这个覆盖网络,这样只要是这个覆盖网络内的容器,不管在不在同一个宿主机上都能相互通信,即跨主机通信!不同覆盖网络内的容器组之间是相互隔离的(相互ping不通)。

Swarm 集群产生两种不同类型的流量:

  • 控制和管理层面:包括 Swarm 消息管理等,例如请求加入或离开Swarm,这种类型的流量总是被加密的。(涉及到集群内部的hostname、ip-address、subnet、gateway等)
  • 应用数据层面:包括容器与客户端的通信等。(涉及到防火墙、端口映射、网口映射、VIP等)

在 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 允许自定义。

swarm模式的overlay networks包含以下特性:

  • 可以将多个服务连接到同一个网络中。

  • 默认情况下,容器网络的服务发现机制给swarm集群中的每个服务都分配一个虚拟IP地址和一个DNS条目,所以在同一网络中的容器可以通过服务名称访问服务。

  • 可以将服务配置成使用DNS轮询机制而不是VIP机制来进行负载均衡。

swarm模式的覆盖网络包括以下功能:
1)可以附加多个服务到同一个网络。
2)默认情况下,service discovery为每个swarm服务分配一个虚拟IP地址(vip)和DNS名称,使得在同一个网络中容器之间可以使用服务名称互相连接。
3)可以配置使用DNS轮循而不使用VIP
4)为了可以使用swarm的覆盖网络,在启用swarm模式之间你需要在swarm节点之间开放以下端口:
5)TCP/UDP端口7946 – 用于容器网络发现
6)UDP端口4789 – 用于容器覆盖网络

-----------在Swarm集群中创建overlay网络------------实例如下:

$ docker network create --driver overlay --opt encrypted --subnet 10.10.19.0/24 ngx_net

参数解释:
–opt encrypted: 默认情况下swarm中的节点通信是加密的。在不同节点的容器之间,可选的–opt encrypted参数能在它们的vxlan流量启用附加的加密层。
--subnet:命令行参数指定overlay网络使用的子网网段。当不指定一个子网时,swarm管理器自动选择一个子网并分配给网络。

$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d7aa48d3e485        bridge              bridge              local
9e637a97a3b9        docker_gwbridge     bridge              local
b5a41c8c71e7        host                host                local
7f4fx3jf4dbr        ingress             overlay             swarm             
3x2wgugr6zmn        ngx_net             overlay             swarm             
0808a5c72a0a        none                null                local

由上可知,Swarm当中拥有2套覆盖网络。其中"ngx_net"网络正是我们在部署容器时所创建的成果。"ingress"覆盖网络则为默认提供。Swarm 管理节点会利用 ingress 负载均衡以将服务公布至集群之外。
在将服务连接到这个创建的网络之前,网络覆盖到manager节点。上面输出的SCOPE为 swarm 表示将服务部署到Swarm时可以使用此网络。
在将服务连接到这个网络后,Swarm只将该网络扩展到特定的worker节点,这个worker节点被swarm调度器分配了运行服务的任务。在那些没有运行该服务任务的worker节点上,网络并不扩展到该节点。

------------------将服务连接到overlay网络-------------------

$ docker service create --replicas 3 --network ngx_net --name my-test -p 80:80 nginx

上面名为"my-test"的服务启动了3个task,用于运行每个任务的容器都可以彼此通过overlay网络进行通信。Swarm集群将网络扩展到所有任务处于Running状态的节点上。

$ docker service ls
ID            NAME     REPLICAS  IMAGE  COMMAND
dsaxs6v463g9  my-test  3/3       nginx

在manager-node节点上,通过下面的命令查看哪些节点有处于running状态的任务:

$ docker service ps my-test
ID                         NAME       IMAGE  NODE          DESIRED STATE  CURRENT STATE          ERROR
8433fuiy7vpu0p80arl7vggfe  my-test.1  nginx  node2         Running        Running 2 minutes ago
f1h7a0vtojv18zrsiw8j0rzaw  my-test.2  nginx  node1         Running        Running 2 minutes ago
ex73ifk3jvzw8ukurl8yu7fyq  my-test.3  nginx  node1         Running        Running 2 minutes ago

可见三个节点都有处于running状态的任务,所以my-network网络扩展到三个节点上。

可以查询某个节点上关于my-network的详细信息:

$ docker network inspect ngx_net
[{"Name": "ngx_net","Id": "3x2wgugr6zmn1mcyf9k1du27p","Scope": "swarm","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet":"10.10.19.0/24","Gateway":"10.10.19.1"}]},"Internal":false,"Containers": {"00f47e38deea76269eb03ba13695ec0b0c740601c85019546d6a9a17fd434663": {"Name":"my-test.5.btorxekfix4hcqh4v83dr0tzw","EndpointID":"ea962d07eee150b263ae631b8a7f8c1950337c11ef2c3d488a7c3717defd8601","MacAddress":"02:42:0a:0a:13:03","IPv4Address":"10.10.19.3/24","IPv6Address":""},"957620c6f7abb44ad8dd2d842d333f5e5c1655034dc43e49abbbd680de3a5341": {"Name":"my-test.4.cyu73jd8psupfhken23vvmpud","EndpointID":"f33a6e9ddf1dd01bcfc43ffefd19e19514658f001cdf9b2fbe23bc3fdf56a42a","MacAddress":"02:42:0a:0a:13:07","IPv4Address":"10.10.19.7/24","IPv6Address":""}},"Options": {"com.docker.network.driver.overlay.vxlanid_list": "257"},"Labels": {}}
]

从上面的信息可以看出在manager-node节点上,名为my-test的服务有一个名为my-test.5.btorxekfix4hcqh4v83dr0tzw和
my-test.4.cyu73jd8psupfhken23vvmpud的task连接到名为ngx_net的网络上(另外两个节点node1和node2同样可以用上面命令查看)

$ docker network inspect ngx_net
......."Containers": {"7d9986fad5a7d834676ba76ae75aff2258f840953f1dc633c3ef3c0efd2b2501": {"Name":"my-test.3.ex73ifk3jvzw8ukurl8yu7fyq","EndpointID":"957ca19f3d5480762dbd14fd9a6a1cd01a8deac3e8e35b23d1350f480a7b2f37","MacAddress":"02:42:0a:0a:13:06","IPv4Address":"10.10.19.6/24","IPv6Address":""},"9e50fceada1d7c653a886ca29d2bf2606debafe8c8a97f2d79104faf3ecf8a46": {"Name":"my-test.2.f1h7a0vtojv18zrsiw8j0rzaw","EndpointID":"b1c209c7b68634e88e0bf5e100fe03435b3096054da6555c61e6c207ac651ac2","MacAddress":"02:42:0a:0a:13:05","IPv4Address":"10.10.19.5/24","IPv6Address":""}},
.........
$ docker network inspect ngx_net
........"Containers": {"4bdcce0ee63edc08d943cf4a049eac027719ff2dc14b7c3aa85fdddc5d1da968": {"Name": "my-test.1.8433fuiy7vpu0p80arl7vggfe","EndpointID": "df58de85b0a0e4d128bf332fc783f6528d1f179b0f9f3b7aa70ebc832640d3bc","MacAddress": "02:42:0a:0a:13:04","IPv4Address": "10.10.19.4/24","IPv6Address": ""}},

可以通过查询服务来获得服务的虚拟IP地址,如下:

$ docker service inspect --format='{{json .Endpoint.VirtualIPs}}' my-test
[{"NetworkID":"7f4fx3jf4dbrp97aioc05pul4","Addr":"10.255.0.6/16"},{"NetworkID":"3x2wgugr6zmn1mcyf9k1du27p","Addr":"10.10.19.2/24"}]

由上结果可知,10.10.19.2其实就是swarm集群内部的vip,整个网络结构如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ljv91XfQ-1599615266560)(assets/907596-20170521012939869-251304626.png)]

加入ngx_net网络的容器彼此之间可以通过IP地址通信,也可以通过名称通信。

$ docker ps
CONTAINER ID    IMAGE           COMMAND                  CREATED         STATUS             PORTS    NAMES
4bdcce0ee63e    nginx:latest    "nginx -g 'daemon off"   22 minutes ago  Up 22 minutes      80/tcp   my-test.1.8433fuiy7vpu0p80arl7vggfe
$ docker exec -ti 4bdcce0ee63e /bin/bash
root@4bdcce0ee63e:/# ip addr                                                                                           
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group defaultlink/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever
1786: eth0@if1787: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 02:42:0a:ff:00:08 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.255.0.8/16 scope global eth0valid_lft forever preferred_lft foreverinet 10.255.0.6/32 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::42:aff:feff:8/64 scope linkvalid_lft forever preferred_lft forever
1788: eth1@if1789: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 1inet 172.18.0.3/16 scope global eth1valid_lft forever preferred_lft foreverinet6 fe80::42:acff:fe12:3/64 scope linkvalid_lft forever preferred_lft forever
1791: eth2@if1792: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 02:42:0a:0a:13:04 brd ff:ff:ff:ff:ff:ff link-netnsid 2inet 10.10.19.4/24 scope global eth2valid_lft forever preferred_lft foreverinet 10.10.19.2/32 scope global eth2valid_lft forever preferred_lft foreverinet6 fe80::42:aff:fe0a:1304/64 scope linkvalid_lft forever preferred_lft foreverroot@4bdcce0ee63e:/# ping 10.10.19.3
PING 10.10.19.3 (10.10.19.3): 56 data bytes
64 bytes from 10.10.19.3: icmp_seq=0 ttl=64 time=0.890 ms
64 bytes from 10.10.19.3: icmp_seq=1 ttl=64 time=0.622 ms
.....-
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.622/0.756/0.890/0.134 msroot@4bdcce0ee63e:/# ping 10.10.19.6
PING 10.10.19.6 (10.10.19.6): 56 data bytes
64 bytes from 10.10.19.6: icmp_seq=0 ttl=64 time=0.939 ms
64 bytes from 10.10.19.6: icmp_seq=1 ttl=64 time=0.590 ms

----------------------------使用swarm模式的服务发现--------------------------
默认情况下,当创建了一个服务并连接到某个网络后,swarm会为该服务分配一个VIP。此VIP根据服务名映射到DNS。在网络上的容器共享该服务的DNS映射,所以网络上的任意容器可以通过服务名访问服务

在同一个overlay网络中,不用通过端口映射来使某个服务可以被其它服务访问。Swarm内部的负载均衡器自动将请求发送到服务的VIP上,然后分发到所有的active的task上。

如下示例:在同一个网络中添加了一个centos服务,此服务可以通过名称my-test访问前面创建的nginx服务:

$ docker service create --name my-centos --network ngx_net centos        

查询centos运行在哪个节点上(上面创建命令执行后,需要一段时间才能完成这个centos服务的创建)

$ docker service ps my-centos
ID                         NAME             IMAGE   NODE   DESIRED STATE  CURRENT STATE            ERROR
e03pqgkjs3l1qizc6v4aqaune  my-centos.1      centos  node2  Running        Preparing 4 seconds ago

登录centos运行的节点(由上可知是node2节点):

$ docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS            NAMES
e4554490d891        centos:latest            "/bin/bash"`             `About an hour ago   Up About an hour   my-centos.1.9yk5ie28gwk9mw1h1jovb68ki

打开centos的交互shell:

$ docker exec -ti my-centos.1.9yk5ie28gwk9mw1h1jovb68ki /bin/bash
root@4bdcce0ee63e:/# nslookup my-test
Server: 127.0.0.11
Address 1: 127.0.0.11
Name: my-test
Address 1: 10.10.19.2 10.10.19.2

从centos容器内部,使用特殊查询,查询DNS,来找到my-test服务的所有容器的IP地址:

root@4bdcce0ee63e:/# nslookup tasks.my-test
Server: 127.0.0.11
Address 1: 127.0.0.11
Name: tasks.my-test
Address 1: 10.10.19.4 my-test.1.8433fuiy7vpu0p80arl7vggfe
Address 2: 10.10.19.5 my-test.2.f1h7a0vtojv18zrsiw8j0rzaw
Address 3: 10.10.19.6 my-test.3.ex73ifk3jvzw8ukurl8yu7fyq
Address 2: 10.10.19.7 my-test.4.cyu73jd8psupfhken23vvmpud
Address 3: 10.10.19.3 my-test.5.btorxekfix4hcqh4v83dr0tzw

从centos容器内部,通过wget来访问my-test服务中运行的nginx网页服务器

root@4bdcce0ee63e:/# wget -O- my-test      
Connecting to my-test(10.10.19.2:80)
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Swarm的负载均衡器自动将HTTP请求路由到VIP上,然后到一个active的task容器上。它根据round-robin选择算法将后续的请求分发到另一个active的task上。

-----------------------------------为服务使用DNS round-robin-----------------------------
在创建服务时,可以配置服务直接使用DNS round-robin而无需使用VIP。这是通过在创建服务时指定 --endpoint-mode dnsrr 命令行参数实现的。当你想要使用自己的负载均衡器时可以使用这种方式。

如下示例(注意:使用DNS round-robin方式创建服务,不能直接在命令里使用-p指定端口)

$ docker service create --replicas 3 --name my-dnsrr-nginx --network ngx_net --endpoint-mode dnsrr nginx
$ docker service ps my-dnsrr-nginx
ID                         NAME              IMAGE  NODE          DESIRED STATE  CURRENT STATE          ERROR
65li2zbhxvvoaesndmwjokouj  my-dnsrr-nginx.1  nginx  node1         Running        Running 2 minutes ago 
5hjw7wm4xr877879m0ewjciuj  my-dnsrr-nginx.2  nginx  manager-node  Running        Running 2 minutes ago 
afo7acduge2qfy60e87liz557  my-dnsrr-nginx.3  nginx  manager-node  Running        Running 2 minutes ago

当通过服务名称查询DNS时,DNS服务返回所有任务容器的IP地址:

$ nslookup my-dnsrr-nginx 
Server:    127.0.0.11
Address 1: 127.0.0.11
Name:      my-dnsrr-nginx
Address 1: 10.10.19.10 my-dnsrr-nginx.3.0sm1n9o8hygzarv5t5eq46okn.my-network
Address 2: 10.10.19.9  my-dnsrr-nginx.2.b3o1uoa8m003b2kk0ytl9lawh.my-network
Address 3: 10.10.19.8  my-dnsrr-nginx.1.55za4c83jq9846rle6eigiq15.my-network

需要注意的是:一定要确认VIP的连通性。通常Docker官方推荐使用dig,nslookup或其它DNS查询工具来查询通过DNS对服务名的访问。因为VIP是逻辑IP,ping并不是确认VIP连通性的正确的工具。

单主机容器网络通信

不同网络间通信

不同网络之间加上路由就可以通信了。如果host上对每个网络都有一条路由,同时操作系统上打开了 ip forwarding,host就成了一个路由,挂接在不同网桥上的网络就能够相互通信。要看 docker host是否满足条件,通过 ip r 查看 host上的路由表:

$ ip r
default via 192.168.56.1 dev ens33 proto static metric 100 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1 
192.168.56.0/24 dev ens33 proto kernel scope link src 192.168.56.22 metric 100 

查看 ip forwarding是否开启:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1 #已开启

条件都满足,但为什么还不通?查看防火墙:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrlDZMX2-1599615266562)(…/…/%E6%8A%80%E6%9C%AF%E5%AE%9E%E8%B7%B5%E7%AC%94%E8%AE%B0/%E5%9F%BA%E4%BA%8EDocker%E6%8A%80%E6%9C%AF%E5%AE%9E%E8%B7%B5/assets/1545620914843.png)]

从规则的命名 DOCKER-ISOLATION可知 docker 在设计上就是要隔离不同的network。那要怎么样才能让不同网络之间通信呢?

答案是为要被访问的容器添加一块网卡,这个可以通过docker network connect命令来实,如下:

$ docker network connect 要访问容器的所属网络 被访问容器id or name

这样就在被访问容器中添加了一块网卡提供在不同网络的容器之间的通信。

容器间通信

容器之间可通过IP,Docker DNS Server或joined容器三种方式通信。

IP通信

从不同网络间通信可以得出这样一个结论:两个容器要能通信,必须要属于同一个网络的网卡,也即在同一个网络中。满足这个条件后,容器间可以通过IP交互。具体做法是在容器创建时通过 --network指定相应的网络,或者通过docker network connect将现有容器加入到指定网络。

Docker DNS Server通信

通过IP访问容器虽然满足了通信的需求,但还是不够灵活。因为在部署应用之前可能无法确定IP,部署之后再指定要访问的IP会比较麻烦。对于这个问题,可以通过docker自带的DNS服务解决。

从 Docker 1.10版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动容器时用 --name 为容器命名就可以了。

下面启动两个容器container1 和 container2:

$ docker run -it --network=my-net1 --name=container1 image docker run -it --network=my-net2 --name=container2 image

然后,container2 可以直接ping 到container1了。

使用Docker DNS有一个限制:只能在user-defined网络中使用。也就是说,默认的bridge网络是无法使用DNS的。

joined 容器

joined 容器是一种实现容器间通信的方式。

joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined容器之间可以通过127.0.0.1直接通信。

joined 容器非常适合以下场景:

(1)不同容器中的程序希望通过loopback高效地通信,比如 Web Server 与 App Server。

(2)希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

容器与外部通信

容器与外部通信涉及两个方向:一个是容器访问外部世界;另一个是外部世界访问容器。

容器访问外部世界

容器默认就能访问外网,前提是docker host能访问外网。

注意:这里指的外网是容器网络以外的网络环境,并非特指 Internet。

现象很简单,当更重要的是理解现象下的本质。

当位于docker0这个私有bridge网络中的容器,从容器向外ping时,数据包是怎么样到达外面的呢?

这里的关键就是NAT。查看docker host上的 iptables规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7c0nqMHb-1599615266564)(assets/1545624758398.png)]

我们可以通过 tcpdump 查看地址是如何转换的。先查看 docker host的路由表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jc58BksU-1599615266567)(assets/1545624849392.png)]

当在容器中 ping www.baidu.com 时,tcpdump输入如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L87xKPCu-1599615266569)(assets/1545625090391.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEJdMBiw-1599615266571)(assets/1545625135821.png)]

外部世界访问容器

外网如何访问到容器?答案是通过端口映射。可映射到动态端口亦可指定端口。查看端口映射命令:

$ docker port container id or name

每一个映射的端口,host都会启动一个docker-proxy进程来处理访问容器的流量。查看命令:

$ ps -ef | grep docker-proxy

访问过程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNbHZ1ce-1599615266572)(assets/1545625667156.png)]

以上都的单个主机内的容器网络通信。

跨主机容器网络通信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-celyiOZR-1599615266575)(assets/1545625858956.png)]

ln -s /var/run/docker/netns /var/run/netns

Service 之间如何通信?

微服务架构的应用由若干 service 组成。比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 service 运行了若干容器。在这样的架构中,service 之间是必然要通信的。

服务发现

一种实现方法是将所有 service 都 publish 出去,然后通过 routing mesh 访问。但明显的缺点是把 memcached 和 mysql 也暴露到外网,增加了安全隐患。

如果不 publish,那么 swarm 就要提供一种机制,能够:

  1. 让 service 通过简单的方法访问到其他 service。
  2. 当 service 副本的 IP 发生变化时,不会影响访问该 service 的其他 service。
  3. 当 service 的副本数发生变化时,不会影响访问该 service 的其他 service。

这其实就是服务发现(service discovery)。Docker Swarm 原生就提供了这项功能,通过服务发现,service 的使用者不需要知道 service 运行在哪里,IP 是多少,有多少个副本,就能与 service 通信。下面我们开始实践。

创建 overlay 网络

要使用服务发现,需要相互通信的 service 必须属于同一个 overlay 网络,所以我们先得创建一个新的 overlay 网络。

docker network create --driver overlay myapp_net

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cp3VKhTT-1599615266576)(assets/3f72f638e0.png)]

直接使用 ingress 行不行?

很遗憾,目前 ingress 没有提供服务发现,必须创建自己的 overlay 网络。

部署 service 到 overlay

部署一个 web 服务,并将其挂载到新创建的 overlay 网络。

docker service create --name my_web --replicas=3 --network myapp_net httpd

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MImFkgbZ-1599615266579)(assets/3f72e58e2a.png)]

部署一个 util 服务用于测试,挂载到同一个 overlay 网络。

docker service create --name util --network myapp_net busybox sleep 10000000

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Of29Ocb-1599615266581)(assets/3f72f1dc2f.png)]

sleep 10000000 的作用是保持 busybox 容器处于运行的状态,我们才能够进入到容器中访问 service my_web

验证

通过 docker service ps util 确认 util 所在的节点为 swarm-worker1。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0xSkLOa7-1599615266583)(assets/3f72fcdd1c.png)]

登录到 swarm-worker1,在容器 util.1 中 ping 服务 my_web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6a8zbiDg-1599615266584)(assets/3f731a840a.png)]

可以看到 my_web 的 IP 为 10.0.0.2,这是哪个副本的 IP 呢?

其实哪个副本的 IP 都不是。10.0.0.2my_web service 的 VIP(Virtual IP),swarm 会将对 VIP 的访问负载均衡到每一个副本。

我们可以执行下面的命令查看每个副本的 IP。

docker exec util.1.bpon0vvbgve6lz3fp08sgana6 nslookup tasks.my_web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XR9hmWdp-1599615266586)(assets/3f731abd62.png)]

10.0.0.310.0.0.410.0.0.5 才是各个副本自己的 IP。不过对于服务的使用者(这里是 util.1),根本不需要知道 my_web副本的 IP,也不需要知道 my_web 的 VIP,只需直接用 service 的名字 my_web 就能访问服务。

Service 的访问就讨论到这里,下一节我们学习 Rolling Update。

部署微服务

关键问题描述:
在swarm mode 集群中,所有服务都挂接到自定义的overlay网络上,但是在服务注册到eureka的时候,会出现服务A注册到eureka时候,有些服务A的实例使用ingress网络地址,有些服务A的实例使用自定义的overlay网络地址。使用ingress网络地址的服务A实例不能被其他服务访问,例如:

[10.255.0.17:10.255.0.17:8091][10.255.0.16:10.255.0.16:8091][0fba7e6f8db1:10.0.2.11:8091]
10.255.xx.xx的是ingress网络地址,不能被其他服务访问
10.0.2.xx的是自创的overlay网络地址,可以被其他服务访问
原因:
如果服务对外公布了端口,那么服务就会被挂接到ingress网络,因此服务会使用有多个网卡(ingress的,自定义网络的),所以在服务注册时,需要指定使用的网卡(或通过网段)来确保服务的可访问性。

解决方案:
1.创建overlay网络时,指定网段:
docker network create -d overlay --subnet 10.0.3.0/24 springcloud-overlay
1
2.微服务指定网段:
eureka.instance.prefer-ip-address=true
spring.cloud.inetutils.preferred-networks=10.0.3
1
2
相同的问题:

https://stackoverflow.com/questions/43903496/swarm-networking-and-spring-cloud-apps

作者:timedifier2
来源:CSDN
原文:https://blog.csdn.net/timedifier2/article/details/78135970
版权声明:本文为博主原创文章,转载请附上博文链接!

Docker 存储

storage diver

Data Volume

DatavVolume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Data Volume 有以下特点:

(1)Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。

(2)容器可读写 volume 中的数据。

(3)volume数据可以被永久的保存,即使使用它的容器已经销毁。

现在我们有数据层(镜像层和容器层)和 volume 都可以存放数据,具体使用的时候要怎么选择?考虑下面几个场景:

(1)Database 软件 VS Database 数据。

(2)Web 应用 VS 应用产生的日志。

(3)数据分析软件 VS input/output 数据。

(4)Apache Server VS 静态 HTML 文件。

我们应该做出的选择是:

(1)前者放在数据层中。因为这部分内容是无状态的,应该作为镜像的一部分。

(2)后者放在 Data Volume 中。这是需要持久化的数据,并且应该与镜像分开存放。

bind mount

bind mount 是将 host 已存在的目录或文件 mount 到容器。

bind mount 可以让 host 与容器共享数据。这中管理上非常方便。即使容器销毁也不会对数据产生影响。

bind mount 可以指定数据的读写权限,默认可读可写,可指定为读。如下:

$ docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs:ro httpd

ro 设置了只读权限,中容器中无法对 bind mount 数据进行修改。只有 host 有权修改数据,提高了安全性。

docker managed volume

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6dojLNd-1599615266588)(assets/1545639595700.png)]

数据共享

Swarm 集群使用 compose

正如之前使用 docker-compose.yml 来一次配置、启动多个容器,在 Swarm 集群中也可以使用 compose文件 (docker-compose.yml) 来配置、启动多个服务。

上一节中,我们使用 docker service create 一次只能部署一个服务,使用 docker-compose.yml 我们可以一次启动多个关联的服务。

我们以在 Swarm 集群中部署 WordPress 为例进行说明。

version: "3"services:wordpress:image: wordpressports:- 80:80networks:- overlayenvironment:WORDPRESS_DB_HOST: db:3306WORDPRESS_DB_USER: wordpressWORDPRESS_DB_PASSWORD: wordpressdeploy:mode: replicatedreplicas: 3db:image: mysqlnetworks:- overlayvolumes:- db-data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD: somewordpressMYSQL_DATABASE: wordpressMYSQL_USER: wordpressMYSQL_PASSWORD: wordpressdeploy:placement:constraints: [node.role == manager]visualizer:image: dockersamples/visualizer:stableports:- "8080:8080"stop_grace_period: 1m30svolumes:- "/var/run/docker.sock:/var/run/docker.sock"deploy:placement:constraints: [node.role == manager]volumes:db-data:
networks:overlay:

Swarm 集群管理节点新建该文件,其中的 visualizer 服务提供一个可视化页面,我们可以从浏览器中很直观的查看集群中各个服务的运行节点。

Swarm 集群中使用 docker-compose.yml 我们用 docker stack 命令,下面我们对该命令进行详细讲解。

部署服务

部署服务使用 docker stack deploy,其中 -c 参数指定 compose 文件名。

$ docker stack deploy -c docker-compose.yml wordpress

现在我们打开浏览器输入 任一节点IP:8080 即可看到各节点运行状态。如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIGUw7gG-1599615266589)(assets/wordpress.png)]

在浏览器新的标签页输入 任一节点IP 即可看到 WordPress 安装界面,安装完成之后,输入 任一节点IP 即可看到 WordPress 页面。

查看服务

$ docker stack ls
NAME                SERVICES
wordpress           3

移除服务

要移除服务,使用 docker stack down

$ docker stack down wordpress
Removing service wordpress_db
Removing service wordpress_visualizer
Removing service wordpress_wordpress
Removing network wordpress_overlay
Removing network wordpress_default

该命令不会移除服务所使用的 数据卷,如果你想移除数据卷请使用 docker volume rm

总结

总之,Swarm上手很简单,Docker swarm可以非常方便的创建类似kubernetes那样带有副本的服务,确保一定数量的容器运行,保证服务的高可用。
然而,光从官方文档来说,功能似乎又有些简单;

swarm、kubernetes、messos总体比较而言:
1)Swarm的优点和缺点都是使用标准的Docker接口,使用简单,容易集成到现有系统,但是更困难支持更复杂的调度,比如以定制接口方式定义的调度。
2)Kubernetes 是自成体系的管理工具,有自己的服务发现和复制,需要对现有应用的重新设计,但是能支持失败冗余和扩展系统。
3)Mesos是低级别 battle-hardened调度器,支持几种容器管理框架如Marathon, Kubernetes, and Swarm,现在Kubernetes和Mesos稳定性超过Swarm,在扩展性方面,Mesos已经被证明支持超大规模的系统,比如数百数千台主机,但是,如果你需要小的集群,比如少于一打数量的节点服务器数量,Mesos也许过于复杂了。

跨 docker host 部署

网络互通

docker swarm 集群跨主机网络通信

不同主机不同网络间通信

不同主机容器间通信。

集群环境不同主机间网络通信。

非集群环境下不主机间网络通信。

容器外部通信。通过对外暴露端口实现不同主机、不同网络、不同容器间通信。

创建overlay网络

为什么需要overlay 网络?保证多台机器不同容器之间通信!

$ docker network create --attachable --driver overlay ry-net

注:--attachable 参数为了兼容单机的容器可以加入此网络。

docker swarm 集群里面服务之间无法调用

1)部署operation-service 2个点后,到注册中心一看,只有一个点,地址是10.255.0.4,
2)进入容器发现有多个网卡,10.255.0.4这个网址在2个点都有,正确的应该是10.0.0.7

3)如何选择ip参考
http://www.mamicode.com/info-detail-1873672.html
具体的几个配置参考

spring-cloud-commons项目为Spring Cloud生态提供了顶层的抽象和基础设施的实现。
网络这个最基本的基础设施也是在这里有对应的实现:InetUtils、InetUtilsProperties和UtilAutoConfiguration提供了网络配置相关的功能。

spring-cloud-commons项目为Spring Cloud生态提供了顶层的抽象和基础设施的实现。 
网络这个最基本的基础设施也是在这里有对应的实现:InetUtils、InetUtilsProperties和UtilAutoConfiguration提供了网络配置相关的功能。spring.cloud.inetutils.default-hostname
spring.cloud.inetutils.default-ip-address
spring.cloud.inetutils.ignored-interfaces
spring.cloud.inetutils.preferred-networks
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces

需要解释一下的是ignored-interfaces和preferred-networks这两个配置。这两个配置决定了spring cloud应用在启动的时候所使用的网卡和IP地址。ignored-interfaces接收一个正则表达式数组,配置名字虽然是ignored-interfaces,忽略的网卡,但是因为其接收的是正则表达式,所以我们可以任意的选择和反选本机的网卡。preferred-networks是指倾向于使用的IP地址,接收一个正则表达式数组,用于选择Spring Cloud应用使用的本机的IP地址。通过这两个配置,我们可以任意指定Spring Cloud应用使用的网卡和IP地址。

4)最终一种巧妙的解决办法,配置ip选择参数:

spring.cloud.inetutils.preferred-networks=none 
#none或随便其它非ip字符串则导致一个都ip都匹配不上! 
#最终结果让其忽略所有网卡ip,这样最终会取本地host:InetAddress.getLocalHost(); 
#这个跟/etc/hosts 配置的一样,所以OK了。 附: 
#前缀匹配10.0.0开头的ip 
spring.cloud.inetutils.preferred-networks=10.0.0 
#正则允许所以ip 
spring.cloud.inetutils.preferred-networks=.+

健康检查与回滚

健康检查可以保证一个节点启动完毕才会启动另一个节点

$ docker service update –force –detach=false\ 
–health-cmd “curl –fail http://127.0.0.1:8820/startup-status?p=0 || exit 1” \ 
–health-interval 5s\ 
–health-retries=20 \ 
–health-timeout 2s\ 
gateway 

1)url必须返回0,表示成功;curl一般用127.0.0.1和内部端口,用实际ip不行(因为命令是在docker里面执行的 )
2)上面表示每5秒执行一次,每次2秒超时,一共尝试20次。 超时必须设置大一些,否则超时后会不断重启
3)如果url错误导致启动失败可以–no-healthcheck 恢复:
docker service update –force –detach=false –no-healthcheck gateway

加上回滚参数:

如下面把端口8820改成8830肯定curl是会失败,则会回滚:

$ docker service update  --force --detach=false\--health-cmd "curl --fail http://127.0.0.1:8830/startup-status?p=0  || exit 1" \--health-interval 5s\--health-retries=20 \--health-timeout 2s\--update-failure-action rollback\gateway

–update-failure-action Action on update failure (“pause”|”continue”|”rollback”)
缺省是paused

这个比–update-delay duration 保险,–update-delay 只是是两个点启动间隔,只是大概估计的时间,所以在健康检查上面的基础上加个几秒即可:–update-delay 5s

启动超时
加入健康检查后,如果重试若干次后超时,则会导致容器不断重启!!加入 restart-condition=none 来避免。

猜测:是app正常启动后有问题会触发update-failure-action;如果程序还没启动完就超时则触发restart-conditionjava

数据存储

数据存储分有状态和无状态数据存储,有状态数据根据实际情况统一放入镜像存储,有状态数据统一放入volume。

有状态数据的服务尽量不放入 docker swarm 集群,以避免带来数据维护的难度,在容器宕机、崩溃、升级、迁移、销毁过程中造成可能数据丢失的可能。

应用数据三种存储方式的选择:

第一种 bind mount。须要指明挂载源 mount src,该源在 docker host 必须存在。

第二种docker managed volume。不须要指明挂载源 mount src,只须要指明容器的挂载点即可。默认源在docker的数据卷目录:/var/lib/docker目录下。

第三种是云存储服务。数据存储到云端。

资源限制

根据资源要求限定内存和CPU。中发布部署微服务的时候可以限定服务的内存(MEMORY)、存储(BLOCK)和处理器(CPU)资源。

微服务结构划分

  • demo :demo微服务,它本身包含了两个模块,demo-api提供给第三方使用的接口;demo-service是服务的具体实现。
    为什么每个微服务多加了一层目录结构呢?因为从微服务职责划分来说,不同团队负责不同的微服务开发,每个微服务独立成项目,代码可以随时分离,不混合在一起。

  • client : 客户端调用服务。

  • 因为需要用到Feign,所以引入Feign依赖即可。
    **在pom文件中,还要引入spring-boot-thin-layout 一个很重要的maven插件。**因为spring boot 缺省是编译成fat jar(60m左右),而api是要打成jar包给第三方使用的,如果打成一个spring boot结构的fat jar,第三方肯定无法使用了,所以引入了这个maven插件,会把api打成一个我们普通使用的jar包(可能就10多K),这样才能真正实现接口跟逻辑分离的效果。

  • 调用服务。可以看到,在pom.xml 引入demo-api后,通过
    “@Autowired private Demo1Service demo1Service;” 方式,就像调用本地bean一样调用微服务。用户只要引入api jar包就行,不用关心服务部署在哪台机器,也不用care怎样拼接URL去调用服务,这是不是很符合java面向对象开发的要求?

  • 一个服务开发的流程是这样的:
    服务器端:在api模块定义服务接口,在service模块实现服务。
    客户端:直接依赖api jar包即可调用服务,无须了解调用服务器地址和具体的URL。

    例如对于user微服务,服务器端由user-api 和user-service两个模块,开发完后,user-api发布到maven服务器成user-api-1.0.0.jar;
    客户端直接依赖user-api-1.0.0.jar,引用服务接口就可以调用服务。
    注意user-api-1.0.0.jar是一个非常轻量级的jar包,只包含了interface和一些实体类定义,一般不会有微服务实现的代码逻辑。如果是使用这种方式的话,那hystrix配置在什么地方呢?

client 服务消费者。服务消费者负责对服务接口的消费,不关心接口如何实现。

api 服务接口。不关心服务具体的实现者与提供者或生产者是谁,只负责对外提供接口服务。

provider 服务实现与提供者或生产者。负责对接口的实现,即服务的实际生产者或提供者。负责业务逻辑的处理和数据的读写与存储。

参考资料

Docker集群管理工具-Kubernetes部署记录

http://www.cnblogs.com/kevingrace/p/6870359.html

生产环境中使用Docker Swarm的一些建议

https://blog.fundebug.com/2017/05/08/docker-swarm-suggestion/

Spring cloud + Swarm mode 实战二:部署微服务

https://blog.csdn.net/timedifier2/article/details/78135970

Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)

https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/Service_%E4%B9%8B%E9%97%B4%E5%A6%82%E4%BD%95%E9%80%9A%E4%BF%A1_%E6%AF%8F%E5%A4%A95%E5%88%86%E9%92%9F%E7%8E%A9%E8%BD%AC_Docker_%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF_101?lang=en

Docker Swarm容器集群管理工具

**

  • client : 客户端调用服务。

  • 因为需要用到Feign,所以引入Feign依赖即可。
    **在pom文件中,还要引入spring-boot-thin-layout 一个很重要的maven插件。**因为spring boot 缺省是编译成fat jar(60m左右),而api是要打成jar包给第三方使用的,如果打成一个spring boot结构的fat jar,第三方肯定无法使用了,所以引入了这个maven插件,会把api打成一个我们普通使用的jar包(可能就10多K),这样才能真正实现接口跟逻辑分离的效果。

  • 调用服务。可以看到,在pom.xml 引入demo-api后,通过
    “@Autowired private Demo1Service demo1Service;” 方式,就像调用本地bean一样调用微服务。用户只要引入api jar包就行,不用关心服务部署在哪台机器,也不用care怎样拼接URL去调用服务,这是不是很符合java面向对象开发的要求?

  • 一个服务开发的流程是这样的:
    服务器端:在api模块定义服务接口,在service模块实现服务。
    客户端:直接依赖api jar包即可调用服务,无须了解调用服务器地址和具体的URL。

    例如对于user微服务,服务器端由user-api 和user-service两个模块,开发完后,user-api发布到maven服务器成user-api-1.0.0.jar;
    客户端直接依赖user-api-1.0.0.jar,引用服务接口就可以调用服务。
    注意user-api-1.0.0.jar是一个非常轻量级的jar包,只包含了interface和一些实体类定义,一般不会有微服务实现的代码逻辑。如果是使用这种方式的话,那hystrix配置在什么地方呢?

client 服务消费者。服务消费者负责对服务接口的消费,不关心接口如何实现。

api 服务接口。不关心服务具体的实现者与提供者或生产者是谁,只负责对外提供接口服务。

provider 服务实现与提供者或生产者。负责对接口的实现,即服务的实际生产者或提供者。负责业务逻辑的处理和数据的读写与存储。

参考资料

Docker集群管理工具-Kubernetes部署记录

http://www.cnblogs.com/kevingrace/p/6870359.html

生产环境中使用Docker Swarm的一些建议

https://blog.fundebug.com/2017/05/08/docker-swarm-suggestion/

Spring cloud + Swarm mode 实战二:部署微服务

https://blog.csdn.net/timedifier2/article/details/78135970

Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)

https://www.ibm.com/developerworks/community/blogs/132cfa78-44b0-4376-85d0-d3096cd30d3f/entry/Service_%E4%B9%8B%E9%97%B4%E5%A6%82%E4%BD%95%E9%80%9A%E4%BF%A1_%E6%AF%8F%E5%A4%A95%E5%88%86%E9%92%9F%E7%8E%A9%E8%BD%AC_Docker_%E5%AE%B9%E5%99%A8%E6%8A%80%E6%9C%AF_101?lang=en

Docker Swarm容器集群管理工具

https://jiayi.space/post/docker-swarmrong-qi-ji-qun-guan-li-gong-ju

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2020烟花爆竹经营单位主要负责人考试及烟花爆竹经营单位主要负责人模拟考试软件

    题库来源:安全生产模拟考试一点通公众号小程序2020烟花爆竹经营单位主要负责人考试及烟花爆竹经营单位主要负责人模拟考试软件,包含烟花爆竹经营单位主要负责人考试答案解析及烟花爆竹经营单位主要负责人模拟考试软件练习。由安全生产模拟考试一点通公众号结合国家烟花爆竹经…...

    2024/4/28 3:20:42
  2. 云服务的基本知识

    云服务的基本知识1.云计算的演进企业IT架构的演进历史企业IT基础设施面临的痛点企业数字化转型面临的挑战云计算技术发展历程2.云计算的概念概念五大基本特质3.云服务的演进云计算发展阶段云计算的四类部署模式4.云服务的主要分类-按服务的层级5.云计算中的主流技术概念什么是虚…...

    2024/4/21 13:22:08
  3. 《闲扯Redis十一》Redis 有序集合对象底层实现

    一、前言Redis 提供了5种数据类型:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要。原文解析备注: 本节中涉及到的跳跃表实现,已经在上节《闲扯Redis十》Redis 跳跃表的结构实现一文中…...

    2024/3/22 19:37:41
  4. linux通过Nginx日志查询响应慢连接

    linux通过Nginx日志查询响应慢连接查询连接响应时间大于5秒cat /usr/local/nginx/logs/access.log | awk $6>5打印满连接语句tail -100000 /usr/local/nginx/logs/access.log | awk $6>5| awk {print "url地址="$13";请求目标="$9 ";资源大…...

    2024/4/28 4:18:00
  5. Python Data Analysis_移动平均值_statsmodels子库(ModuleNotFoundError: No module named ‘pandas.stats‘)

    移动平均值原始代码:import matplotlib.pyplot as plt import statsmodels.api as sm from pandas.stats.moments import rolling_meandata_loader = sm.datasets.sunspots.load_pandas() df = data_loader.data year_range = df["YEAR"].values plt.plot(year_rang…...

    2024/3/27 11:20:49
  6. Mybatis的进阶使用

    继上篇mybatis基础 https://blog.csdn.net/weixin_45262118/article/details/108482350 1.版本切换切换环境 (environment)<environments default="development">//dafault 默认使用的数据库id<environment id="development">//数据库id<tr…...

    2024/3/15 12:08:53
  7. 【Linux】Linux终端常用命令 -- 网络

    Linux终端常用命令 – 网络 网络 ping — 向网络上的主机发送应答请求ping [主机地址]telnet — 连接并登录到远程计算机Telnet 工具可以让我们连接并登录到远程计算机。 用法:telnet [主机地址]ftp — 文件上传下载 # 1、连接并登录远程主机 ftp [主机地址]# 2、接下来会提示…...

    2024/4/23 20:45:33
  8. CentOS系统下yum安装lnmp+wordpress

    本博客纯属本人编辑,如有雷同纯属巧合 一、安装mariadb、mariadb-server、nginx、php-fpm yum install -y mariadb mariadb-server nginx php-fpm 等待安装完成,启动服务 ** 二、编辑nginx配置文件 ** 首先要在/目录下创建/www目录 [root@localhost ~]# cat /etc/nginx/fastc…...

    2024/4/24 4:18:26
  9. LeetCode 39 组合总和 HERODING的LeetCode之路

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取。 说明: 所有数字(包括 target)都是正整数。 解集不能包含重复的组合。 示例 1: 输入:candidates = [2,3,6,…...

    2024/3/30 1:07:14
  10. TS:在对象中定义一个方法

    var myObj = {myMethod: function(params) {// ...do something}// 或者 这样写也可以myOtherMethod(params) {// ...do something else} };参考资料: TS官方文档...

    2024/4/22 5:00:04
  11. JAVA设计模式之生成器模式

    生成器模式 定义 将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示 结构与说明Builder: 生成器接口,定义创建一个Product对象所需的各个部件的操作。 ConcreteBuilder: 具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同…...

    2024/3/15 12:08:48
  12. Python中如何读取JSON内容

    Python中读取JSON主要用到load()和dump()方法,load()方法作用是将字符串(str)内容转换成JSON格式(list),直接按list方式读取即可。dump()方法是将JSON格式(list)转换成字符格式,这个刚好跟load()作用相反。实际应用中,我们读取的可能是从第三方读取到的数据,直接就是…...

    2024/4/27 2:46:48
  13. outlook设置数据文件位置

    HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook其中16.0表示Outlook的版本,是2016版15.0表示Outlook201314.0表示Outlook2010可能会在目录下找到14.0,15.0,16.0,请根据电脑中安装的Outlook版本来选择。注册表找到ForcePSTPath 输入数据位置...

    2024/3/15 12:08:45
  14. angular2 数组去重方法

    const newArr = Array.from(new Set(this.userDataSource)); this.userDataSource = newArr;...

    2024/3/27 20:19:45
  15. Vue3.0 composition-api的使用

    ref 接受一个参数值并返回一个响应式且可改变的ref对象1. ref对象拥有一个指向内部值的单一属性 .value2. 当ref在模板中使用的时候,他会自动解套,无需在模板内额外书写 .valueconst count = ref(0)const countAdd = ()=>{count.value ++}reactive 接收一个普通对象然后返…...

    2024/4/28 6:27:31
  16. 国标GB28181协议客户端EasyGBS视频平台设备正常情况下为什么无法播放ws-flv视频流?

    近几年,国家公安机关一直在强推国标GB28181协议,也有很多厂家积极响应号召,因此很多项目团队也想依托于国标GB28181协议来进行视频平台的搭建。EasyGBS是能够接入国标GB28181协议摄像头的视频平台,能够实现web浏览器、手机浏览器、微信、PC客户端等各种终端无插件播放。Eas…...

    2024/4/11 15:34:14
  17. Spring源码深度解析(郝佳)-学习-资源匹配-doMatch

    Spring中有一个这样的工具方法,在代码中很多的其他地方都用到过,比如资源加载,web url匹配,等 AntPathMatcher.java这个类的doMatch方法 那我们写一个main方法来测试一下 import org.springframework.util.StringUtils; import java.util.LinkedList; import java.util.Li…...

    2024/4/22 21:46:06
  18. 2020机修钳工(中级)复审模拟考试及机修钳工(中级)实操考试视频

    题库来源:安全生产模拟考试一点通公众号小程序2020机修钳工(中级)复审模拟考试及机修钳工(中级)实操考试视频,包含机修钳工(中级)复审模拟考试答案解析及机修钳工(中级)实操考试视频练习。由安全生产模拟考试一点通公众号结合国家机修钳工(中级)考试最新大纲及机修…...

    2024/3/15 12:08:41
  19. 2020金属非金属矿山安全检查(露天矿山)作业考试题库及金属非金属矿山安全检查(露天矿山)理论考试

    题库来源:安全生产模拟考试一点通公众号小程序2020金属非金属矿山安全检查(露天矿山)作业考试题库及金属非金属矿山安全检查(露天矿山)理论考试,包含金属非金属矿山安全检查(露天矿山)作业考试题库答案解析及金属非金属矿山安全检查(露天矿山)理论考试练习。由安全生…...

    2024/3/15 12:08:40
  20. 2020机修钳工(高级)模拟考试题库及机修钳工(高级)操作证考试

    题库来源:安全生产模拟考试一点通公众号小程序2020机修钳工(高级)模拟考试题库及机修钳工(高级)操作证考试,包含机修钳工(高级)模拟考试题库答案解析及机修钳工(高级)操作证考试练习。由安全生产模拟考试一点通公众号结合国家机修钳工(高级)考试最新大纲及机修钳工…...

    2024/4/12 0:44:02

最新文章

  1. 电脑的无用设置功能(建议关闭)

    目录 1、传递优化 ​2、常规​ 3、电源 1、传递优化 2、常规3、电源...

    2024/4/28 6:54:24
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. cocos 数字滚动、数字过渡动画

    代码&#xff1a; //数字滚动 let sdk: any { a: start_score, } tween(sdk).to(1, { a: this.score }, { progress: (start, end, current, time) > { // this.lab.string Math.round(start (end - start) * time) ;//修改页面上的值 // console.log(修改ing, start (…...

    2024/4/27 8:49:13
  4. 阿里云8核32G云服务器租用优惠价格表,包括腾讯云和京东云

    8核32G云服务器租用优惠价格表&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价&#xff0c;腾讯云和京东云是轻量应用服务器&#xff0c;阿里云是云服务器ECS&#xff1a; 阿里云8核32G服务器 阿里云8核32G服务器价格…...

    2024/4/27 22:33:10
  5. 从零开始一步一步掌握大语言模型---(2-什么是Token?)

    了解自然语言处理或者听说过大语言模型的同学都听过&#xff0c;token。一般来说&#xff0c;它代表的是语言中不可再分的最小单元。我们人类的语言不仅有文字&#xff0c;还有语音。针对文字、语音来说&#xff0c;它们都各自有不同的划分token的方法。本节将尽可能详细的介绍…...

    2024/4/24 22:35:21
  6. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/4/28 4:04:40
  7. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/4/27 3:39:11
  8. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/4/27 12:24:35
  9. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/4/27 12:24:46
  10. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/4/27 3:39:08
  11. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/4/27 3:39:07
  12. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/4/27 3:39:07
  13. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/4/27 12:44:49
  14. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/4/27 21:08:20
  15. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/4/26 22:35:59
  16. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/4/27 18:40:35
  17. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/4/28 4:14:21
  18. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/4/27 13:52:15
  19. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/4/27 13:38:13
  20. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/4/27 1:03:20
  21. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/4/27 3:22:12
  22. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/4/27 22:51:49
  23. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/4/27 3:39:00
  24. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/4/26 23:53:24
  25. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/4/27 20:28:35
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57