Docker笔记:Docker Swarm 搭建集群与项目部署

关于 Docker Swarm

1 )Swarm的引入

  • Docker Compose 只能编排单节点上的容器,即: 单台服务器上的集群部署
  • 如果要实现多台服务器上的集群部署,就可以选择 Swarm
  • Docker Swarm 是Docker公司推出的用来管理docker集群的工具
  • 使用 Docker Swarm 可以快速方便的实现高可用集群
  • Docker Swarm 可以让我们在单一主机上操作来完成对整个容器集群的管理工作
  • 使用Docker Swarm可以让单一主机上的容器快速部署到10个、20个或者200个主机上面,实现高可用集群
  • 从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm)
  • 并且已经内置了服务发现工具,我们就不需要像之前一样, 再配置 Etcd 或者 Consul 来进行服务发现配置了
  • Dokcer Swarm 是Docker官方的提供的集群部署管理工具,基于原生Docker
  • 相比K8s要更简单、更容易上手
  • 如果您的节点(物理机)在1000台以内,完全可以使用 Docker Swarm 实现部署
  • Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些

2 )Swarm 节点

  • Docker swarm中有节点的概念,一个节点就可以通俗的理解为一个机器
  • 可以是物理服务器也可以是虚拟机、云等等
  • 节点分为: 管理 (manager) 节点和工作 (worker) 节点
  • 管理节点(Manager)
    • 管理节点用于 Swarm 集群的管理,负责集群控制
    • 通过监控集群状态、分发任务到工作节点
    • docker swarm 命令基本只能在管理节点执行
    • 节点退出集群命令 docker swarm leave 可以在工作节点执行
    • 一个 Swarm 集群可以有多个管理节点,节点数量可以是 3, 5, 7 个,用来保证管理节点的高可用
    • 但只有一个管理节点可以成为leader,leader 通过 raft 协议实现
  • 工作节点(Worker)
    • 是任务执行节点,管理节点将服务 (service) 下发至工作节点执行
    • 管理节点默认也作为工作节点
  • 节点的有效性有三种
    • Active 调度程序可以分配任务给节点
    • Pause 调度程序不分配新任务给节点,但现有任务继续运行
    • Drain 调度程序不分配新任务给节点,调度程序关闭任何现有任务并将它们调度到可用节点上

3 )Swarm 任务和服务

  • 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器
  • 服务 (Services) 是指一组任务的集合,服务定义了任务的属性

Docker swarm 集群搭建

1 )准备工作

  • 准备4台机器(物理机,虚拟机,云主机都可以),假定他们ip分别是
    • 192.168.1.10 作为管理节点
    • 192.168.1.11 作为工作节点
    • 192.168.1.12 作为工作节点
    • 192.168.1.13 作为工作节点
  • 先关闭防火墙,作为演示,注: 实际服务器要配置防火墙规则,仅作为网络连通演示
    • 使用 centos 演示
      • 关闭 SELinux
        • $ getenforce 查看状态
        • 如果不是关闭状态,则修改配置文件
          • $ vi /etc/selinuux/config
          • 修改 SELINUX=enforcing 改为 SELINUX=disabled
      • 关闭防火墙
        • $ systemctl stop firewalld
      • 配置主机 hostname
        • 获取hostname $ hostname
        • 修改有两种方式
          • 临时有效: $ hostname worker_11
          • 永久有效: $ vi /etc/hostname 并 重启机器
            • .10 配置 manager_10
            • .11 配置 worker_11
            • .12 配置 worker_12
            • .13 配置 worker_13

2 )初始化集群

  • 在 .10 这个管理节点上操作
    • $ docker swarm init --advertise-addr 192.168.1.10
    • 之后会输出一段提示命令
  • 在 .11,.12,.13 主机上执行上述提示命令
    • $ docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
    • 这样工作节点都加入到了集群里,上述 token 是当前管理节点签发的一个令牌
  • 在 .10 上
    • 执行 $ docker node ls, 可以看到集群里有哪些节点了, 这个命令只能在 manager节点上运行
    • 执行 $ docker node inspect 具体的nodeID 可查看节点详细信息
  • 有新的机器想要加入集群,则在 .10 机器上,输入 $ docker swarm join-token worker
    • 就可以重现第一次出现的加入命令
  • 如果想要加入 manager, 则在 .10 机器上,输入 $ docker swarm join-token manager
    • 就可以看到创建 manager节点的命令
  • 删除节点,执行两个命令
    • 在管理节点上 $ docker node rm nodeID -f
    • 在工作节点上 $ docker swarm leave -f
    • 不分顺序
  • 管理节点降级为工作节点 $ docker node demote nodeID
  • 工作节点升级为管理节点 $ docker node promote nodeID

Docker Swarm创建容器并部署项目

  • 之前 docker run 创建的容器,只能在当前计算机上运行, 不具备扩容性,不方便管理
  • 现在 docker service 服务具备扩容,滚动更新,回滚等功能,可部署在多台服务器
    • 创建的服务可以包含多个容器
    • 会自动部署到 docker swarm 对应的集群里
  • $ docker service logs 查看某个服务日志
  • $ docker service rm serviceName 删除某个服务
  • $ docker service ls 查看所有服务详情
  • $ docker service inspect 查看服务详情
  • $ docker service ps serviceName 查看服务力运行的xxx容器

1 )创建nginx对应的服务,里面可以包含多个容器

  • $ docker service create --name nginx --replicas 2 --publish 80:80 nginx
    • --replicas 指定副本数量
    • 这样可以把2个容器随机部署到集群中的2台机器上
  • 通过 $ docker service ls 可按到运行的 nginx 服务
  • $ docker service ps nginx 查看 nginx 服务有哪些容器
  • 部署好之后,就可以通过 ip地址或域名访问到 nginx 服务了
  • 其底层实现是,基于 ingress 网络完成通信和负载均衡
    • 访问集群里的任意一台服务器,都可以访问到 nginx
  • 上面指定了端口,也不会存在冲突,实际映射的是服务端口,只暴露了一个服务端口
  • 我们访问的时候,是访问的服务

2 )对nginx服务进行动态调整(扩容和缩容)

  • $ docker service update --replicas 3 nginx
  • $ docker service scale nginx=3
  • 指定数量可以超过主机数量,每台主机可运行多个nginx服务
  • 当一台机器上一个容器挂掉后,会动态的随机启动一个新的容器

3 )创建 nginx 并映射目录

  • $ docker service create --name nginx --replicas 8 -p 80:80 --mount type=bind,src=/root/wwwroot/html,dst=/usr/share/nginx/html nginx
    • src 物理机或本机目录
    • dst nginx容器里面的目录
    • 以上命令在管理节点执行
  • 以下命令在所有机器上执行
    • $ mkdir /root/wwwroot/html
    • $ cd /root/wwwroot/html
    • $ touch index.html 写一些任意的东西
    • 以上这些在集群的所有机器上执行
  • 当访问任意节点ip的时候,可能加载的并非当前ip对应主机的服务
    • 比如访问 .11 的节点,可能提供服务的,并非 .11主机内的服务
    • 这里是基于 ingress 网络实现的负载均衡
    • 内部有个算法实现计算谁的资源空闲,找谁提供服务

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

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

相关文章

何为内存泄漏?如何监测并防止内存泄漏事故发生?

内存泄漏会严重影响计算机的性能,但它们到底是什么,为什么会发生?如何检测和防止内存泄漏呢? 本文需要解决的关键要点: 1)当应用程序无法返回分配的内存时,就会发生内存泄漏,逐渐消…

JavaEE:线程池精讲

目录 一.什么是线程池 二.线程池的实现原理 🎈为什么要有工厂模式? 三.线程池的构造方法解读 🎈线程池的拒绝策略 四.自己实现一个线程池 一.什么是线程池 简单来说,线程池就好比一块鱼塘,鱼塘中的每条鱼就是一个线程…

如何在Eclipse中安装WindowBuilder插件,详解过程

第一步:找到自己安装eclipse的版本,在Help-关于eclipse里面,即Version 第二步:去下面这个网站找到对应的 link(Update Site),这一步很重要,不然版本下载错了之后还得删除WindowBuil…

常用的Webstrom插件

Active Tab Highlighter 高亮选中的tab Atom Material Icons 图标,个人觉得还是挺好看,各类分拣也能区分的很明显 Code Remark 代码标记 Gitmoji Plus git提交时候的小图标 GitToolBox git工具,免费版本就支持鼠标在哪一行就显示提交的信…

Redis HyperLogLog:数据统计的轻量级解决方案

引言 在现代数据驱动的应用中,Redis 以其出色的性能和灵活性成为了不可或缺的工具。 特别是在统计大量数据时,传统的计数方法往往既耗时又占用大量存储空间。 这次,阿七将介绍一种名为 HyperLogLog 的算法,它在 Redis 中的实现…

Scala多线程爬虫程序的数据可视化与分析实践

一、Scala简介 Scala是一种多种类型的编程语言,结合了针对对象编程和函数式编程的功能。它运行在Java虚拟机上,具有强大的运算能力和丰富的库支持。Scala常用于大数据处理、并发编程和Web应用程序开发。其灵活性和高效性编程成为编写多线程爬虫程序的理…

Python开发GUI常用库PyQt6和PySide6介绍之一:概述

Python开发GUI常用库PyQt6和PySide6介绍之一:概述 Python开发GUI有许多选择,下面是常见的选择: Tkinter:Tkinter是Python标准库中的一个GUI工具包,易于学习和使用。它提供了丰富的组件和布局选项,适用于简…

企业办公加密系统中——全透明加密和半透明加密的区别

PC端访问地址: www.drhchina.com 天锐绿盾数据防泄密系统中的全透明加密和半透明加密的区别如下: 全透明加密是采用驱动层动态加解密技术,对企业内部所有涉密文档进行强制加密处理,从文件创建开始即可自动加密保护。加密文档在加…

STM32 CAN多节点组网项目实操 挖坑与填坑记录2

系列文章,持续探索CAN多节点通讯, 上一篇文章链接: STM32 CAN多节点组网项目实操 挖坑与填坑记录-CSDN博客文章浏览阅读120次。CAN线性组网项目开发过程中遇到的数据丢包问题,并尝试解决的记录和推测分析。开发了一个多节点线性…

实战 | OpenCV传统方法实现密集圆形分割与计数(详细步骤 + y源码)

导 读 本文主要介绍基于OpenCV传统方法实现密集圆形分割与计数应用,并给详细步骤和代码。 背景介绍 实例图片来源于网络,目标是分割下图中圆形目标并计数。 本文实现效果如下: 实现步骤 【1】灰度转换 + 均值滤波 + 二值化,得到参考背景 img = cv2.imread(src.jpg)c…

基于深度学习的人脸测距&社交距离过近警报系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 近年来,随着深度学习技术的快速发展,人脸识别技术在各个领域得到了广泛应用。其中,人脸测距和社交距离过近警报系统成为了人们…

两个月准备信息系统项目管理师来得及吗?

可以尝试加快进度!但是时间稍微有些紧迫。当然备考时间也不宜过长,2-3个月时间完全足够。对于没有项目经验的初学者考生们,建议提前做好准备,特别要注意时间安排~ 在备考期间,不要受到外界负面言论的影响,比…

Mysql数据库的基础知识和yum安装步骤

MySQL数据库介绍 什么是数据库DB? DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作&#xff1…

[C++] 多态(下) -- 多态原理 -- 动静态绑定

文章目录 1、多态原理2、动态绑定和静态绑定3、单继承和多继承关系的虚函数表3.1 单继承中的虚函数表5.2 多继承中的虚函数表 上一篇文章我们了解了虚函数表,虚函数表指针,本篇文章我们来了解多态的底层原理,更好的理解多态的机制。 [C] 多态…

解决浏览器自动将http跳转至https导致无法访问的问题

以下只针对Chrome浏览器 方法一: 1.地址栏中输入chrome://net-internals/#hsts。 2.在Delete domain中输入项目的域名,并Delete(删除)。 3.可以在Query domain测试是否删除成功。 HSTS全称:HTTP Strict Transport Se…

数据分析场景下,企业大模型选型的思路与建议

来源/作者:爱分析 随着大模型带来能力突破,让AI与数据分析相互结合,使分析结果更好支撑业务,促进企业内部数据价值释放,成为了当下企业用户尤为关注的话题。本次分享主要围绕数据分析场景下大模型底座的选型思路&#…

opencv 入门一(显示一张图片)

头文件添加如下&#xff1a; 库目录添加如下&#xff1a; 依赖的库如下&#xff1a; #include <iostream> #include "opencv2/opencv.hpp" int main(int argc,char ** argv) { cv::Mat img cv::imread(argv[1], -1); if (img.empty()) return -1; …

sourcetree 无效的源路径 细节提示:系统找不到指定的文件

工具–>选项–>git 直接下拉到底 点击红框&#xff0c;重新下载一个内嵌git就可以了 我感觉是因为改变了原有git安装路径的问题

MFC 窗口创建过程与消息处理

目录 钩子简介 代码编写 窗口创建过程分析 消息处理 钩子简介 介绍几个钩子函数&#xff0c;因为它们与窗口创建工程有关 安装钩子函数 HHOOK SetWindowsHookExA([in] int idHook,[in] HOOKPROC lpfn,[in] HINSTANCE hmod,[in] DWORD dwThreadId ); 参数说明…

深度学习笔记_7经典网络模型LSTM解决FashionMNIST分类问题

1、 调用模型库&#xff0c;定义参数&#xff0c;做数据预处理 import numpy as np import torch from torchvision.datasets import FashionMNIST import torchvision.transforms as transforms from torch.utils.data import DataLoader import torch.nn.functional as F im…