Docker swarm部署云课堂

Swarm介绍

  • swarm的功能和k8s是一样的,但没有k8s的功能多,但可以通过脚本自行实现。Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Docker集群,它将一群Docker宿主机变成一个单一的,虚拟的主机。Swarm使用标准的Docker API接口作为其前端访问入口,换言之,各种形式的Docker Client(docker client in Go, docker_py, docker等)均可以直接与Swarm通信。Swarm几乎全部用Go语言来完成开发,Swarm0.2版本增加了一个新的策略来调度集群中的容器,使得在可用的节点上传播它们,以及支持更多的Docker命令以及集群驱动。Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受docker客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,它会收集重建集群信息。
  • Docker的Swarm(集群)模式,集成很多工具和特性,比如:跨主机上快速部署服务,服务的快速扩展,集群的管理整合到docker引擎,这意味着可以不可以不使用第三方管理工具。分散设计,声明式的服务模型,可扩展,状态协调处理,多主机网络,分布式的服务发现,负载均衡,滚动更新,安全(通信的加密)等等,下面就来认识下Swarm。

Swarm架构

Swarm作为一个管理Docker集群的工具,首先需要将其部署起来,可以单独将Swarm部署于一个节点。另外,自然需要一个Docker集群,集群上每一个节点均安装有Docker。具体的Swarm架构图可以参照下图:

Swarm架构中最主要的处理部分自然是Swarm节点,Swarm管理的对象自然是Docker Cluster,Docker Cluster由多个Docker Node组成,而负责给Swarm发送请求的是Docker Client。

Swarm关键概念

1、Swarm:集群的管理和编排是使用嵌入到docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm
2、Node:一个节点(node)是已加入到swarm的Docker引擎的实例 当部署应用到集群,你将会提交服务定义到管理节点,接着Manager管理节点调度任务到worker节点,manager节点还执行维护集群的状态的编排和群集管理功能,worker节点接收并执行来自manager节点的任务。通常,manager节点也可以是worker节点,worker节点会报告当前状态给manager节点
3、Service:服务是要在worker节点上要执行任务的定义,它在工作者节点上执行,当你创建服务的时,你需要指定容器镜像。一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。
4、Task:任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点。task是service的执行实体,task启动docker容器并在容器中执行任务。

swarm命令

docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)
docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)
docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help)

node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:
manager nodes——管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务
worker nodes——工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task

Swarm工作方式

1.Node

2.Service(服务, 任务, 容器)
3.任务与调度
4.服务副本与全局服务
Swarm调度策略

Swarm在scheduler节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random.
(1)Random:顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运行的容器的数量来计算应该运行容器的节点。

(2)Spread:在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。

(3)Binpack:Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

Swarm Cluster模式的特性

(1)批量创建服务
建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式

(2)强大的集群的容错性
当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,以及之前设定的值--replicasn,在集群中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的load balance依旧好使!不难看出,docker service其实不仅仅是批量启动服务这么简单,而是在集群中定义了一种状态。Cluster会持续检测服务的健康状态并维护集群的高可用性。

(3)服务节点的可扩展性
Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下面,如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"--replicas n"更换成"--mode=global"即可!
复制服务:将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“--replicas 3”。
全局服务:用于集群内全部可用节点上的服务任务,例如“--mode global”。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。

(4)调度机制
所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。


------------------Swarm cluster的创建过程包含以下三个步骤----------------------
(1)发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化
(2)初始化内部调度(scheduler)模块
(3)创建并启动API监听服务模块

一旦创建好这个cluster,就可以用命令docker service批量对集群内的容器进行操作,非常方便!
在启动容器后,docker 会根据当前每个swarm节点的负载判断,在负载最优的节点运行这个task任务,用"docker service ls" 和"docker service ps + taskID"可以看到任务运行在哪个节点上。容器启动后,有时需要等待一段时间才能完成容器创建。

swarm部署课堂

  • 创建两个节点分别为master和node节点:
IP地址主机名节点
192.168.20.101mastermaster节点
192.168.20.102nodenode节点
  • master和node节点修改/etc/hosts 文件:
192.168.20.101  master
192.168.20.102  node

安装Docker,这里博主学会用脚本啦!

  • master节点创建docker.sh 并编写,内容如下:
#!/bin/bash
#修改主机名
hostnamectl set-hostname master
#一键关闭防火墙
systemctl disable firewalld;systemctl stop firewalld
#安装基础命令
yum install vim net-tools tree lrzsz bash-completion wget -y
#修改selnux/config文件
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
#命令关闭安全策略
setenforce 0
#安装软件包(提供实用程序)并设置稳定的存储库。
yum install -y yum-utils
#更换yum源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#测试通道
yum-config-manager --enable docker-ce-nightly

yum-config-manager --enable docker-ce-test

yum-config-manager --disable docker-ce-nightly
#安装最新版本的 Docker 引擎
yum install docker-ce-18.06.0.ce-3.el7 -y
#重新启动docker
systemctl restart docker;systemctl enable docker
#安装时间服务器
yum install chrony -y
#修改时间服务文件
sed -in '3,6d' /etc/chrony.conf
sed -i '2a server ntp3.aliyun.com iburst' /etc/chrony.conf
sed -i '3a allow all' /etc/chrony.conf
#重启时间服务
systemctl enable chronyd.service ;systemctl restart chronyd.service
  • node节点创建docker.sh 并编写,内容如下:
#!/bin/bash
#修改主机名
hostnamectl set-hostname node
#一键关闭防火墙
systemctl disable firewalld;systemctl stop firewalld
#安装基础命令
yum install vim net-tools tree lrzsz bash-completion wget -y
#修改selnux/config文件
sed -i s#SELINUX=enforcing#SELINUX=disabled# /etc/selinux/config
#命令关闭安全策略
setenforce 0
#安装软件包(提供实用程序)并设置稳定的存储库。
yum install -y yum-utils
#更换yum源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#测试通道
yum-config-manager --enable docker-ce-nightly

yum-config-manager --enable docker-ce-test

yum-config-manager --disable docker-ce-nightly
#安装最新版本的 Docker 引擎
yum install docker-ce-18.06.0.ce-3.el7 -y
#重新启动docker
systemctl restart docker;systemctl enable docker
#安装时间服务器
yum install chrony -y
#修改时间服务文件
sed -in '3,6d' /etc/chrony.conf
sed -i '2a server master iburst' /etc/chrony.conf
#重启时间服务
systemctl enable chronyd.service ;systemctl restart chronyd.service

查看时间是否同步成功:

  • master节点:
[root@master ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 203.107.6.88                  2   6   377    71    -85ms[  -89ms] +/-  132ms
  • node节点:
[root@node ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* master                        3   6    17    48    +15us[-1121us] +/-   92ms是
  • master节点上传文件:文件如下
-rw-r--r--. 1 root root    8894241 May 24 15:02 apache-tomcat-7.0.56.tar.gz
-rw-r--r--. 1 root root      39730 May 24 15:02 course.sql
-rw-r--r--. 1 root root  185515842 May 24 15:02 jdk-8u144-linux-x64.tar.gz
-rw-r--r--. 1 root root 1324027974 May 24 15:23 mall-swarm.tar.gz
-rw-r--r--. 1 root root  116441723 May 24 15:03 ROOT.war
  • 在master节点编写run.sh 脚本:不需要运行!
#!/bin/bash
mysql_install_db --user=mysql
#初始化数据库
(mysqld_safe&) | grep a
sleep 3s
ps -A
netstat -ntpl
#查看mysql所有端口是否打开
sleep 3s
mysqladmin -u root password '123456'
#设置数据库的密码为123456
sleep 3s
mysql -uroot -p123456 -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' "
#给root用户授予权限
sleep 3s
mysql -uroot -p123456 -e "create database course;use course;source /opt/course.sql; "
#创建course并且导入数据
sleep 3s
  • 在master节点编写local.repo 源文件:
[local]
name = local
baseurl = file:///opt/mall-swarm/mall-repo
gpgcheck = 0
enabled = 1
  • 在master节点编写:Dockerfile文件
FROM centos:centos7.6.1810
#基础镜像这里我选择centos7.6.1810

#配置yum源
ADD mall-swarm.tar.gz /opt
#上传并解压是拥有mariadb数据包 /opt #解压到opt目录
RUN rm -rf /etc/yum.repos.d/*
#删除所有repo的文件
RUN yum remove -y mariadb*
#删除镜像自带的mariadb
ADD local.repo /etc/yum.repos.d/
#将自己写的repo文件上传至镜像中/etc/yum.repo.d/目录
RUN yum install -y mariadb-server vim net-tools wget
#安装必要的工具 主要mariadb
RUN yum clean all
#清理缓存
ADD jdk-8u144-linux-x64.tar.gz /usr/local
#将jbk包上传并解压至/usr/local目录
ENV JAVA_HOME=/usr/local/jdk1.8.0_144
ENV CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
ENV PATH=$PATH:$JAVA_HOME/bin
#配置java的环境变量
ADD apache-tomcat-7.0.56.tar.gz /opt
#将tomcat解压到opt
RUN mv /opt/apache-tomcat-7.0.56 /opt/apache
#将apache文件命名为apache
COPY ROOT.war /opt/apache/webapps/
#将ROOT.war包 移动到/opt/apache/webapps/目录
COPY course.sql /opt/
#将course.sql文件移动到opt/下
ADD run.sh /opt
#将初始化数据库的脚本移动到 /opt/下
RUN chmod +x /opt/run.sh
#给脚本添加运行权限
RUN source /opt/run.sh
#运行脚本
ENV LC_ALL en_US.UTF8
#配置环境变量 设置数据库使用UTF-8格式编码
RUN rm -rf /opt/apache/webapps/ROOT
#删除原生的webapps目录下的ROOT
RUN cd /opt/apache/bin/ && bash shutdown.sh
#运行shutdown.sh
RUN cd /opt/apache/bin/ && bash startup.sh
#启动tomcat
EXPOSE 3306 8080
#开放端口
CMD ["mysqld_safe"]
  • 在master节点运行Dockerfile文件:
docker build -t ketang  .
  • 创建容器:
docker run -dit -p 8080:8080 --name ketang ketang
  • 进入容器,在进入/opt/apache/bin/ 目录:执行脚本
docker exec -it ketang /bin/bash

./shutdown.sh

./startup.sh

访问网页IP地址:8080 :

  • 打包镜像文件:
docker save -o wen.war ketang
  • 发送打包的镜像文件给node节点:
scp wen.war root@192.168.20.102:/root/
  • node节点解压镜像:
docker load -i wen.war

master创建集群node加入集群:

加入集群点击Docker 容器编排应用这里面有写

  • moster节点,使用 docker service 命令基于 ketang镜像创建服务:
docker service create --replicas 1 --name yunketang -p 8080:8080 ketang
  • moster节点,扩展yunketang容器服务至所有节点:
docker service scale yunketang=2
  • 查看各个所在节点:
docker service scale yunketang=2

master和node节点都进入容器:

  • master节点:
docker exec -it yunketang.1.10hc9h094xu1gnifov1wyoqwp /bin/bash
  • 进入/opt/apache/bin/ 目录下:执行脚本
./shutdown.sh
./startup.sh
  • node节点:
docker exec -it yunketang.2.qortnwul1f87uhj5xax9hyqdj /bin/bash
  • 进入/opt/apache/bin/ 目录下:执行脚本
./shutdown.sh
./startup.sh

两个节点都去访问网页:

  • master节点IP地址:8080
  • node节点IP地址:8080

版权声明:
作者:小李
链接:https://xianshengli.cc/docker-swarm%e9%83%a8%e7%bd%b2%e4%ba%91%e8%af%be%e5%a0%82/
来源:先生不吃香菜
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Docker swarm部署云课堂
Swarm介绍 swarm的功能和k8s是一样的,但没有k8s的功能多,但可以通过脚本自行实现。Swarm是Docker公司在2014年12月初发布的一套较为简单的工具,用来管理Do……
文章目录
关闭
目 录