容器集群管理工具 Docker Swarm

news2024/11/16 7:51:15

前言

《了解和使用Docker》中有提到容器编排工具 docker compose ,不过只限于单机。如果现在需要搭建一个集群环境,提供了10台服务器用来部署应用以及其依赖的组件,比如5个 Tomcat 应用容器、3个Redis、5个 Mysql、3个 Nginx ,你会如何部署?

重复执行部署操作?如果需要扩缩容,手动处理吗?如果上百个应用,容器如何管理?集群中容器之前如何通信?数据如何管理?

很显然,我们需要一个工具帮助我们更快、更高效的做这些事。本文对 Docker Swarm 进行介绍,详细说明在集群环境中如何统一部署、统一管理、统一调度容器。

下面还有投票,一起参与进来吧👍

文章目录

  • 前言
  • Docker Swarm介绍
  • Docker Swarm 集群部署
    • Docker 安装
    • Docker Swarm集群初始化
    • Docker 节点加入集群
  • Docker Swarm 集群应用
    • Docker Swarm 基本命令
    • 发布服务
    • 服务扩缩
    • 服务版本更新
    • 服务互联与服务发现
    • 服务数据持久化
  • Docker Stack
    • Docker Stack 基本命令
    • 使用 Docker Stack 发布

Docker Swarm介绍

Docker Swarm是 Docker 官方提供的一款集群管理工具,和 Kubernetes 比较类似,但是更加轻,具有的功能也较 Kubernetes 更少一些。其本质是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源,如下图。

在这里插入图片描述

其中节点分为两类:

  • 管理节点(manager node) 负责管理集群中的节点并向工作节点分配任务
  • 工作节点(worker node) 接收管理节点分配的任务,运行任务
    在这里插入图片描述

Docker Swarm 集群部署

部署 Docker Swarm 集群不论管理节点还是工作节点都需要先安装 Docker,然后某个管理节点执行集群初始化操作后,其他节点才可以加入集群。

Docker 安装

这里基于 CentOS 操作系统进行 Docker 安装

# 设置 Docker YUM 源并下载
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 docker-ce
yum -y install docker-ce
# 启动docker服务并设置为开机自启动
systemctl enable docker
systemctl start docker
systemctl restart docker

Docker Swarm集群初始化

# 获取docker swarm命令使用帮助
docker swarm --help
Usage:  docker swarm COMMAND

Manage Swarm

Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm                    初始化
  join        Join a swarm as a node and/or manager 加入集群
  join-token  Manage join tokens                    集群加入时token管理
  leave       Leave the swarm                       离开集群
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm                      更新集群

在管理节点进行初始化

# --advertise-addr 当主机有多块网卡时使用其选择其中一块用于广播,用于其它节点连接管理节点使用--listen-addr    监听地址,用于承载集群流量使用
docker swarm init --advertise-addr 192.168.10.10 --listen-addr 192.168.10.10:2377

初始化命令执行后会输出其他节点加入集群的命令

Swarm initialized: current node (j42cwubrr70pwxdpmesn1cuo6) is now a manager.

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

    docker swarm join --token SWMTKN-1-297iry1n2jeh30oopsjecvsco1uuvl15t2jz6jxabdpf0xkry4-6pddlyiq5f1i35w8d7q4bl1co 192.168.10.10:2377

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

Docker 节点加入集群

添加工作节点到集群

直接复制初始化后命令加入集群

docker swarm join --token SWMTKN-1-297iry1n2jeh30oopsjecvsco1uuvl15t2jz6jxabdpf0xkry4-6pddlyiq5f1i35w8d7q4bl1co 192.168.10.10:2377

查看已加入的集群

docker node ls
ID              HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
j42cwubrr70 *   xxx1        Ready     Active         Leader           20.10.12
4yb34kuma6i     xxx2        Ready     Active                          20.10.12

可以看到管理节点是有主从角色的,所以如果备份的管理节点要加入集群,需要 Leader 节点生成管理节点到集群的命令

docker swarm join-token manager

如果使用的token已过期,可以在管理节点再次生成新的token

# 生成工作节点加入集群的token
docker swarm join-token worker
# 生成管理节点加入集群的token
docker swarm join-token manager

Docker Swarm 集群应用

Docker Swarm 集群环境部署好后就对容器镜像进行部署操作了。在 Docker Swarm 中,对外暴露的是服务(service),而不是容器。为了保持高可用架构,它允许同时启动多个容器共同支撑一个服务,如果一个容器挂了,它会自动使用另一个容器。

Docker Swarm 基本命令

# 发布服务
docker service create

# 查看已发布服务
docker service ls

# 服务更新
docker service update

# 服务扩/缩容
docker service scale

# 服务删除
docker service rm

# 创建服务网络
docker network create

# 查看服务网络
docker service ls

发布服务

在发布服务时可以指定副本个数进行部署,也就是上述所说的高可用,创建一个服务名为 sn1 ,副本个数为3,命令如下

docker service create --name sn1 --replicas 3  192.168.10.10/library/imagetest1:v1

此命令执行成功后会在 Docker Swarm 集群中的3个节点上部署镜像为 imagetest1 的容器。包含多个容器时,每次访问将以轮询的方式访问到每个容器,后面服务网络中有说明。

服务扩缩

如果现在需要对服务 sn1 进行扩缩容可以执行以下命令

docker service scale sn1=2

此命令执行成功后会将服务 sn1 的容器数量由3个缩减到2个。

服务版本更新

如果现在需要对服务中的镜像进行更新,比如升级、回退等操作,执行以下命令即可

docker service update sn1 --image 192.168.10.10/library/imagetest1:v2

同时还支持滚动间隔更新,也就是在指定的间隔时间后更新指定的数量,比如 30s 更新一个,这样在出现问题后可以及时停止。

# --update-parallelism 指定并行更新数量
# --update-delay 指定更新间隔时间

docker service update sn1 --image 192.168.10.10/library/imagetest1:v2 --update-parallelism 1 --update-delay 30s 

服务互联与服务发现

集群中的这些服务如何进行通信?比如 tomcat 服务和 Mysql 服务通信,暴露端口吗?这个是非常不安全的;还有服务重新部署后 IP 发生变化,连接它的服务也需要修改吗?这些问题在 Docker Swarm 中可以使用overlay 网络实现,在发布服务时选用同一个网络,服务的使用者都不需要知道服务运行在哪里,IP是多少,有多少个副本,就能让服务之间通信。

在 Docker Swarm 中有三个重要的网络概念:

  • Overlay networks 管理 Swarm 中 Docker 守护进程间的通信。可以将服务附加到一个或多个已存在的 overlay 网络上,使得服务与服务之间能够通信。
  • ingress network 是一个特殊的 overlay 网络,用于服务的负载均衡。当任何节点在发布的端口上接收到请求时,它将该请求交给一个名为 IPVS 的模块。IPVS 跟踪参与该服务的所有容器 IP 地址,选择其中的一个,并通过 ingress 网络将请求路由到它。大多数情况下,用户不需要自定义配置,初始化或加入 Swarm 集群时会自动创建 ingress网络。
  • docker_gwbridge是一种桥接网络,将 overlay 网络(包括 ingress 网络)连接到一个单独的 Docker 守护进程的物理网络。默认情况下,服务中的每个容器都连接到本地 Docker 守护进程主机的 docker_gwbridge 网络。
# 创建Overlay网络
docker network create -d overlay mynet

# 发布服务时加入mynet网络
docker service create --name sntest1 --network mynet -p 8080:8080 --replicas 2 192.168.10.10/library/imagetest1:v2

# 发布服务时加入mynet网络
docker service create --name sntest2 --network mynet -p 8081:8081 --replicas 2 192.168.10.10/library/imagetest1:v2

通过以上命令,服务 sntest1 和 sntest2 之间就可以通过服务名互相连接了。

服务数据持久化

Docker Swarm 发布服务时挂载本地目录到容器中直接通过参数设置即可,如下

docker service create --name sntest1 --mount "type=bind,source=/data/localtest,target=/usr/share/" --replicas 2 192.168.10.10/library/imagetest1:v2

如果容器之间的数据需要共享,这种方式就不适用了,通过网络存储卷可以实现跨宿主机的数据共享(需要集群节点都创建该网络存储卷)。

以 NFS 提供远程存储为例,在存储节点上安装 NFS 服务并设置共享目录

# 安装nfs-utils
yum -y install nfs-utils
# 设置nfs共享目录目录及权限
echo "/opt/dockervolume       *(rw,sync,no_root_squash)" > /etc/exports
systemctl enable nfs-server
systemctl start nfs-server

# 查看nfs共享目录
showmount -e

然后在 Docker Swarm 各个节点部署 NFS 服务,创建存储卷

# 安装nfs-utils
yum -y install nfs-utils
# 查看nfs服务节点的共享目录
showmount -e 192.168.10.10
# 创建存储卷
docker volume create  --driver local --opt type=nfs --opt o=addr=192.168.10.10,rw --opt device=:/opt/dockervolume testnetvolume

在发布服务时挂载 testnetvolume 即可达到容器之间的数据共享

docker service create --name sntest1 --mount "type=volume,source=testnetvolume,target=/usr/share/" --replicas 2 192.168.10.10/library/imagetest1:v2

Docker Stack

发布服务每次只能发布一个,Docker Stack 属于集群版的 docker-compose,一组有关联的服务的组合,可以一起编排,一起发布, 一起管理。与单机版的 docker-compose 不同的是 Docker Stack 会忽略了“构建”指令,只能使用预先已经构建好的镜像;另外 docker-compose 属于一个项目,需要单独安装, Docker Stack功能包含在Docker引擎中,属于 Docker Swarm 一部分。

Docker Stack 基本命令

# 部署更新现有堆栈
docker stack deploy

# 查看现有堆栈
docker stack ls

# 查看堆栈中的任务
docker stack ps

# 删除一个或多个堆栈
docker stack rm

# 列出堆栈中的服务
docker stack services

使用 Docker Stack 发布

编写一个包括自定义的服务、 visualizer服务、portainer服务的YAML文件并发布,stack.yaml示例如下:

# stack 不支持基于第2版写的docker-compose.yml ,version版本至少为3
version: "3"
services:
  nginx:
    image: 192.168.10.10/library/imagetest1:v2
    ports:
      - 80:80
    deploy:
      mode: replicated
      replicas: 3
	
  visualizer:
  	# docker swarm 集群可视化
    image: dockersamples/visualizer
    ports:
      - "9001:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      # 该服务限制发布到管理节点
      placement:
        constraints: [node.role == manager]

  portainer:
  	# 可视化管理 docker swarm 集群
    image: portainer/portainer
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      replicas: 1
      placement:
        constraints: [node.role == manager]
# 部署堆栈
docker stack deploy -c stack.yaml stacktest

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

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

相关文章

Share Creators Ada Liu 与 VNG Christopher. Liu C出席 2023 全球游戏产业峰会

夏日将至,第二十届中国国际数码互动娱乐展览会(ChinaJoy)将于 2023 年 7 月 28 日至 7 月 31 日在上海新国际博览中心隆重举办。 本届 ChinaJoy 将带来多场重磅主题高端会议,其中全球游戏产业峰会将于 7 月 29 日在上海浦东嘉里大…

网安大佬常用的10大工具

从事网络安全工作,手上自然离不开一些重要的网络安全工具。今天,分享10大网络安全工具。 一、Kali Linux Kali 是一个基于 Debian 的 Linux 发行版。它的目标就是为了简单:在一个实用的工具包里尽可能多的包含渗透和审计工具。Kali 实现了这…

互联网大厂面试必备——1685页《Java 面试突击核心手册,二十大专题,覆盖2000道 Java后端核心面试解析

前言 不论是校招还是社招都避免不了各种面试。笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。 运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉…

HikariCP:一个叫光的JDBC连接池

文章目录 简介数据库连接池C3P0DBCPBoneCP 精简的设计字节码优化ArrayList-->FastListConcurrentBag代理实现Statement CacheScheduler quantaCPU缓存行失效 优雅的实现获取连接初始化池对象连接池管理连接池扩充连接池缩容连接池关闭 ConcurrentBag 连接池参数总结参考 简介…

网络协议分析:网络性能的防御工具

作为网络管理员知道管理不断发展的 IT 环境需要付出巨大的努力。无论是对于小型还是大型企业,管理网络以使其可访问并使其性能有效都需要一套监控策略和工具。大多数 IT 管理员需要协议分析器来识别潜在的网络风险并帮助排除故障。与传统分析不同,协议分…

PPT中彩虹线-变色线是怎么画出来的?

​ 效果 上面用箭头指出的线框处,各位可以看到这种有多种颜色组成的渐变的就叫彩虹线 彩虹线是怎么设置的? 请看下面的操作步骤 此处,请单击选中你要变色的线,然后我们点击鼠标右键,在弹出的菜单中选择“设置形状格式" ​ 然后你会在PPT右边得到这样的一个界面…

脑机接口 | 面向步态神经电生理研究的非人灵长类模型与系统

近期,海南大学生物医学工程学院脑机芯片神经工程团队在Frontiers in Neuroscience期刊上发表了题为《面向步态&神经电生理研究的非人灵长类模型与系统》的学术论文。海南大学生物医学工程学院梁丰研副教授为第一作者,殷明教授为通讯作者。海南大学为…

2023年上半年软件设计师试题及答案解析

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 计算机中,系统总线用于 (1) 连接。 (1) A. 接口和外设 B. 运算器、控制器和寄存器 C. CPU、主存及…

经典面试题---【第一档】

1.如果你想new一个Quene,你有几种方式?他们之间的区别是什么? 2.Redis 是如何判断数据是否过期的呢? Redis 通过一个叫做过期字典(可以看作是 hash 表)来保存数据过期的时间。过期字典的键指向 Redis 数据…

R语言脚本:关于 TissueEnrich包 得到的组织特异性基因富集结果的进一步处理

1. 说明 (来自官方文档): The TissueEnrich package is used to calculate enrichment of tissue-specific genes in a set of input genes. Tissue-specific genes were defined by processing RNA-Seq data from the Human Protein Atlas (HPA) (Uhln et al. 2015…

HttpServlet概述

HTTP协议包括: 请求协议:浏览器向WEB服务器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发送的数据具体格式。 相应协议:WEB服务器向浏览器发送数据的时候,这个发送的数据需要遵循一套标准,这套标准中规定了发…

【2023年首次更新】MyEclipse v2023.1支持Java 20

MyEclipse让您在开发过程中不受技术约束,不断创新帮您找到关键技术的解决方案您能在这里得到Java EE开发所需要的一切支持! MyEclipse v2023.1官方正式版下载 更新日志如下: MyEclipse官方近期更新了2023年第一个版本——v2023.1&#xff…

Nat.Commun. : 新的硬件将扩大量子计算机的工业应用规模

光子盒研究院 由明尼苏达大学双城分校领导的一个团队开发了一种新的超导二极管——这是电子设备中的一个关键部件,可以帮助扩大量子计算机的工业使用规模,并提高人工智能系统的性能。与其他超导二极管相比,研究人员的装置更加节能、可以同时处…

看过才知道,这套SpringCloudAlibaba笔记,把微服务玩的出神入化!

Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,依托Spring Cloud Alibaba,只需要添加一些注解和少量配置,就可以将Spring Cloud 应用接入阿里微服务解决方案,通过阿里中…

pwn(2)-栈溢出下

32位shellcode编写 不同内核态操作通过给寄存器设置不同的值,在调用指令int 80h,就可以通知内核完成不同的功能。 只要我们通过特定的汇编代码把特定的寄存器设定为特定的值后,在调用int 80h执行sys_execve(“/bin/sh”,NULL,NULL)就可以获…

Python获取链家二手房源数据信息

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块 csv 内置模块 👇 👇 &#x1…

OJ#203.身高排序

题目描述 ​ 海贼小学为了强健学生的身体,每天课间都要组织学生在户外学做广播体操。​ 这一天,五年级三班的所有同学在老师的指引下将队形排成了 M行 N 列。 现已知所有同学 的身高,数值为整数,单位:厘米。要求在所有…

Ansible从入门到精通【五】

大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 专栏名称:Ansible从入门到精通 立志成为ansible大佬 ansible-playbook企业级实战--handler hand…

爬虫基本的编码基础知识

爬虫的编码基础知识包括以下几个方面: 网络请求:使用Python中的requests库或urllib库发送HTTP请求,获取网页内容。 解析网页:使用Python中的BeautifulSoup库或lxml库解析HTML或XML格式的网页内容,提取所需的数据。 数…

如何开发视频上传和播放功能时,既省钱又体验好?

前言 现如今,大部分带内容的网站或应用都有视频区了,不说是大厂平台,就连个人开发者也相继在自己网站或小程序上迭代出视频板块。那既然有了视频模块,除个性化推荐,智能审核等这种费钱又耗时的功能外(个人开发者暂缓)。…