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

微服务实战系列之玩转Docker(十)

前言

我们知道Docker“使命”是为了快速完成应用的迁移和部署。为提升它的战斗能力,Docker官方携手发布了Docker Swarm—— 一个快速完成Docker集群构建的利器。那么请先回忆一下本系列第八篇(重点compose)和第九篇(重点network),一个是为了完成在同一个Docker主机下多容器的编排和运行,另外一个是为Docker主机与容器之间或容器与容器之间进行通信而提供的基本网络类型。

Docker Swarm同样具备容器编排能力,其价值体现在跨主机集群式的容器管理和编排能力上。可以理解为Docker Swarm是对compose的能力的拓展和延伸,同时又依赖了一个新的网络类型overlay——实现跨主机的容器通信。

今天博主带着各位继续玩转docker,开始集群化探索之旅,今天先聊聊Docker Swarm是怎么回事,有哪些好玩的地方。

一. Docker Swarm简介

先来看看它的主要“功效”

Docker Swarm是Docker官方2014年提供的容器编排工具,旨在简化容器化应用程序的部署、管理和扩展。它允许构建多主机的容器集群,并支持统一管理所有主机上的容器。

在这里插入图片描述
它的Logo是“堆叠”起来的Docker,挺有趣。博主最近很喜欢研究每一款“弄潮儿”的Logo,尤其是Logo背后的含义,不由思绪飞扬:

Logo一定程度体现了产品的价值或本质,一个Logo的诞生,往往代表了创作者的学习、抽象、概述能力的水平。据此可见,凡成功者,皆离不开这些优秀的品质。

1. 网络基础(overlay)

在前文中博主提到了docker支持的网络类型,其中有一类网络类型,没有重点展开。这种网络,可以说是专为集群服务的,也就是overlay——一个虚拟的通信网络。

在这里插入图片描述

2. 工作原理

在这里插入图片描述
这是一张来自官方的Docker Swarm运行架构图,看起来非常“简洁”,显然一个master-slave架构模式。此刻你应该会想起点啥? (比如类似此架构的工具有哪些?)

3. 术语/名词解释

术语/名词功能描述
Manger nodeDocker Swarm集群的管理节点,负责发号施令和选举,是整个集群的“大脑”
Worker nodeDocker Swarm集群的工作节点,负责接收和执行任务,也就是“干活”的。
Service一种集群服务,负责传递整个集群的工作命令,需指定具体的容器镜像。
Task在每个node上完成的任务,负责对容器进行各种操作。

下图是基于各单元模块的“极简工作流”
在这里插入图片描述

二. 创建Docker Swarm cluster

1. 准备cluster资源

本次博主的演示环境为centos7,当然你也可以使用更高的版本或者其他linux系统。

节点名称用途
docker-manangerdocker swarm集群的manager node,IP为10.11.12.70
docker-worker1docker swarm集群的worker node,IP为10.11.12.73
docker-worker2docker swarm集群的worker node,IP为10.11.12.74

根据Raft协议,最好是奇数,所以准备3个节点,组建集群。

2. 安装 docker

在以上3个节点中,分别安装docker,可按如下“兵法”出战:

2.1 替换yum源并安装
# 1. 替换yum源为aliyun 
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 2. 安装yum
yum -y install yum-utils
# 3. 清理yum缓存
yum clean all
# 4. 重新创建yum缓存
yum makecache
2.2 更新docker源
# 指定docker源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-e/g' /etc/yum.repos.d/docker-ce.repo
yum makecache
2.3 安装docker-ce
# 1. 安装docker
yum install -y docker-ce
# 2. 更新加速器
vi /etc/docker/daemon.json
输入:{"registry-mirrors": ["https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn"
]}
# 3. 重新加载配置
systemctl daemon-reload
# 4.重启docker
systemctl restart docker

如执行完毕,可通过docker -v验证是否已完成:

在这里插入图片描述

3. 安装Docker Swarm集群

在集群构建前,我们可以通过docker info看到:swarm : inactive,代表未启用。

在这里插入图片描述
接下来我们可以启用它,并让它开始干活吧。

3.1 创建manager node

创建集群,首先要create一个manager,通过docker swarm init命令完成:

docker swarm init --advertise-addr 10.11.12.70

执行后,会启用端口2377,并返回join token:
在这里插入图片描述

此时,我们再通过docker info看到:swarm : active,代表已启用swarm集群模式。

在这里插入图片描述

3.2 创建网络

创建一个overlay网络,用于集群内节点通信,通过docker network create完成:

docker network create -d overlay service-nginx

结果如下:
在这里插入图片描述

3.3 创建worker node

如其他docker主机需加入swarm集群,可通过凭证(通过--token指定)加入,通过docker swarm join命令完成:

# 指定凭证参数--token,manager主机10.11.12.70:2377docker swarm join --token SWMTKN-1-56x847iatimmt3u2fj76abegf7474z481r0jx0j4yh8hv7k9je-67wubc6q6v0fis79ihbhsfm0a 10.11.12.70:2377

那么该命令需要在docker-worker1docker-worker2节点分别完成:
在这里插入图片描述
在这里插入图片描述

3.4 查看cluster状态

通过docke node ls,可观察到此时集群有1个manager(Status=Leader),2个worker节点,并均处于Active状态:

在这里插入图片描述

三. 发布一个应用服务

集群创建完成后,我们开始愉快的让它干活吧。为便于举例,博主以常用的nginx为例。

1. 获得一个镜像nginx

通过docker pull nginx获取最新镜像。成功后,可执行docker images查看:

在这里插入图片描述

提醒:每个节点均需执行pull镜像,否则可能遇到No such image: nginx:latest问题。

2. 发布一个Service

通过docker serivce create向集群发布一个service:

# --replicas指定副本个数,--network指定运行网络,--name指定容器名,-p指定映射端口
docker service create --replicas 3 --network service-nginx --name my_nginx -p 8888:80 nginx

执行结果如下:

在这里插入图片描述
可见,当前有3个nginx副本已经启动起来了,并且均为running状态。

3. 查看Service执行情况

可通过docker service ls命令查看该service状态,其中的REPLICAS代表已创建和已运行的副本数(3/3):

在这里插入图片描述

4. 查看Service执行节点

可通过docker service ps 命令,查看该service发布到了哪些节点上:

# 指定容器名称
docker service ps my_nginx

结果如下:

在这里插入图片描述

此时,你可以登录其中一个worker节点,通过docker ps查看容器运行情况:

在这里插入图片描述

5. 验证nginx应用

如以上均执行完成,可通过浏览器打开以下地址,获得惊喜:
http://10.11.12.70:8888/
http://10.11.12.73:8888/
http://10.11.12.74:8888/

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

结语

Docker Swarm以它简洁、高效、容错的机制,为我们的服务提供了一套完整的分布式部署和运维的解决方案,同时它以swarmkit方式内嵌于docker引擎中。不管是对开发、运维还是其他爱好者,均有不错的使用体验。

作为一个集群爱好者,相信此文章会给带来不一样的体验,希望有助于你!


系列回顾

微服务实战系列之玩转Docker(九)
微服务实战系列之玩转Docker(八)
微服务实战系列之玩转Docker(七)
微服务实战系列之玩转Docker(六)
微服务实战系列之玩转Docker(五)
微服务实战系列之玩转Docker(四)
微服务实战系列之玩转Docker(三)
微服务实战系列之玩转Docker(二)
微服务实战系列之玩转Docker(一)
微服务实战系列之云原生

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快速选型:9款高效人事薪酬管理工具推荐
  • Redis 集群三主三从配置
  • uniapp 中 web-view 向 App 传递消息
  • Excel设置根据A列是否符合某条件设置B列字体属性
  • OpenDDS的Rtps_Udp传输协议可靠性QoS收发基本流程
  • 关于Qt的系统总结
  • World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
  • Hadoop之HDFS文件上传源码解析
  • StackStorm自动化平台
  • 【通天星主动安全监控云平台信息泄露漏洞】
  • MySQL数据库入门,pycharm连接数据库—详细讲解
  • 算法的学习笔记—调整数组顺序使奇数位于偶数前面(牛客JZ21)
  • CSS的:valid和:invalid伪类:增强表单验证的视觉反馈
  • PyTorch 基础学习(7)- 自动微分
  • 【计算机人接私活】手把手教你上手挖到第一个漏洞,从底薪3k到月入过万,只有一步之遥!
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【面试系列】之二:关于js原型
  • C++类的相互关联
  • Django 博客开发教程 16 - 统计文章阅读量
  • Java 多线程编程之:notify 和 wait 用法
  • Mysql优化
  • Nodejs和JavaWeb协助开发
  • oldjun 检测网站的经验
  • SAP云平台里Global Account和Sub Account的关系
  • spring security oauth2 password授权模式
  • springboot_database项目介绍
  • Vue.js-Day01
  • 闭包,sync使用细节
  • 解析 Webpack中import、require、按需加载的执行过程
  • 数组大概知多少
  • k8s使用glusterfs实现动态持久化存储
  • MyCAT水平分库
  • zabbix3.2监控linux磁盘IO
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (26)4.7 字符函数和字符串函数
  • (4)logging(日志模块)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (不用互三)AI绘画工具应该如何选择
  • (差分)胡桃爱原石
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (推荐)叮当——中文语音对话机器人
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)甲方乙方——赵民谈找工作
  • .bat文件调用java类的main方法
  • .gitattributes 文件
  • .gitignore文件_Git:.gitignore
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET+WPF 桌面快速启动工具 GeekDesk