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

云原生(五)、Docker-Swarm集群

基础环境说明

1、环境准备

1、启动4台服务器(在同一个网段内)。
2、重命名4台服务器,方便区分。

hostnamectl set-hostname swarm1
reboot

请添加图片描述

安装docker。参考文章:云原生(二)、Docker基础

2、DockerSwarm架构

在 Docker 中,Swarm 是一种容器编排工具,它允许用户在一个集群中管理多个 Docker 容器。Docker Swarm 允许您将多个 Docker 守护进程组织成一个虚拟的 Docker 引擎,这个引擎可以用来部署您的容器化应用程序。通过 Docker Swarm,您可以轻松地管理、扩展和调度容器,以便适应不同规模的工作负载。

Docker Swarm 提供了以下主要功能:

  1. 服务编排: 允许您定义和管理多个服务,并将它们部署到 Swarm 集群中的节点上。
  2. 高可用性: Docker Swarm 提供了高可用性的容器服务,如果某个节点出现故障,Swarm 将会重新分配容器到其他可用节点上,从而保证您的应用程序的可用性。
  3. 负载均衡: Swarm 提供内置的负载均衡功能,可以将流量分发到集群中运行的容器服务上。
  4. 自动扩展: Swarm 允许您根据工作负载的需求自动扩展容器服务,以应对流量的变化。
  5. 安全性: Docker Swarm 提供了各种安全特性,包括 TLS 加密、角色基础访问控制(RBAC)等,以保护您的集群和容器。

官网地址: https://docs.docker.com/engine/swarm/how-swarm-mode-works/nodes/

管理节点Manage与工作节点Worker。他们遵循高可用协议Raft,即保证大多数节点存活才能使用,在这里,就是需要2台及以上的Mange节点存活。
请添加图片描述

3、搭建集群环境

1、初始化第一个节点

使用命令docker swarm init --advertise-addr ip

[root@swarm1 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/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 host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether fa:16:3e:0f:69:6a brd ff:ff:ff:ff:ff:ffinet 192.168.2.3/20 brd 192.168.15.255 scope global dynamic noprefixroute eth0valid_lft 315355602sec preferred_lft 315355602secinet6 fe80::f816:3eff:fe0f:696a/64 scope link valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:57:f2:17:06 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:57ff:fef2:1706/64 scope link valid_lft forever preferred_lft forever#暴露第一个节点 
[root@swarm1 ~]# docker swarm init --advertise-addr 192.168.2.3
Swarm initialized: current node (hi3e42klj5okwv48u13e9phmd) is now a manager.#添加工作节点的命令
To add a worker to this swarm, run the following command:docker swarm join --token SWMTKN-1-0ac1f68fpc9c7laupcj53q7sgp650m5204ll4snj8npi8hl4x6-eqjzl0u227agfl3pe6mrk8r8m 192.168.2.3:2377#添加管理节点的命令
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2、将第二台服务器加入工作节点

在第二台服务器中,使用第一步中得到的token命令

[root@swarm2 ~]# docker swarm join --token SWMTKN-1-0ac1f68fpc9c7laupcj53q7sgp650m5204ll4snj8npi8hl4x6-eqjzl0u227agfl3pe6mrk8r8m 192.168.2.3:2377
This node joined a swarm as a worker.
3、将第三台服务器加入管理节点

在第一台服务器中,使用第一步中的添加管理节点命令

[root@swarm1 ~]# docker swarm join-token manager
To add a manager to this swarm, run the following command:docker swarm join --token SWMTKN-1-0ac1f68fpc9c7laupcj53q7sgp650m5204ll4snj8npi8hl4x6-cr4cg020fta2etrxqc72zs3el 192.168.2.3:2377

得到token命令后,在第三台服务器中使用该命令

[root@swarm3 ~]# docker swarm join --token SWMTKN-1-0ac1f68fpc9c7laupcj53q7sgp650m5204ll4snj8npi8hl4x6-cr4cg020fta2etrxqc72zs3el 192.168.2.3:2377
This node joined a swarm as a manager.
[root@swarm3 ~]# 
4、第四台服务器加入管理节点
[root@swarm4 ~]# docker swarm join --token SWMTKN-1-0ac1f68fpc9c7laupcj53q7sgp650m5204ll4snj8npi8hl4x6-cr4cg020fta2etrxqc72zs3el 192.168.2.3:2377
This node joined a swarm as a manager.
5、检查集群部署结果

在管理者节点中使用命令

Leader即主节点,Reachable为子节点

[root@swarm4 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
hi3e42klj5okwv48u13e9phmd     swarm1     Ready     Active         Leader           25.0.4
h9hjplib3dsql1k8v2x2qutax     swarm2     Ready     Active                          25.0.4
seozhuxajbfkwu95d9ox14uej     swarm3     Ready     Active         Reachable        25.0.4
8vxwp3m4sk24hhkethpd6axxs *   swarm4     Ready     Active         Reachable        25.0.4
6、注意

如果加入集群时,当前服务器已经存在一个集群了,需要先离开当前集群,才能加入新的

docker swarm leave --force

4、Raft协议理解

Raft协议是一种共识算法,用于在分布式系统中实现一致性。它通过确保所有节点在某个时刻对系统状态达成一致,从而保证系统的可靠性和正确性。Raft协议由Diego Ongaro和John Ousterhout在2014年提出,并设计用于替代Paxos算法,以简化分布式系统的实现和理解。

在Raft协议中,系统中的节点被分为领导者(leader)、跟随者(follower)和候选人(candidate)。领导者负责接收客户端请求并复制状态到其他节点,而跟随者和候选人则遵从领导者的指示。如果领导者失效,系统中的其他节点可以通过选举新的领导者来维持一致性。

Raft协议通过简化算法和引入领导者的概念,使得其更易于理解和实现。这种可理解性使得Raft成为了分布式系统领域中备受青睐的共识算法之一,被广泛应用于诸如分布式数据库、分布式存储系统等领域。

我们上面的环境搭建中,采用的是3管理节点,1工作节点的方式。

如果是双主双从搭建,现在我们只有两个管理节点,如果一个节点挂了,另外一个节点也不能用,Raft一致性算法,是确保大多数节点存活才可以用,至少大于1台! 生产环境最少3 manager

实验

我们拥有3台管理节点,分别是swarm1、swarm3、swarm4,其中Leader节点是swarm1,1台工作节点swarm2.

在我们上面搭建好的集群中,使用命令systemctl stop docker让服务器中的docker停止工作。观察Raft的选举和工作状态

sudo systemctl stop docker	#停止docker
sudo systemctl start docker #启动docker
测试1
  • 停止swarm2,在其他管理节点执行docker node ls,集群仍然存活,工作节点swarm2状态为down
[root@swarm3 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
hi3e42klj5okwv48u13e9phmd     swarm1     Ready     Active         Reachable        25.0.4
h9hjplib3dsql1k8v2x2qutax     swarm2     Down      Active                          25.0.4
seozhuxajbfkwu95d9ox14uej *   swarm3     Ready     Active         Reachable        25.0.4
8vxwp3m4sk24hhkethpd6axxs     swarm4     Ready     Active         Leader           25.0.4
测试2
  • 停止swarm3,在其他管理节点执行docker node ls,集群仍然存活
[root@swarm4 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
hi3e42klj5okwv48u13e9phmd     swarm1     Ready     Active         Leader           25.0.4
h9hjplib3dsql1k8v2x2qutax     swarm2     Ready     Active                          25.0.4
seozhuxajbfkwu95d9ox14uej     swarm3     Down      Active         Unreachable      25.0.4
8vxwp3m4sk24hhkethpd6axxs *   swarm4     Ready     Active         Reachable        25.0.4
  • 再停止swarm4,在其他管理节点执行docker node ls,集群停止工作
[root@swarm4 ~]# docker node ls
Error response from daemon: rpc error: code = DeadlineExceeded desc = context deadline exceeded
测试3

一开始就直接停止Leader节点swarm1,在其他管理节点执行docker node ls,集群仍然存活。推举出了新的Leader

[root@swarm4 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
hi3e42klj5okwv48u13e9phmd     swarm1     Ready     Active         Unreachable           25.0.4
h9hjplib3dsql1k8v2x2qutax     swarm2     Ready     Active                          25.0.4
seozhuxajbfkwu95d9ox14uej     swarm3     Down      Active         Leader      25.0.4
8vxwp3m4sk24hhkethpd6axxs *   swarm4     Ready     Active         Reachable        25.0.4
测试4
  • 停止swarm3,在其他管理节点执行docker node ls,集群仍然存活
[root@swarm4 ~]# docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
hi3e42klj5okwv48u13e9phmd     swarm1     Ready     Active         Leader           25.0.4
h9hjplib3dsql1k8v2x2qutax     swarm2     Ready     Active                          25.0.4
seozhuxajbfkwu95d9ox14uej     swarm3     Down      Active         Unreachable      25.0.4
8vxwp3m4sk24hhkethpd6axxs *   swarm4     Ready     Active         Reachable        25.0.4
  • 再停止swarm1,在其他管理节点执行docker node ls,集群停止工作。且由于Leader节点停止工作,集群无法再次重启。只能重新初始化集群设置。
[root@swarm3 ~]# docker node ls
Error response from daemon: rpc error: code = Unknown desc = The swarm does not have a leader. It's possible that too few managers are online. Make sure more than half of the managers are online.
总结

1、先保证有两个管理节点,挂掉其中一台。nodels 命名不可用
2、如果有work节点离开了,状态会更新为down,不可用了
3、可以没有Work节点,全是管理节点
4、leader挂了,就全部都挂掉了

Raft保证:至少要保证有两个及两个以上的管理者节点,集群才可以使用,否则直接挂掉

所有管理者节点挂掉的话。需要全部移除集群,重新初始化才可以再次使用了

5、swarm实战

示例1

Nginx集群部署。

#在任意manage节点执行命令 
[root@swarm1 ~]# docker service create -p 8888:80 --name myNginx nginx
sxa1g4p45k268e6do9td0y2ie
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@swarm1 ~]# docker service ls
ID             NAME      MODE         REPLICAS   IMAGE          PORTS
sxa1g4p45k26   myNginx   replicated   1/1        nginx:latest   *:8888->80/tcp# 成功后我们会发现,4台服务器的ip:8888都能成功访问nginx的初始页面。
# 通过docker service启动服务,在任何服务器都可以访问到该服务,不需要在启动容器的节点中访问。

查看我们刚刚部署的nginx的具体信息

[root@swarm1 ~]# docker service inspect --pretty myNginxID:             sxa1g4p45k268e6do9td0y2ie
Name:           myNginx
#副本数量
Service Mode:   ReplicatedReplicas:      1     
Placement:
UpdateConfig:Parallelism:   1On failure:    pauseMonitoring Period: 5sMax failure ratio: 0Update order:      stop-first
RollbackConfig:Parallelism:   1On failure:    pauseMonitoring Period: 5sMax failure ratio: 0Rollback order:    stop-first
ContainerSpec:Image:         nginx:latest@sha256:1a53eb723d17523512bd25c27299046cfa034cce309f4ed330c943a304513f59Init:          false
Resources:
Endpoint Mode:  vip
Ports:PublishedPort = 8888Protocol = tcpTargetPort = 80PublishMode = ingress 
动态扩缩容
  • 创建时启动多个副本
docker service create  --replicas 3 --name myNginx1 nginx
  • 动态更新

docker service update --replicas 3 myNginx

[root@swarm1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
sxa1g4p45k26   myNginx    replicated   1/1        nginx:latest   *:8888->80/tcp
vsk8icrao3bk   myNginx1   replicated   3/3        nginx:latest   
[root@swarm1 ~]# docker service update --replicas 3 myNginx
myNginx
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
[root@swarm1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
sxa1g4p45k26   myNginx    replicated   3/3        nginx:latest   *:8888->80/tcp
vsk8icrao3bk   myNginx1   replicated   3/3        nginx:latest
  • 扩缩容
docker service scale myNginx1 =6
  • 回滚

docker service rollback myNginx

[root@swarm1 ~]# docker service rollback myNginx
myNginx
rollback: manually requested rollback 
overall progress: rolling back update: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 
[root@swarm1 ~]# docker service ls
ID             NAME       MODE         REPLICAS   IMAGE          PORTS
sxa1g4p45k26   myNginx    replicated   1/1        nginx:latest   *:8888->80/tcp
vsk8icrao3bk   myNginx1   replicated   3/3        nginx:latest  #线上灰度发布的原理
[root@swarm1 ~]# docker service update --image nginx:1.18.0-alpine --update-parallelism 1 --update-delay 10s myNginx1
myNginx1
overall progress: 1 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: preparing [=================================>                 ] 
3/3:   
#一台一台机器逐次启动,直到所有容器更新完成
#docker service update --help 查看帮助
示例2
  • 创建一个集群网络
docker network create -d overlay tomcat-net
  • 创建service
docker service create --name tomcat --network tomcat-net -p 8080:8080 --replicas 3 tomcat
  • 扩缩容
docker service scale tomcat=6
  • 删除服务
docker service rm id
#服务一旦移除,所有容器都会被移除
示例3
  • 创建网络
docker network create -d overlay demo
  • 创建mysql服务
rootanode111 ~]# docker service create --name mysql --env MYSQL_ROOT_PASSWORD=root --env MYSQL_DATABASE=wordpress --network demo --mount type=volume,source=mysql-data,destination=/var/lib/mysql mysql:5.7.24
  • 创建wordpress服务
[root@node111 ~]# docker service create --name wordpress -p 80:80 --env WORDPRESS_DB_USER=root --env WORDPRESS_DB_PASSWORD=root --env WORDPRESS_DB_HOST=mysql:3306 --env WORDPRESS_DB_NAME=wordpress --network demo wordpress

成功后,4台服务器的ip:80都能访问到我们的wordpress。
在这里插入图片描述

我们也可以对刚刚运行的2个服务进行动态扩缩容

[root@swarm1 ~]# docker service scale mysql=4
mysql scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] [root@swarm1 ~]# docker service scale wordpress=4
wordpress scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 

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

  • Ingress模式(overlay网络)下,到达Swarm任可节点的8080端口的流量,都会映射到任何服务副本的J部80端口,就算该节点上没有tomcat服务副本也会映射;
  • Host模式下,仅在运行有容器副本的机器上开放端口访问,使用Host模式的命令如下:
docker service create --name tomcat
--network tomcat-net
--publish published=8080,target=8080,modehost
--replicas 2
tomcat:7.0.96-jdk8-openjdk
docker service ps tomcat

6、swarm相关概念

  • 1.Docker Engine集成集群管理
    使用Docker Engine Cll 创建一个Docker Engine的swarm模式,在集群中部署应用程序服务。链接数以万计的docker节点。
  • 2.去中心化设计
    Swarm角色分为Manager和Worker节点,Manager节点故障不影响应用使用,raft协议原则。
  • 3.扩容缩容
    可以声明每个服务运行的容器数量,通过添加或删除容器数自动调整期望的状态。
  • 4.期望状态协调
    Swarm Manager节点不断监视集群状态,并调整当前状态与期望状态之间的差异。例如,设置一个服务运行10个副本容器,如果两个副本的服务器节点崩溃,Manager将创建两个新的副本替代崩溃的副本。并将新的副本分配到可用的worker节点。
  • 5.多主机网络
    可以为服务指定overlay网络。当初始化或更新应用程序时,Swarm manager会自动为overlay网络上的容器分配IP地址。
  • 6.服务发现
    Swarm manager节点为集群中的每个服务分配唯一的DNS记录和负载均衡VIP。可以通过Swarm内置的DNS服务器查询集群中每个运行的容器。
  • 7.负载均衡
    实现服务副本负载均衡,提供入口访问。也可以将服务入口暴露给外部负载均衡器再次负载均衡。
  • 8.安全传输
    Swarm中的每个节点使用TLS相互验证和加密,确保安全的其他节点通信。
  • 9.滚动更新
    升级时,逐步将应用服务更新到节点,如果出现问题,可以将任务回滚到先前版本
工作模式

在这里插入图片描述

服务副本与全局服务

在docker swarm中部署的service,有2种类型。

  • replicated(副本)
  • global(全局)启动一个服务,会在所有节点上,自动拉起一个容器

下面的图显示了一个有3个副本的service(黄色)和一个global的service(灰色)在这里插入图片描述
请添加图片描述

 --mode string     Service mode ("replicated", "global", "replicated-job", "global-job") (default "replicated")

补充Label的说明

#我们讨论了 service 部署的两种模式:global mode 和 replicated mode。无论采用 global mode 还是 replicated mode,副本运行在哪些节点都是由 Swarm 决定的,作为用户我们有没有可能精细控制 service 的运行位置呢?
答:能,使用 1abe1

逻辑分两步:
1、为每个 node 定义 label.
2、设置 service 运行在指定 label的 node 上.

docker node update --label-add env=test 节点1
docker node update --label-add env=prod swarm-worker2#指定在哪台服务器中拉起这个服务。很少使用docker service create \--constraint node.labels jenv-=test \--replicas 3\--name my_web--publish 8080:80 \httpd#更新 service,将其迁移到生产环境:
docker service update --constraint-rm node.labels.env==test my_web
docker service update --constraint-add node.labels.env==prod my_weh

7、网络概念说明

https://docs.docker.com/engine/swarm/ingress/

在 Swarm Seryice 中有三个重要的网络概念!

  • Overlay networks 管理 Swarm 中 Docker守护进程间的通信。你可以将服务附加到一个或多个己存在的网络上,使得服务与服overlay务之间能够通信。

  • ingress network是一个特殊的网络,用于服务节点间的负载均衡:启动多个服务,访问的时候随机分配到一个服务器中。当任何 Swarm 节点在发布的端口上接收到请求时,它将该请overlayX求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有IP地址,选择其中的一个,并通过ingress 网络将请求路由到它。

    初始化或加入 Swarm 集群时会自动创建 ingress 网络,大多数情况下,用户不需要自定义配置。但是 docker 17.05 和更高版本允许你自定义。

  • docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress网络)连接到一个单独的Docker 守护进程的物理网络。默认情况下,服务正在运行的每个容器都连接到本地 docker 守护进程主机的 docker_gwbridge 网络。

    docker_gwbridge网络在初始化或加入 Swarm 时自动创建。大多数情况下,用户不需要自定义配置,但是 Docker 允许自定义。

说明

  • docker_gwbridge和ingress是swarm自动(别建的,当用户执行了docker swarm init/connect之后

  • docker_gwbridge是bridge类型的负责本机container和主机直接的连接
    间的路由。

  • ingress负责service在多个主机container之

  • custom-network是用户自己创建的overla网络,通常我们都需要创建自己的network并把service挂在上面ingress网络。

vip(虚拟ip模式)

请添加图片描述

8、DokcerStack

单机:docker run 、docker compose

集群:docker service DockerStack

我们了解了Docker compose,它是用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是不能在分布式多机器上使用;我们也介绍了Docker swarm,它构建了docker集群,并且可以通过docker service在不同集群节点上运行容器服务,但是缺点是不能同时编排多个服务。
单机模式下,我们可以使用 Docker Compose 来编排多个服务,而 Docker Swarm 只能实现对单个服务 的简单部署。通过 Docker Stack,我们只需对已有的 docker-cmpose.yml 配置文件稍加改造就可以完成 Docker 身群环境下的多服务编排。

但是在实际的生产开发中,我们一个完整的应用需要的服务往往不止一个,通过docker service 命令来部署的话会很麻烦,所以这里要讲一下Docker Stack,它用于向swarm集群部署完整的应用程序堆栈,可以在分布式多机器上同时编排多个有依赖关系的服务。
Stack能够在单个声明文件中定义复杂的多服务应用。还提供了简单的方式来部署应用并管理其完整的生命周期:初始化部署 ->健康检查 ->扩容->更新->回滚,以及其他功能!可以简单地理解iStack是集群下的Compose。

# 单机
docker compose up -d -c wordpress-compose.yaml#集群
docker stack deploy wordpress-compose.yaml
实战

https://gitee.com/landylee007/voting-app?_from=gitee_search

这是一个开源的投票app,包含以下服务

  • 5个应用服务:vote、redisworker、db、result
  • 工具服务:vi、sua、lizer

首先创建一个docker-compose.yml文件,使用docker compose v3语法

docker stack deploy --compose-file docker-stack.yml vote
docker stack rm vote
# 项目中的docker-stack.yml文件,需要稍作修改,添加数据库初始用户信息
#    environment:
#      POSTGRES_USER: "postgres"
#      POSTGRES_PASSWORD: "postgres"
#      POSTGRES_HOST_AUTH_METHOD: "trust"
# 报错yaml: line 18: found character that cannot start any token ,解决:注意yml文件中不识别tab制表符
version: "3"
services:redis:image: redis:alpinenetworks:- frontenddeploy:replicas: 1update_config:parallelism: 2delay: 10srestart_policy:condition: on-failuredb:image: postgres:9.4environment:POSTGRES_USER: "postgres"POSTGRES_PASSWORD: "postgres"POSTGRES_HOST_AUTH_METHOD: "trust"volumes:- db-data:/var/lib/postgresql/datanetworks:- backenddeploy:placement:constraints: [node.role == manager]vote:image: dockersamples/examplevotingapp_vote:beforeports:- 5000:80networks:- frontenddepends_on:- redisdeploy:replicas: 2update_config:parallelism: 2restart_policy:condition: on-failureresult:image: dockersamples/examplevotingapp_result:beforeports:- 5001:80networks:- backenddepends_on:- dbdeploy:replicas: 1update_config:parallelism: 2delay: 10srestart_policy:condition: on-failureworker:image: dockersamples/examplevotingapp_workernetworks:- frontend- backenddepends_on:  - db- redisdeploy:mode: replicatedreplicas: 1labels: [APP=VOTING]restart_policy:condition: on-failuredelay: 10smax_attempts: 3window: 120splacement: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]networks:frontend:backend:volumes:db-data:

详细的部署流程

这里我们使用集群部署

docker stack deploy --compose-file docker-stack.yml vote

请添加图片描述

部署成功后,通过ip访问

请添加图片描述
请添加图片描述

Docker Stack和 Compose区别
  • Docker stack会忽略了“构建”指令,无法使用stack命令构建新镜像,它是需要镜像是预先已经构建好的。所以docker-compose更适合于开发场景;
  • 它使用Docker API规范来操作容器。所以需要安装Docker-compose,以便与Docker-起DockerCompose是一个Python项目,在内部在您的计算机上使用;
  • Docker Stack功能包含在Docker引擎中。你不需要安装额外的包来使用它,docker stacks 只是swarm mode的一部分。
  • Dockerstack不支持基于第2版写的docker-compose.yml,也就是version版本至少为3。然而Docker Compose对版本为2和3的文件仍然可以处理
  • docker stack把docker compose的所有工作老做完了,因此docker stack将占主导地位。同时,对于大多数用户来说,切换到使用dockerstack既不困难,也不需要太多的开销。如果是Docker新手,或正在选择用于新项目的技术,请使用docker stack.

9、DockerSecret&Config

Docker Secret 是 Docker 容器中存储敏感数据的一种机制。它们用于安全地存储和传输诸如密码、API 密钥、TLS 证书等敏感信息,以供容器应用程序使用。Docker Secret 是 Docker Swarm 和 Docker Compose 中的功能,用于将敏感数据传递给容器,并确保这些数据在容器中的使用是安全可靠的。

Docker Secret 的工作原理是将敏感数据存储在一个受 Docker 本地安全机制保护的地方,并将其传递给容器。在 Swarm 中,Secret 以加密的方式存储在 Swarm 中的 Raft 日志中,并且只有具有适当权限的服务才能访问它们。在 Compose 中,Secret 存储在本地的 Docker 配置目录中,也是以加密的方式存储。

使用 Docker Secret,可以更安全地管理敏感信息,避免将其硬编码到容器镜像中,从而提高了容器化应用程序的安全性和可移植性。

用法

要使用 Docker Secret,您可以按照以下步骤:

  1. 创建 Docker Secret:首先,您需要创建一个 Docker Secret。您可以使用 docker secret create 命令来创建一个新的 Secret。例如:
echo "my_secret_data" | docker secret create my_secret_data -

上述命令将创建一个名为 my_secret_data 的 Secret,并将其值设置为 “my_secret_data”。

  1. 将 Secret 添加到服务中:一旦您创建了 Secret,您可以将其添加到 Docker 服务中。在 Docker Swarm 中,您可以使用 --secret 标志将 Secret 添加到服务中。例如:
docker service create --name myservice --secret my_secret_data my_image

在 Docker Compose 中,您可以在 docker-compose.yml 文件中使用 secrets 关键字指定 Secret。例如:

version: '3.8'services:myservice:image: my_imagesecrets:- my_secret_data
  1. 在容器中使用 Secret:一旦将 Secret 添加到服务中,您可以在容器中使用它。容器可以通过文件或环境变量访问 Secret 的值。

    • 通过文件:在容器内,Secret 会被挂载到文件系统上的某个位置。例如,在 Linux 上,默认路径为 /run/secrets/<secret_name>。您可以在容器中读取此文件来获取 Secret 的值。
    • 通过环境变量:Docker 还会将 Secret 的值以环境变量的形式传递给容器。环境变量的名称将是 Secret 的名称。例如,如果 Secret 名称为 my_secret_data,则环境变量名称将为 MY_SECRET_DATA

总结

到这里dokcer的集群通信的逻辑就完结了,但是Docker Swarm仍旧只是匆匆过客,最终还是需要回到Kuberness上!

相关文章:

云原生(五)、Docker-Swarm集群

基础环境说明 1、环境准备 1、启动4台服务器&#xff08;在同一个网段内&#xff09;。 2、重命名4台服务器&#xff0c;方便区分。 hostnamectl set-hostname swarm1 reboot安装docker。参考文章&#xff1a;云原生&#xff08;二&#xff09;、Docker基础 2、DockerSwarm…...

arm核的DMPIS是如何计算的

直接看这篇&#xff1a;https://zhuanlan.zhihu.com/p/660155292 写的很好&#xff1a; "SA8155P的CPU算力计算如下&#xff08;按照A75性能提升50%来计算&#xff0c;即 5.2 * 1.5 7.8 DMIPS/MHz &#xff09; SA8155P算力 2.419GHz * 1核 * 7.8 DMIPS/MHz 2.131GH…...

Axure RP 9 for Mac中文激活版:原型设计工具

Axure RP 9 for Mac是一款值得设计师信赖的原型设计工具。它以其卓越的性能和稳定的运行赢得了广大用户的赞誉。 软件下载&#xff1a;Axure RP 9 for Mac中文激活版下载 在Axure RP 9中&#xff0c;您可以尽情发挥自己的设计才华&#xff0c;创造出独一无二的原型作品。无论是…...

Hive 数据迁移与备份

迁移类型 同时迁移表及其数据&#xff08;使用import和export&#xff09; 迁移步骤 将表和数据从 Hive 导出到 HDFS将表和数据从 HDFS 导出到本地服务器将表和数据从本地服务器复制到目标服务器将表和数据从目标服务器上传到目标 HDFS将表和数据从目标 HDFS 上传到目标 Hiv…...

FFMpeg 获取音频音量、提高音量

查看音量 准备原生音频original.mp3 查看original.mp3的音量信息&#xff1a; ffmpeg -i original.mp3 -filter_complex volumedetect -c:v copy -f null /dev/null输出&#xff1a; Input #0, mp3, from original.mp3:Metadata:artist : Administratorencoder …...

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌&#xff1a;每个人抓的牌放到哪里&#xff1a; 源码具体实现cardcardsTest 个人简介&#xff1a;努力学编程 每日鸡汤&#xff1a;stay foolish,stay hungry-史蒂芬.乔布斯斯…...

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第八:trans_func class

# 生态学研究人员通常对微生物群落的功能特征感兴趣&#xff0c;因为功能或代谢数据对于解释微生物群落的结构和动态以及推断其潜在机制是强有力的。 # 由于宏基因组测序复杂且昂贵&#xff0c;利用扩增子测序数据预测功能谱是一个很好的选择。 # 有几个软件经常用于此目标&…...

王道c语言-二叉树前序、中序、后序、层次遍历

main.cpp #include "function.h"//abdhiejcfg 前序遍历深度优先遍历 abdhiejcfg void PreOrder(BiTree p) {if (p ! NULL) {printf("%c ", p->c);//等价于putchar(p->c);等价于visit函数伪代码PreOrder(p->lchild);PreOrder(p->rchild);} }//…...

<REAL-TIME TRAFFIC OBJECT DETCTION FOR AUTONOMOUS DRIVING>论文阅读

Abstract 随着计算机视觉的最新进展&#xff0c;自动驾驶迟早成为现代社会的一部分&#xff0c;然而&#xff0c;仍有大量的问题需要解决。尽管现代计算机视觉技术展现了优越的性能&#xff0c;他们倾向于将精度优先于效率&#xff0c;这是实时应用的一个重要方面。大型目标检测…...

优化 - 排序算法

一、概念 冒泡排序从左往右比较相邻的两个元素&#xff0c;右比左小就换位&#xff0c;这样最大值就出现在了右边最后一个元素上&#xff0c;再从左边第一个元素开始往右比较到倒数第二个元素&#xff0c;如此重复...选择排序 通过线性查找&#xff08;从左往右挨个查找&#…...

Python实战:深拷贝与浅拷贝

1. 引言 在Python中&#xff0c;对象是通过对内存中的数据进行引用来实现的。当我们创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是将这个对象的引用复制给了另一个变量。这意味着&#xff0c;如果原始对象发生改变&#xff0c;引用该对象的变量也会受到影响。为了…...

rollup打包起手式

使用Rollup打包JavaScript rollup是一款小巧的javascript模块打包工具&#xff0c;更适合于库应用的构建工具;可以将小块代码编译成大块复杂的代码&#xff0c;基于ES6 modules,它可以让你的 bundle 最小化&#xff0c;有效减少文件请求大小,vue在开发的时候用的是webpack,但是…...

【笔记】语言实例比较 3. 无重复字符的最长子串 C++ Rust Java Python

语言实例比较 3. 无重复字符的最长子串 C Rust Java Python C C: 9ms O ( N 2 ) O(N^2) O(N2), 8.68MB mem O ( 1 ) O(1) O(1) 滑动窗口循环 class Solution { public:int lengthOfLongestSubstring(const string s) {//s[start,end) 前面包含 后面不包含int res(0);for (…...

int的大小你知道时4个字节,那么类的大小你知道怎么计算吗?

文章目录 1、如何计算类对象的大小2、类对象的存储方式猜测3、结构体内存对齐规则1、如何计算类对象的大小 class A { public: void PrintA() { cout<<_a<<endl; } private: char _a; };问题: 类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了…...

OpenCV学习笔记(十一)——利用Sobel算子计算梯度

Sobel算子是基于一阶导数的离散差分算子&#xff0c;其中Sobel对于像素值的变化是十分敏感的&#xff0c;在进行边缘检测的时候&#xff0c;Sobel算子常用于对周围像素的重要性进行检测。 Sobel算子包括检验水平方向的算子和检测竖直方向的算子 计算机梯度值的操作如下&#x…...

扩展一下BenchmarkSQL,新增支持ASE/HANA/DB2/SQLServer,可以随便用了

1 背景 提到数据库的性能,自然就避不开性能测试。有专用于测试OLTP的,也有偏重于OLAP的。本文介绍的BenchmarkSQL就属于测试OLTP中的一个,基于TPCC的。网上有很多介绍TPC*的相关测试的文章,大家可以自行脑补。而PostgreSQL自带的pgbench是属于TPCC的前一个基准测试程序,偏…...

Android 静默安装成功后自启动

近期开发上线一个常驻app&#xff0c;项目已上线&#xff0c;今天随笔记录一下静默安装相关内容。我分三篇静默安装&#xff08;root版&#xff09;、静默安装&#xff08;无障碍版&#xff09;、监听系统更新、卸载、安装。 先说说我的项目需求&#xff1a;要求app一直运行&am…...

计算机二级真题讲解每日一题:《format格式化》

描述 在右侧答题模板中修改代码&#xff0c;删除代码中的横线&#xff0c;填写代码&#xff0c;完成如下功能。 接收用户输入的一个小于 20的正整数&#xff0c;在屏幕上逐行递增显示从 01 到该正整数&#xff0c;数字显示的宽度为 2&#xff0c;不足位置补 0&#xff0c;后面追…...

RabbitMQ问题

如何实现顺序消费&#xff1f; 消息放入到同一个队列中消费 如何解决消息不丢失&#xff1f; 方案&#xff1a; 如上图&#xff1a;消息丢失有三种情况&#xff0c;解决了以上三种情况就解决了丢失的问题 1、丢失1--->消息在到达交换机的时候&#xff1b;解决&#xff1…...

flutter->Scaffold左侧/右侧侧边栏和UserAccountsDrawerHeader的使用

//appBar的 leading/actions 和 Scaffold的drawer/endDrawer 冲突只能存在一个 import package:flutter/material.dart;void main() {runApp(MyApp()); }class MyApp extends StatelessWidget {const MyApp({super.key});overrideWidget build(BuildContext context) {retur…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置&#xff1a;遍历整个矩阵&#xff0c;找出所有值为 0 的元素&#xff0c;并将它们的坐标记录在数组zeroPosition中置零操作&#xff1a;遍历记录的所有 0 元素位置&#xff0c;将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…...