docker集群的详解以及超详细搭建

news2024/11/14 15:25:47

文章目录

  • 一、问题引入
    • 1. 多容器位于同一主机
    • 2. 多容器位于不同主机
  • 二、介绍
  • 三、特性
  • 四、概念
    • 1. 节点nodes
    • 2. 服务(service)和任务(task)
    • 3. 负载均衡
  • 五、docker网络
    • 1. overlay网络
  • 六、docker集群搭建
    • 1. 环境介绍
    • 2. 创建集群
    • 3. 集群网络
    • 4. 加入工作节点
  • 七、部署可视化界面portainer
    • 1. 部署单机模式
    • 2. 部署集群模式
  • 八、部署一个容器集群
    • 1. 拉取镜像
    • 2. 创建网络
    • 3. 创建服务
    • 4. 进入portainer查看busybox集群
    • 5. 不同节点间容器的通信
    • 6. 集群扩展

一、问题引入

在我们日常学习或开发过程中,如果我们的服务均采用docker容器的方式运行,比如提供后端接口服务的容器containerA和提供数据存取服务的容器containerB,如下图所示,不同的docker容器拥有各自的ip地址和端口号。

在这里插入图片描述

1. 多容器位于同一主机

本文假定一台主机只有一个docker进程。在这种情况下,容器AcontainerA和容器BcontainerB被同一个docker进程管理,容器之间的通信就可以通过目标容器ip+port进行直接访问,如下图所示

在这里插入图片描述

当容器AcontainerA需要和容器BcontainerB进行通信时,只需要在容器AcontainerA中通过172.18.0.2:3306即可完成通信。这种通信方式为同主机容器到容器的通信

这种方式有个较明显的缺点就是将容器限制在一台主机了。如果要求将容器分布在不同的主机,那这个方法就行不通了。

下面来看看将容器分布在不同的主机如何操作。

2. 多容器位于不同主机

但是在企业级项目部署中往往存在多个主机协同提供服务的情况。例如,我们的后端接口服务容器containerA位于主机AhostA中,数据存储容器containerB位于主机BhostB中,在这种情况下,我们为了方便省事,往往会将数据存储容器containerB的端口号(比如mysql的3306)映射到主机BhostB3306端口,当位于主机AhostA的后端接口服务容器containerA需要对数据进行操作时,通过主机A的ip:port对其数据存储容器containerB进行访问。如下图所示

在这里插入图片描述

在该示意图中,容器A要想与容器B通信,需要容器B将端口映射到宿主机hostB中,当连接主机B的3306端口时,根据映射规则,将访问请求转发到容器B中。这种通信方式为跨主机容器到主机再到容器的通信

这种方式虽然做到了将容器分布在不同的主机,但是仍暴露出一个缺点,目标容器的端口不得不挂载到宿主机对应端口,且目标容器宿主机的端口也不得不对外开放,万一该端口被不法分子扫描到进行攻击,那就GG了。

针对以上两个方式所暴露出的缺点,当我们既希望将容器分布在不同的主机,又希望不暴露宿主机端口而是直接通过容器的ip:port进行通信,docker官方推荐我们考虑一下集群环境

二、介绍

Swam是Docker引擎内置(原生)的集群管理和编排工具。Docker Swarm是Docker官方三剑客项目之一,提供 Docker容器集群服务,是Docker官方对容器云生态进行支持的核心方案。使用它,用户可以将多个Docker主机封装为单个大型的虚拟Docker主机,快速打造一套容器云平台。Swarm mode内置kv存储功能,提供了众多的新特性,比如:具有容错能力的去中心化设计内置服务发现负载均衡路由网格动态伸缩滚动更新安全传输等。使得Docker原生的 Swam集群具备与Mesos ,Kubernetes竞争的实力。

一个集群由多个Docker主机组成,这些主机以集群模式运行,充当管理者(管理成员资格和委托)和工作者(运行群服务)。一个给定的Docker主机可以是一个管理者manager、一个工作者worker,或者同时扮演这两个角色。创建服务时,您需要定义其最佳状态(副本数量、可用的网络和存储资源、服务对外开放的端口等)。Docker致力于保持这种理想状态。例如,如果一个工作节点变得不可用,Docker会将该节点的任务调度到其他节点上。任务是一个运行的容器,它是群服务的一部分,由群管理器管理,而不是一个独立的容器。

与独立容器相比,swarm服务的一个关键优势是,您可以修改服务的配置,包括它所连接的网络和卷,而无需手动重启服务。Docker将更新配置,停止使用过期配置的服务任务,并创建与所需配置匹配的新任务。

当Docker在swarm模式下运行时,您仍然可以在任何参与集群的Docker主机上运行独立的容器和swarm服务。独立容器和集群服务之间的一个关键区别是只有集群管理器可以管理集群,而独立容器可以在任何守护进程上启动。Docker守护进程可以作为管理人员、工作人员或两者参与到一个群体中。

三、特性

docker集群模式swarm mode为我们提供了非常丰富的特性来满足不同的场景需求。

  • 与Docker引擎集成的集群管理

    使用Docker Engine CLI创建一组Docker引擎,可以在其中部署应用程序服务。不需要额外的编排软件来创建或管理一个群体。这不就是打算和k8s杠一杠呢?

  • 去中心化设计

    Docker引擎在运行时处理任何专门化,而不是在部署时处理节点角色之间的差异。我们可以使用Docker引擎部署两种类型的节点,管理器和工作器。这意味着我们可以从单个磁盘映像构建整个swarm。

  • 声明式服务模型

    Docker引擎使用一种声明性的方法,让我们自定义应用程序堆栈中各种服务的期望状态。例如,我们可能会描述一个由带有消息队列服务的web前端服务和数据库后端组成的应用程序。

  • 动态伸缩

    对于每个服务,我们可以声明想要运行的任务数量。当扩大或缩小规模时,swarm manager会通过添加或删除任务来自动适应,以保持所需的状态。swarm manager节点持续监控集群状态,并协调实际状态和期望状态之间的任何差异。例如,如果我们设置一个服务来运行一个容器的10个副本,并且托管其中两个副本的工作机崩溃,管理器将创建两个新副本来替换崩溃的副本。群组管理器将新的副本分配给正在运行且可用的worker。

  • 多主机网络

    我们可以为服务指定叠加网络。当初始化或更新应用程序时,群管理器自动分配地址给覆盖网络上的容器。

  • 服务发现

    集群管理器节点为集群中的每个服务分配一个唯一的DNS名称和负载平衡运行容器。可以通过嵌入在swarm中的DNS服务器查询swarm中运行的每一个容器。

  • 负载均衡

    可以向外部负载平衡器公开服务端口。在内部,swarm允许我们指定如何在节点之间分发服务容器。

  • 安全传输

    群中的每个节点强制执行TLS相互认证和加密,以确保自身和所有其他节点之间的通信安全。我们可以选择使用自签名根证书或来自自定义根CA的证书。

  • 滚动更新

    在部署时,我们可以增量地将服务更新应用到节点。swarm manager允许您控制不同节点集的服务部署之间的延迟。如果出现任何问题,可以回滚到服务的前一个版本。

四、概念

在搭建docker集群之前,我们需要了解几个概念:节点(node)服务(service)任务(task)负载均衡(loadbalance)

1. 节点nodes

每个节点node都是docker集群中的每一个docker实例,当然也可以理解为运行docker进程的物理机。在集群中的所有节点中,又分为管理节点工作节点

  • 管理节点

    管理节点用于对docker集群的管理,对集群的操作命令都需要在管理节点中执行(例外:工作节点退出集群时需要在工作节点中执行退出命令),一个docker集群可以具有多个管理节点,在众多管理节点中通过raft协议选举出唯一一个leader节点

  • 工作节点

    工作节点接收并执行来自管理节点分发的任务(task),默认地,管理节点也可以同时具有工作节点的功能。

2. 服务(service)和任务(task)

服务是对任务的定义,而任务执行于管理节点或工作节点。服务是docker集群的中心结构,也是用户与swarm交互的主要介质。

  • 服务

    docker集群中的服务类似于微服务系统中的服务,一个服务是一个或多个实例的集合。而在docker集群中,一个服务我们可以理解为多个提供相同服务的docker容器的集合。

    在创建一个服务时,我们可以指定该服务使用的docker镜像,以及该服务能够创建的docker实例的副本数量。

    如在一个docker集群中,主机A中有两个容器:mysqlA和redisA,主机B中有两个容器:mysqlB和redisB,那么主机A中的mysqlA和主机B中的mysqlB属于同一个服务,主机A中的redisA和主机B中的redisB属于同一个服务,并且由管理节点实现对服务的管理(如同微服务系统中的注册中心),如下图所示

    在这里插入图片描述

  • 任务

    任务就是当我们需要调用集群中某一个服务时,管理节点从其管理的服务集合中找到该服务所对应的docker容器实例,然后向该实例指派一个任务,使其提供相应的服务。一旦任务被分配到某一个节点,则不允许再对其进行修改。

3. 负载均衡

当我们需要调用某一个服务时,管理节点自动对该服务所对应的节点进行负载均衡调用。例如微服务系统中服务注册中心的负载均衡机制。

五、docker网络

介绍完docker集群的概念,我们需要考虑一下在docker集群中,由于是多主机架构,那么什么样的网络驱动能使跨主机的容器相互通信呢?docker给我们提供的网络驱动有:bridgehostoverlaynoneipvlanmacvlan

  • bridge

    默认的网络驱动。适用于同一主机中docker容器之间的通信。

  • host

    移除docker容器与宿主机之间的网络隔离,直接使用宿主机的网络。

  • overlay

    该网络驱动允许多个主机之间的docker容器相互通信。

  • none

    脱机独立运行docker容器,无法与其他容器以及主机之间通信。

  • ipvlan

    把对ipv4和ipv6的ip地址的控制权完全交给我们。

  • macvlan

    允许我们对docker容器分配物理地址,使docker容器具有物理机表现。

在docker集群中我们使用overlay网络实现多主机内容器之间的相互通信。

1. overlay网络

overlay网络驱动在多个Docker主机之间创建分布式网络。这个网络位于(覆盖)特定于主机的网络之上,允许连接到它的容器(包括集群服务容器)在启用加密(TLS)时安全地通信。Docker透明地处理往返于正确的Docker守护进程主机和正确的目的地容器的每个分组的路由。

六、docker集群搭建

1. 环境介绍

  • 两台linux虚拟机

    操作系统主机名主机ipdocker版本
    CentOS7host10(管理节点)192.168.10.10v24.0.7
    CentOS7host20(工作节点)192.168.10.20v24.0.7
    CentOS7host30(工作节点)192.168.10.30v24.0.7

    docker版本必须大于v1.12.0,docker的集群模式是从该版本开始的,该版本发行于2016.07.28,现在都已经2023年了,我们直接安装最新版,还能避免许多bug。

  • 端口开放(或关闭防火墙

    2377/tcp:用于集群管理通信。

    7946/tcp、7946/udp:集群中各节点之间的通信。

    4789/udp:overlay网络使用。

    开放端口的命令如下

    # --permanent表示永久生效
    [root@host10 ~] firewall-cmd --zone=public --add-port=2377/tcp --permanent
    success
    [root@host10 ~] firewall-cmd --zone=public --add-port=7946/tcp --permanent
    success
    [root@host10 ~] firewall-cmd --zone=public --add-port=7946/udp --permanent
    success
    [root@host10 ~] firewall-cmd --zone=public --add-port=4789/udp --permanent
    success
    # 重新加载防火墙配置
    [root@host10 ~] firewall-cmd --reload
    success
    

    查看端口是否开放成功

    # 查看已开放的端口列表
    [root@host10 ~] firewall-cmd --zone=public --list-ports
    2377/tcp 7946/tcp 7946/udp 4789/udp
    

    关闭防火墙

    # 关闭防火墙
    [root@host10 ~] systemctl stop firewalld 
    # 开机禁用防火墙
    [root@host10 ~] systemctl disable firewalld 
    

2. 创建集群

在管理节点host10创建集群,使用以下命令

[root@host10 ~] docker swarm init --advertise-addr 192.168.10.10
# 输出
Swarm initialized: current node (0cibl244fqcmh7k6x8a3kwkfp) is now a manager.

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

    docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

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

--advertise-addr用于配置一个ip地址,集群中其他节点使用此ip地址与管理节点实现通信。

创建集群的节点默认为管理节点。

另外,在输出中包含以下命令,用于其他工作节点加入该集群

docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

如果需要加入管理节点,则使用下面命令

docker swarm join-token manager --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

注意:该token有效期为24小时。如果该token已过期,则可以使用下面命令重新获取

[root@host10 ~] docker swarm join-token worker

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

    docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

使用docker info查看当前集群的详细信息

[root@host10 ~] docker info

Client: Docker Engine - Community
 Version:    24.0.7
 Context:    default
 Debug Mode: false
 Plugins:
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.11.2
    Path:     /usr/libexec/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.21.0
    Path:     /usr/libexec/docker/cli-plugins/docker-compose

Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 4
 Server Version: 24.0.7
 Storage Driver: overlay2
  ......
 Swarm: active
  NodeID: 0cibl244fqcmh7k6x8a3kwkfp
  ......
  Raft:
   ......
  Dispatcher:
   Heartbeat Period: 5 seconds
  ......
很长很长

使用docker node ls查看当前集群中的各个节点信息

[root@host10 ~] docker node ls

ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
0cibl244fqcmh7k6x8a3kwkfp *   host10     Ready     Active         Leader           24.0.7

其中,*表示当前位于此节点中。

3. 集群网络

当我们在管理节点使用docker swarm init初始化一个docker集群时,docker默认会创建两个网络:

  • overlay驱动的网络,名称为ingress,该网络用于处理集群中各个服务之间的控制与数据传输。当我们创建服务service时,如果没有指定自定义的overlay网络,则默认使用ingress网络。
  • bridge驱动的网络,名称为docker_gwbridge,该网络用于维持集群中各个节点之间的连接。
[root@host10 docker-scripts]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
2d3e81dc418a   bridge            bridge    local
5675307b8b8d   docker_gwbridge   bridge    local
496c4eb3bb51   host              host      local
j4lsm97dkovz   ingress           overlay   swarm
69df9100d962   myBridge          bridge    local
e72b30a2ea15   none              null      local

4. 加入工作节点

我们把host20和host30作为工作节点,加入到该集群。复制上面的命令,分别到到host20和host30两台主机中中执行

[root@host20 ~] docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

This node joined a swarm as a worker.

[root@host30 ~] docker swarm join --token SWMTKN-1-0glmg3n472i4bbpxrynjw0z0uoa7lnxagcfcgnwg40dd3mu4ga-eazqx6idqvn954nfpumn2vob0 192.168.10.10:2377

This node joined a swarm as a worker.

恭喜,工作节点已加入到集群。


此时如果我们在host20节点中使用docker node ls查看当前集群中的各个节点信息,则会出现下面信息

[root@host20 ~] docker node ls

Error response from daemon: This node is not a swarm manager. Worker nodes can not be used to view or modify cluster state. Please run this command on a manager node or promote the current node to a manager.

说明该命令只允许在管理节点中使用。我们在host10(管理节点)中再次执行此命令

[root@host10 docker-scripts] docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
0cibl244fqcmh7k6x8a3kwkfp *   host10     Ready     Active         Leader           24.0.7
wfw312mxlolm6e8xgdwp6kndy     host20     Ready     Active                          24.0.7
rctru4fdjrv6y7gsh6i3ek2lp     host30     Ready     Active                          24.0.7

七、部署可视化界面portainer

现在集群已经搭建好了,下面我们使用portainer实现docker的可视化界面。

1. 部署单机模式

我们可以将portainer部署在docker集群的管理节点中,此时,portainer可以通过管理节点的docker进程实现对docker集群的可视化。

  • 管理节点拉取portainer的镜像

    docker pull portainer/portainer-ce:latest
    
  • 将portainer镜像运行为容器

    docker run \
        -p 8000:8000 \
        -p 9443:9443 \
        -v /var/run/docker.sock:/var/run/docker.sock \
        -v portainer_data:/data \
        --name my-portainer \
        -d \
        --privileged=true \
        --restart=always \
        portainer/portainer-ce:latest
    

    --privileged=true用于赋予该容器root权限。

  • 在浏览器访问https://192.168.10.10:9443,进入portainer创建页面。

    在这里插入图片描述

  • 创建用户以后,进入添加环境页面。有些朋友在这个页面没有Get Started选项,只有Add Environments选项。

    在这里插入图片描述

  • 点击Add Environments选项,添加一个docker环境。

    我们选择Standalone单机模式的docker环境,点击下方按钮对该环境配置。

    在这里插入图片描述

  • 配置环境。

    配置环境的方式有多种,通过AgentAPISocketEdge Agent Standard四种方式。我们以Socket方式为例,将该环境命名为host10-standard

    注意,该方式要求我们在运行portainer容器时添加挂载卷:-v /var/run/docker.sock:/var/run/docker.sock

    在这里插入图片描述

  • 环境配置完成后,点击portainer首页,就可以在环境列表中看到我们刚才添加的环境host1-standalone了。

    在这里插入图片描述

  • 点击该环境,查看其详细信息

    在这里插入图片描述

  • 点击Go to cluster visualizer查看docker集群

    在这里插入图片描述

2. 部署集群模式

portainer提供了以集群方式运行的能力,既然我们已经搭建好了具有三个节点的docker集群,那么我们尝试一下portainer的集群部署。

  • 管理节点下载部署文件

    curl -L https://downloads.portainer.io/ce2-19/portainer-agent-stack.yml -o portainer-agent-stack.yml
    

    该文件内容如下,主要就是根据镜像创建服务,以及挂载卷、网络配置、端口配置、副本配置等信息。

    version: '3.2'
    
    services:
      agent:
        image: portainer/agent:2.19.3
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /var/lib/docker/volumes:/var/lib/docker/volumes
        networks:
          - agent_network
        deploy:
          mode: global
          placement:
            constraints: [node.platform.os == linux]
    
      portainer:
        image: portainer/portainer-ce:2.19.3
        command: -H tcp://tasks.agent:9001 --tlsskipverify
        ports:
          - "9443:9443"
          - "9000:9000"
          - "8000:8000"
        volumes:
          - portainer_data:/data
        networks:
          - agent_network
        deploy:
          mode: replicated
          replicas: 1
          placement:
            constraints: [node.role == manager]
    
    networks:
      agent_network:
        driver: overlay
        attachable: true
    
    volumes:
      portainer_data:
    

    但是我们需要对该文件内容中agent部分增加一个端口挂载的配置,否则在后面创建环境时会因为连接失败而无法创建环境

    services:
      agent:
        image: portainer/agent:2.19.3
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /var/lib/docker/volumes:/var/lib/docker/volumes
        ports:
          - "9001:9001"
        networks:
          - agent_network
        deploy:
          mode: global
          placement:
            constraints: [node.platform.os == linux]
    
  • 管理节点部署portainer集群

    [root@host10 portainer]# docker stack deploy -c portainer-agent-stack.yml portainer
    
    Creating network portainer_agent_network
    Creating service portainer_agent
    Creating service portainer_portainer
    

    可以看到,创建了一个网络portainer_agent_network、两个服务portainer_agentportainer_portainer

  • 任意节点查看网络,创建了一个overlay驱动的网络portainer_agent_network该网络会在集群中各个节点创建

    [root@host10 portainer]# docker network ls
    
    NETWORK ID     NAME                      DRIVER    SCOPE
    2d3e81dc418a   bridge                    bridge    local
    5675307b8b8d   docker_gwbridge           bridge    local
    496c4eb3bb51   host                      host      local
    j4lsm97dkovz   ingress                   overlay   swarm
    69df9100d962   myBridge                  bridge    local
    e72b30a2ea15   none                      null      local
    54cnuprrj5e4   portainer_agent_network   overlay   swarm
    
  • 管理节点查看服务。

    [root@host10 portainer]# docker service ls
    
    ID             NAME                  MODE         REPLICAS   IMAGE                           PORTS
    mrjnxf734cki   portainer_agent       global       3/3        portainer/agent:2.19.3          
    tfgkmlb6rwwk   portainer_portainer   replicated   1/1        portainer/portainer-ce:2.19.3   *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp
    
  • 管理节点查看容器。

    [root@host10 portainer]# docker ps
    
    CONTAINER ID   IMAGE                           COMMAND                   CREATED         STATUS         PORTS                          NAMES
    d6d497046594   portainer/agent:2.19.3          "./agent"                 4 minutes ago   Up 4 minutes                                  portainer_agent.0cibl244fqcmh7k6x8a3kwkfp.k3f1gkysdu64718ml6zm5cuzg
    
    8742edf0f3b7   portainer/portainer-ce:2.19.3   "/portainer -H tcp:/…"   4 minutes ago   Up 4 minutes   8000/tcp, 9000/tcp, 9443/tcp   portainer_portainer.1.otjp9rsp17v8f4l6u2ma1mg7a
    
  • 工作节点查看容器。与管理节点不同的是,工作节点只创建了portainer/agent容器,它是由管理节点在集群中创建的副本容器。

    [root@host20 ~]# docker ps
    
    CONTAINER ID   IMAGE                    COMMAND     CREATED         STATUS         PORTS     NAMES
    0e090ff0133d   portainer/agent:2.19.3   "./agent"   5 minutes ago   Up 5 minutes             portainer_agent.wfw312mxlolm6e8xgdwp6kndy.iputjhsv1q8yudkv6i760e694
    
  • 在浏览器访问https://192.168.10.10:9443,进入portainer页面。

    部署单击模式不同的是,在选择环境类型时,我们应选择集群模式如下图所示

    在这里插入图片描述

  • 配置环境。

    这次我们选择通过Agent的方式配置环境的连接。

    在这里插入图片描述

  • 完成配置后,在环境列表可以看到我们创建的portainer集群环境。

    在这里插入图片描述

  • 点击进入该环境,查看详细信息

    在这里插入图片描述

  • 进入集群页面,可以看到,我们在管理节点上部署的portainer容器根据服务的副本配置,在工作节点上也建立了相同的portainer容器副本。

    在这里插入图片描述

八、部署一个容器集群

我们以创建busybox镜像的容器为例,创建docker容器集群。

1. 拉取镜像

管理节点中使用以下命令拉取镜像

docker pull busybox

2. 创建网络

管理节点中创建一个overlay驱动的网络

[root@host10 ~]# docker network create -d overlay --attachable busybox_overlay_network
zjwmzvwlf4fgisos37i5876s9

注意,在集群环境中创建overlay驱动网络时,一定要添加参数--attachable为了集群容器或单机容器与运行在其他节点中的容器建立通信

3. 创建服务

管理节点中创建服务

docker service create -td --name busybox_service --network busybox_overlay_network --replicas=2 busybox
  • --replicas=2表示需要创建两个busybox容器的副本
  • --network busybox_overlay_network表示使用我们在上面创建的网络

4. 进入portainer查看busybox集群

在这里插入图片描述

在容器列表页面可以看到busybox容器的集群,可以看到,两个busybox容器分别位于host20host30节点,ip地址分别为10.0.3.22410.0.3.225

在这里插入图片描述

5. 不同节点间容器的通信

对于busybox容器集群的情况如下

主机容器ip地址
host2010.0.3.225
host3010.0.3.224

下面我们进入host20主机的busybox容器,去ping位于host30主机中的busybox容器,可以ping通,反之相同。

在这里插入图片描述

6. 集群扩展

上面我们创建busybox容器集群时,设置其副本数量为2--replicas=2,现在我们通过portainer对副本数量进行修改为3。

在这里插入图片描述

现在再看一下集群页面,可以发现busybox容器已扩展到三个节点,如下图所示

在这里插入图片描述

到这里docker集群的入门搭建过程就结束了。



纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

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

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

相关文章

Python多线程优化:提升程序性能的实例

更多Python学习内容:ipengtao.com 大家好,我是涛哥,今天为大家分享 Python多线程优化:提升程序性能的实例,全文5600字,阅读大约16钟。 多线程是一种有效的并发编程方式,能够提高程序的性能。本文…

基于Java SSM框架实现KTV点歌系统项目【项目源码+论文说明】

基于java的SSM框架实现KTV点歌系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个KTV点歌系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述KTV点歌系…

【模电】放大电路的性能指标

放大电路的性能指标 放大倍数输入电阻输出电阻通频带非线性失真系数最大不失真输出电压最大输出功率与效率 下图所示为放大电路的示意图。 对于信号而言,任何一个放大电路均可看成一个两端口网络。左边为输入端口,当内阻为 R s R\tiny s Rs的正弦波信号…

C语言练习记录(蓝桥杯练习)(小蓝数点)

目录 小蓝数点 第一题程序的输出结果是?: 第二题下面代码的执行结果是什么?: 第三题下面代码的执行结果是什么?: 第四题关于关系操作符说法错误的是?: 第五题对于下面代码段,y的值为? 第六题sum 21 …

Microsoft Expression Web - 网页布局

在本章中,我们将介绍网页的基本布局。在创建我们的网页布局之前,我们需要考虑我们的内容,然后设计我们希望如何呈现该内容,因为它是在我们的网站上可见的内容。 由我们如何呈现我们的内容,以便我们的观众找到我们的网…

人工智能概论

一、关键技术 人工智能包含了七项关键技术: 1. 机器学习: 机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,是人工智能技术的核心。 从学习模式划分,分…

Redis:主从复制

目录 概念配置步骤通过命令配置主从复制原理薪火相传反客为主哨兵(Sentinel)模式原理配置SpringBoot整合Sentinel模式 概念 主机更新后根据配置和策略,自动同步到备机的master/slave机制,Master以写为主,Slave以读为主。 作用: …

DCDC前馈电容与RC串并联电路

一、RC串并联电路特性分析 1、RC串联电路 RC 串联的转折频率: f01/(2πR1C1),当输入信号频率大于 f0 时,整个 RC 串联电路总的阻抗基本不变了,其大小等于 R1。 2、RC并联电路 RC 并联电路的转折频率&…

【Linux基础开发工具】yum生态vim的配置与使用

目录 前言 1. Linux 软件包管理器 yum 1.1 什么是yum 1.2 快速上手yum 1.3 yum生态 2. Linux编辑器vim 2.1 vim的模式 2.2 vim使用技巧 3. vim编辑器辅助功能配置 3.1 配置 3.2 用户sudo权限配置 总结 前言 Linux基础指令与权限之后,Linux系统开发工具的使用…

[操作系统] 文件管理

文章目录 5.1 磁盘调度算法1. 先来先服务算法( First Come First Served, FCFS) 算法2. 最短寻道时间优先算法( Shortest Seek Time First, SSTF) 算法3. 扫描算法( SCAN ) 算法4. 循环扫描算法( Circular Scan, CSCAN ) 算法5. LOOK 与 CLOOK 算法 5.2 进程写文件时&#xff0…

2023.11.27 使用anoconda搭建tensorflow环境

2023.11.27 使用anoconda搭建tensorflow环境 提供一个简便安装tensorflow的方法 1. 首先安装anoconda,安装过程略,注意安装的时候勾选安装anoconda prompt 2. 进入anoconda prompt 3. 建立python版本 conda create -n tensorflow1 python3.84. 激活t…

BUUCTF [ACTF新生赛2020]swp 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 密文: 下载附件,得到一个.tar文件。 解题思路: 1、使用WinRAR解压.tar文件,得到两个.zip文件。 解压wget.zip文件,得…

如何有效的进行 E2E

一、前言 本文作者介绍了什么是E2E测试以及E2E测试测什么,并从对于被测系统、测试用例、测试自动化工具、测试者四个方面的要求,介绍了如何保证E2E测试有效性,干货满满,值得学习。 二、什么是E2E测试 相信每一个对自动化测试感…

MySQL图书管理系统(49-94)源码

-- 九、 子查询 -- 无关子查询 -- 比较子查询&#xff1a;能确切知道子查询返回的是单值时&#xff0c;可以用>&#xff0c;<&#xff0c;&#xff0c;>&#xff0c;<&#xff0c;!或<>等比较运算符。 -- 49、 查询与“俞心怡”在同一个部门的读者的借…

Python VIP 付费漫画,无需充值随便霍霍,零基础也能学会!

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 环境使用: Python 3.10 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块 …

【开源】基于Vue+SpringBoot的独居老人物资配送系统

项目编号&#xff1a; S 045 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S045&#xff0c;文末获取源码。} 项目编号&#xff1a;S045&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询社区4…

Embedding压缩之hash embedding

在之前的两篇文章 CTR特征重要性建模&#xff1a;FiBiNet&FiBiNet模型、CTR特征建模&#xff1a;ContextNet & MaskNet中&#xff0c;阐述了特征建模的重要性&#xff0c;并且介绍了一些微博在特征建模方面的研究实践&#xff0c;再次以下面这张图引出今天的主题&#…

销售客户分配管理细则

随着市场竞争的不断加剧&#xff0c;销售团队的有效管理变得愈发重要。其中&#xff0c;客户分配是销售团队成功的关键之一。一个科学合理的销售客户分配管理细则不仅可以提高销售团队的整体工作效率&#xff0c;还能够优化客户体验&#xff0c;促使销售业绩持续增长。下面是一…

Jmeter接口测试:jmeter_逻辑控制器_随机控制器随机顺序控制器

随机控制器 当该控制器下有多个子项时&#xff0c;每次循环会随机执行其中一个 Ignore sub-controller block&#xff08;忽略子控制器模块&#xff09; 如果勾选了此项&#xff0c;随机控制器下的子控制器中的多个子项只会被执行一个 随机顺序控制器 当该控制器下有多个子项…

5. 文件属性和目录

5. 文件属性和目录 1. Linux 系统的文件类型1.1 普通文件1.2 目录文件1.3 字符设备文件和块设备文件1.4 符号链接文件1.5 管道文件1.6 套接字文件 2. stat 系统调用2.1 struct stat 结构体2.2 st_mode 变量2.3 struct timespec 结构体 3. fstat 和 lstat 函数3.1 fstat 函数3.2…