Docker学习十:Docker Swarm

2023-05-16

一、Swarm介绍

Swarm 是 Docker 官方推出的容器集群管理工具,最大的优势之一就是原生支持 Docker API,原来的 Docker 用户可以很方便地将服务迁移到 Swarm 中来。

Swarm 还内置了对 Docker 网络插件的支持,因此用户可以很方便地部署需要跨主机通信的容器集群。

除此之外,Swarm还有以下优点:

  • 分布式: Swarm 使用Raft(一种分布式一致性协议)协议来做集群间数据一致性保障,使用多个容器节点组成管理集群,从而避免单点故障。
  • 安全: Swarm 使用 TLS 双向认证来确保节点之间通信的安全,它可以利用双向 TLS 进行节点之间的身份认证,角色授权和加密传输,并且可以自动执行证书的颁发和更换。
  • 简单: Swarm 的操作非常简单,并且除 Docker 外基本无其他外部依赖,而且从 Docker 1.12 版本后, Swarm 直接被内置到了 Docker 中,可以说真正做到了开箱即用。

1. Swarm 的架构

Swarm 的架构整体分为管理节点(Manager Nodes)和工作节点(Worker Nodes):

  • 管理节点: 管理节点负责接受用户的请求,用户的请求中包含用户定义的容器运行状态描述,然后 Swarm 负责调度和管理容器,并且努力达到用户所期望的状态。
  • 工作节点: 工作节点运行执行器(Executor),负责执行具体的容器管理任务(Task),例如容器的启动、停止、删除等操作。
image.png

2. 核心概念

a. Swarm 集群

一组被 Swarm 统一管理和调度的节点,被 Swarm纳管的节点可以是物理机或者虚拟机。其中一部分节点作为管理节点,负责集群状态的管理和协调,另一部分作为工作节点,负责执行具体的任务来管理容器,实现用户服务的启停等功能。

b. 节点

Swarm 集群中的每一台物理机或者虚拟机称为节点。节点按照工作职责分为管理节点和工作节点,管理节点由于需要使用 Raft 协议来协商节点状态,生产环境中通常建议将管理节点的数量设置为奇数个,一般为 3 个、5 个或 7 个。

c. 服务

服务是为了支持容器编排所提出的概念,它是一系列复杂容器环境互相协作的统称。一个服务的声明通常包含容器的启动方式、启动的副本数、环境变量、存储、配置、网络等一系列配置,用户通过声明一个服务,将它交给 Swarm,Swarm 负责将用户声明的服务实现。

服务分为全局服务(global services)和副本服务(replicated services):

  • 全局服务:每个工作节点上都会运行一个任务,类似于 Kubernetes 中的 Daemonset。
  • 副本服务:按照指定的副本数在整个集群中调度运行。
d. 任务

集群中的最小调度单位,它包含一个真正运行中的 Docker 容器。当管理节点根据服务中声明的副本数将任务调度到节点时,任务则开始在该节点启动和运行,当节点出现异常时,任务会运行失败。此时调度器会把失败的任务重新调度到其他正常的节点上正常运行,以确保运行中的容器副本数满足用户所期望的副本数。

e. 服务外部访问

由于容器的 IP 只能在集群内部访问到,而且容器又是用后马上销毁,这样容器的 IP 也会动态变化,因此容器集群内部的服务想要被集群外部的用户访问到,服务必须要映射到主机上的固定端口。

Swarm 使用入口负载均衡(ingress load balancing)的模式将服务暴露在主机上,该模式下,每一个服务会被分配一个公开端口(PublishedPort),你可以指定使用某个未被占用的公开端口,也可以让 Swarm 自动分配一个。

Swarm 集群的公开端口可以从集群内的任意节点上访问到,当请求达到集群中的一个节点时,如果该节点没有要请求的服务,则会将请求转发到实际运行该服务的节点上,从而响应用户的请求。

二、搭建Swarm 集群

前提条件:

  • Docker 版本大于 1.12,推荐使用最新稳定版 Docker;
  • 主机需要开放一些端口(TCP:2377 UDP:4789 TCP 和 UDP:7946)。
  • 生产环境中推荐使用至少三个 manager 作为管理节点

1. 初始化集群

为了简化,这里仅是有一个manager管理节点

# 初始化 Swarm集群
docker swarm init --advertise-addr <YOUR-IP>
Swarm initialized: current node (1ehtnlcf3emncktgjzpoux5ga) is now a manager.

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

    docker swarm join --token SWMTKN-1-1kal5b1iozbfmnnhx3kjfd3y6yqcjjjpcftrlg69pm2g8hw5vx-8j4l0t2is9ok9jwwc3tovtxbp 192.168.31.100:2377

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

# advertise-addr 一般用于主机有多块网卡的情况,如果你的主机只有一块网卡,可以忽略此参数
# 打印信息中,提示了如何把一台主机加入集群成为工作节点

2. 加入工作节点

# 复制初始化集群时,提示的加入工作节点命令,分别在工作节点上执行
$ docker swarm join --token SWMTKN-1-1kal5b1iozbfmnnhx3kjfd3y6yqcjjjpcftrlg69pm2g8hw5vx-8j4l0t2is9ok9jwwc3tovtxbp 192.168.31.100:2377
This node joined a swarm as a worker.

# 如果是生产环境,可以使用docker swarm join-token manager命令来查看如何加入管理节点
$ docker swarm join-to ken manager
To add a manager to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-1kal5b1iozbfmnnhx3kjfd3y6yqcjjjpcftrlg69pm2g8hw5vx-8fq89jxo2axwggryvom5a337t 192.168.31.100:2377

# 复制 Swarm 输出的结果即可加入管理节点到集群中

3. 节点查看

# 查看当前节点的状态
$ ]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
1ehtnlcf3emncktgjzpoux5ga *   swarm-manager       Ready               Active              Leader              19.03.12
pn7gdm847sfzydqhcv3vma97y *   swarm-node1         Ready               Active                                        19.03.12
4dtc9pw5quyjs5yf25ccgr8uh *   swarm-node2         Ready               Active                                        19.03.12
est7ww3gngna4u7td22g9m2k5 *   swarm-node3         Ready               Active                                        19.03.12
# 当前集群包含 1 个管理节点,3 个工作节点

三、使用 Swarm

1. 通过 docker service 命令创建服务

# 创建服务
$ docker service create --replicas 1 --name hello-world nginx
24f9ng83m9sq4ml3e92k4g5by
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

# 查看已经启动的服务
$ docker service ls
ID                  NAME                  MODE                REPLICAS            IMAGE               PORTS
24f9ng83m9sq        hello-world           replicated          1/1                 nginx:latest

# 删除服务
$ docker service rm hello-world
hello-world

更多的docker service命令的相关操作,可以参考这里。

2. 通过 docker stack 命令创建服务

修改前述章节提到的docker-compose 的模板文件,添加了deploy 指令,并且指定使用副本服务(replicated)的方式启动两个 WordPress 实例

version: '3'

services:
   mysql:
     image: mysql:5.7
     volumes:
       - mysql_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: mywordpress
       MYSQL_USER: mywordpress
       MYSQL_PASSWORD: mywordpress

   wordpress:
     depends_on:
       - mysql
     image: wordpress:php7.4
     deploy:
       mode: replicated
       replicas: 2
     ports:
       - "8080:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: mysql:3306
       WORDPRESS_DB_USER: mywordpress
       WORDPRESS_DB_PASSWORD: mywordpress
       WORDPRESS_DB_NAME: mywordpress
volumes:
    mysql_data: {}

在 /tmp 目下新建 docker-compose.yml 文件,并且写入以上的内容。使用以下命令启动服务:

$ docker stack deploy -c docker-compose.yml wordpress
Ignoring unsupported options: restart

Creating network wordpress_default
Creating service wordpress_mysql
Creating service wordpress_wordpress

以上命令执行后,将会启动两个服务:

  • MySQL服务,默认启动一个副本
  • WordPress服务,根据compose模板的定义启动了两个副本
# 查看启动的服务:
$ docker service ls
ID                  NAME                  MODE                REPLICAS            IMAGE               PORTS
v8i0pzb4e3tc        wordpress_mysql       replicated          1/1                 mysql:5.7
96m8xfyeqzr5        wordpress_wordpress   replicated          2/2                 wordpress:php7.4    *:8080-&gt;80/tcp
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker学习十:Docker Swarm 的相关文章

  • PCB走线注意事项

    资料来源于瑞芯微电子 晶振布线 xff1a 在设计印刷电路板时 xff1a 保持晶体尽可能靠近可编程芯片晶体引脚 xff0c 保持走线长度短和小 xff0c 以减少电容器负载和防止不必要的噪音辐射 将所有信号从晶体和X1和X2引脚下面走线应
  • C语言 十进制转 二进制 八进制 十六进制

    整体源码 xff1a span class token macro property span class token directive hash span span class token directive keyword inclu
  • Kubuntu 安装fcitx 5

    kubuntu 22 04 安装fcitx5 一 安装前 xff1a 更新软件源 xff0c 不然下载会随缘中断 找到这个文件夹 etc apt 修改sources list 将所有的 http cn archive ubuntu com
  • 在学习opencv 多通道变单通道时 自己出现的一点错误

    include 34 stdafx h 34 include 34 highgui h 34 include 34 cv h 34 int main IplImage str1 str2 str3 str1 61 cvLoadImage 3
  • 计蒜客-1189-树根

    数根可以通过把一个数的各个位上的数字加起来得到 如果得到的数是一位数 xff0c 那么这个数就是数根 如果结果是两位数或者包括更多位的数字 xff0c 那么再把这些数字加起来 如此进行下去 xff0c 直到得到是一位数为止 比如 xff0c
  • HTTP——CDN简单认识

    贴一个B站地址 Up主讲的不错 以下内容是个人整理 CDN CDN Content Delivery Network 内容分发网络 CDN的必要性 服务器 包括云服务器 一定有一个物理位置 访问服务器的客户端如果距离服务器太远 或者服务器附
  • twitter闪退解决办法_那么我们如何解决Twitter? 用户界面改造将是一个不错的起点。...

    twitter闪退解决办法 by Daryll Santos 达里尔 桑托斯 Daryll Santos 那么我们如何解决Twitter xff1f 用户界面改造将是一个不错的起点 So how do we fix Twitter A us
  • MySQL分组查询,获取分组后数据

    MySQL分组查询 xff0c 获取分组后数据 MySQL分组查询 xff0c 将其它列的数据 xff0c 合并到一行展示 xff0c 可以设置去重 xff0c 设置去重 xff0c 设置排序 xff0c 截取指定条数 创建表结构 CREA
  • 解决的问题记录(持续更新)

    1 Ubuntu Server2020 4 树莓派WiringPi的安装与编译 链接 http i lckiss com p span class token operator 61 span span class token number
  • Microsoft Edge浏览器文件保存位置记录

    现在流行的Windows 10操作系统基本上都是使用Edge浏览器了 xff0c 作为一个重要的在线下载工具 xff0c 我得知道他把我下载的文件保存到什么地方去了 下面就记录下这两天观察到的 1 要是直接点击下载 xff0c 另存为xxx
  • python--排错--AttributeError: 'str' object has no attribute 'decode',关于python3的字符串

    AttributeError 39 str 39 object has no attribute 39 decode 39 一般是因为str的类型本身不是bytes xff0c 所以不能解码 两个概念 普通str xff1a 可理解的语义
  • Java向高级进阶(Java开发1-3年的仔看过来)

    遇到技术瓶颈 xff1f 在开发过程你是否觉得自己很多想法可是很难实现 xff1f 就算能实现但是实现的过程却很low xff1f 感觉自己开发几年一直在面向需求开发 xff0c 说好的面向对象开发呢 xff1f xff1f xff1f x
  • vue项目引用图标font-awesome提示错误

    vue引入font awesome图标样式一直报错 如图 xff1a 提示安装 xff1a npm install save font awesome scss font awesom 可以是安装之后还是报错 原来搞错顺序了 xff0c 要
  • IDEA 自动生成类注释和方法注释 (超舒服,超详细篇)

    目录 生成类注释生成类注释模板 生成方法注释生成方法注释模板方式注释的使用 很舒服的 xff0c 很详细的教程步骤 生成类注释 File gt Settings PreferencesEditor gt File and Code Temp
  • springboot项目解决扛住瞬间千次重复提交问题

    前言 在实际的开发项目中 一个对外暴露的接口往往会面临很多次请求 xff0c 我们来解释一下幂等的概念 xff1a 任意多次执行所产生的影响均与一次执行的影响相同 按照这个含义 xff0c 最终的含义就是 对数据库的影响只能是一次性的 xf
  • spring-boot mybatis-plus集成 代码自动生成 和 自定义生成代码 (简单,方便 易理解)

    mybatis plus自定义生成代码 导包在yml配置mybaits plus创建CodeGeneration java类测试看效果图 前言 xff1a 之前都是通过配置generatorConfig xml文件实现自动生成代码 xff0
  • 多线程之间如何实现通信,基础版(示例说明)

    多线程之间如何实现通信 什么是多线程之间通讯 xff1f 多线程之间通讯需求代码实现基本实现 什么是多线程之间通讯 xff1f 多线程之间通讯 xff0c 其实就是多个线程在操作同一个资源 xff0c 但是操作的动作不同 多线程之间通讯需求
  • 简单总结ConcurrentHashMap

    ConcurrentHashMap的概念 哈希算法 xff08 hash algorithm xff09 xff1a 是一种将任意内容的输入转换成相同长度输出的加密方式 xff0c 其输出被称为哈希值 HashMap与HashTable 因
  • openstack负载均衡_使用OpenStack Trove和Manila扩展DBaaS工作负载

    openstack负载均衡 稳定的数据库是任何企业应用程序中最常需要的组件之一 xff0c 而OpenStack背后的开发社区正在努力确保在开源云中使用数据库是一种简单 xff0c 可靠和高效的体验 Tesora的Amrith Kumar
  • 线程池原理分析(附线程池原理图)

    目录 什么是线程池使用线程池的好处线程池的作用线程池创建的四种方式重点介绍newFixedThreadPool线程池 线程池原理解析合理配置线程池大小 线程池就是这么简单 什么是线程池 线程池其实就是将多个线程对象放到一个容器当中 使用线程

随机推荐

  • Java反射机制,通过反射机制手写一个spring ioc框架

    Java基础 xff1a 反射机制 什么是反射Java反射机制的作用Java反射机制如何禁止Java反射机制的应用Java反射机制 常用 Api通过反射机制手写 spring ioc 示例 什么是SpringIOC什么是SpringIOC底
  • Java之设计模式(一): 单例模式

    单例模式 什么是单例模式 xff1f 单例模式应用场景饿汉式懒汉式静态内部类总结 设计模式 xff08 Design pattern xff09 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 使用设计模式是为了可重用代
  • Java内存结构:基本概念

    基本概念 Java内存结构方法区 xff1a 堆 xff1a 栈 xff1a 内地方法栈 xff1a PC寄存器 xff1a 执行引擎 xff1a 垃圾回收机制 前言 面试经常被问到JAVA内存模型和Java内存结构的区别 JAVA内存模型
  • Java内存结构:jvm调优 堆调优

    堆 什么是堆堆结构图堆的参数配置设置最大堆内存设置新生代与老年代优化参数设置新生代比例参数内存溢出解决办法 什么是堆 是new创建出来的对象或数组存放在堆中 堆结构图 堆的参数配置 XX 43 PrintGC 每次触发GC的时候打印相关日志
  • springboot 2.3之后消失的hibernate-validator

    spirngboot升级到2 3之后 xff0c hibernate validator消失 项目升级到springboot2 3之后 xff0c 参数校验的注解报错 xff0c 发现spring boot starter web的依赖项已
  • CentOS7.6下MySQL8.0 tar.xz 安装详解

    安装详解 环境准备下载安装包安装步骤创建mysql用户更改目录权限初始化mysql设置环境变量添加开机自启动启动MYSQL服务登陆MYSQL修改密码修改公网访问设置防火墙 环境准备 1 由于Centos7自带Mariadb xff0c 卸载
  • Linux 防火墙 常用命令 基于Centos7

    常用操作 firewalld的基本使用服务之间的常用命令配置firewalld cmd firewalld的基本使用 启动 xff1a systemctl start firewalld 关闭 xff1a systemctl stop fi
  • MySQL主从复制和读写分离

    MySQL主从复制和读写分离 MySQL主从复制的好处主从复制的概念与作用主从复制的原理主从复制与读写分离的关系主从复制的配置修改主 master 服务器主服务器给从服务器账号授权修改从 slave 服务器连接主服务器开始同步操作 MySQ
  • java:组织机构树实现名称模糊查询

    在开发的很多场景中 xff0c 需要我们对树形结构进行模糊查询 xff0c 这个时候就需要用到递归来实现定位 xff0c 效果如下图 xff1a 话不多说 xff0c 直接上代码吧 xff1a 首先是对json的实例化对象处理 public
  • openstack dns_使用OpenStack Designate构建DNS即服务

    openstack dns Designate是一个多租户DNS即服务 xff0c 包括用于域和记录管理的REST API xff0c 用于与Neutron集成的框架以及对Bind9的集成支持 您可能需要考虑以下DNSaaS xff1a 干
  • mybatis plus 之UpdateWrapper操作

    目前java开发的系统为了可移植性更高 xff0c 都采用了mybatis plus来做持久层 xff0c 现在介绍一下其中UpdateWrapper的用法 xff1a UpdateWrapper lt TemplateDetailsEnt
  • 阿里域名+腾讯云服务器组合部署网站

    前段时间 xff0c 我在阿里云上购买了一个域名 本想着也在阿里云上购买一台入门级服务器先玩玩 xff0c 但是在看完一系列的产品后 xff0c 还是放弃了阿里云的服务器 对比几家之后还是选择了腾讯云 xff0c 接下来 xff0c 就是踩
  • 解决spring security登出时会由https重定向为http

    我们在集成spring security框架时 xff0c 默认的登出会走一次重定向login logout xff0c 这是如果发布到生产环境 xff0c 则会登出有问题 具体报错就是说由https和http混用访问资源的错误 xff0c
  • docker安装kafka,并集成springboot进行测试

    大家好 xff0c 今天我们开始学习kafka中间件 xff0c 今天我们改变一下策略 xff0c 不刷视频学习 xff0c 改为实践学习 xff0c 在网上找一些案例功能去做 xff0c 来达到学习实践的目的 首先 xff0c 是安装相关
  • springboot集成kafka的相关配置及自定义

    之前的文章末尾 xff0c 简单的实现了springboot集成kafka xff0c 完成了简单的测试 xff0c 今天我们来扩展一下相关内容 首先详解一下配置文件的内容 xff1a spring kafka 指定 kafka 地址 xf
  • sql查询一个表不包含另一个表的数据,两种方法。

    1 用minus函数的方式 xff1a select from CMN FUND where FUND CODE in select FUND CODE from CMN FUND minus select FUND CODE from C
  • js控制输入框禁止输入和允许输入

    初始 xff0c 部分输入框禁止输入 xff1a document ready function 34 fundCode 34 prop 34 disabled 34 true 34 convertFundCode 34 prop 34 d
  • jsp页面内嵌另一个jsp公共页面

    在开发过程中 xff0c 有些功能是一直可以重复使用的 xff0c 这样的页面我们可以做成公共的 xff0c 供每个页面适用 xff0c 那么就需要我们在使用的时候做一下嵌套 例如 xff1a 这样一个页面中 xff1a 上半部分是公共的
  • Go语言入门

    原文地址 xff1a 嗨客网 Go语言入门 Go语言入门教程 很多人将 Go 语言 称为 21 世纪的 C 语言 xff0c 因为 Go 不仅拥有 C 语言的简洁和性能 xff0c 而且还很好的提供了 21 世纪互联网环境下服务端开发的各种
  • Docker学习十:Docker Swarm

    一 Swarm介绍 Swarm 是 Docker 官方推出的容器集群管理工具 xff0c 最大的优势之一就是原生支持 Docker API xff0c 原来的 Docker 用户可以很方便地将服务迁移到 Swarm 中来 Swarm 还内置