Docker Swarm 是什么?

Docker Swarm是一个用于创建Docker主机(运行Docker守护进程的服务器)集群的工具,使用Swarm操作集群,会使用户感觉就像是在一台主机上进行操作

docker1.12集成了swarmkit,使你可以不用安装额外的软件包, 使用简单的命令启动创建docker swarm集群。

如果你在运行Docker 1.12时,你就可以原生创建一个Swarm 集群.

集成了swarm集群的安全特性, 集成了K-V存储,你现在不需要额外部署etcd或者consul。

在Docker1.12版本中,一个大的功能点是swarm集群(基于swarmkit项目),通过Docker命令可以直接实现docker-engine相互发现,并组建成为一个容器集群。

SwarmKit将节点分为两类:

 

工作节点(Worker:负责通过执行容器运行任务。SwarmKit的默认执行器为Docker容器执行器(DockerContainer Executor)。

1)内建分布式存储,不要额外的数据库

2)支持Rolling update

3 ) 容器高可用

4)通过TLS保证了节点之间通讯的安全

 

管理节点(Manager:负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在ManagerWorker之间转换。

如下图所示,这是一个典型的master-slave的架构。每个节点都是运行着Docker EngineDocker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。

Docker Swarm

部署docker1.12 Swarm

实验环境:

这里选择三台主机运行Swarm,依次为:

node1       192.168.157.128

node2       192.168.157.129

node3       192.168.157.130

基本环境配置

3台主机确保时间一致ntp

3台主机均关闭selinux,开启路由转发。

3台主机根据上面的实验环境描述修改主机名和ip地址

系统环境准备

准备系统环境, 配置host列表

3台主机均修改/etc/hosts文件,添加所有主机的ip地址和主机名的映射记录以node1为例子:

Docker Swarm

开启宿主机之间的端口

TCP端口2377集群管理端口

TCPUDP端口7946节点之间通讯端口

TCP与UDP端口4789overlay网络通讯端口

Docker Swarm

配置所有节点**登录.

配置所下节点**互信, node1可以免密码登录各节点,只在node1上执行:生成sshkey

Docker Swarm

发布sshkey到各个节点

Docker Swarm

测试**登录

Docker Swarm

安装docker 1.12(按照docs.docker.com官网安装)

在所有节点上安装docker 1.12:以下命令请在所有节点上执行.

添加dockerrepo文件

rm -rf/etc/yum.repos.d/*

tee /etc/yum.repos.d/docker.repo<<-'EOF'

[dockerrepo]

name=Docker Repository

baseurl=https://yum.dockerproject.org/repo/main/centos/7/

enabled=1

gpgcheck=1

gpgkey=https://yum.dockerproject.org/gpg

EOF

安装dockerpackage

yum-y installdocker-engine

启动docker

Docker Swarm

检查docker docker版本

Docker Swarm

docker1.12 Swarm 模式简介

Docker Engine 1.12集成了Swarm集群工具.

主要使用三个新的命令行工具创建一个swarm集群:

docker swarm开启swarm模式;加入Swarm集群; 配置集群参数

docker node查询集群节点信息; 提升/移除一个管理节点; 管理swarm节点主机

docker service创建管理service

创建Swarm集群

node1上初始化swram集群:

注意你只需要在一个node1上初始化swarm集群,其他node加入这个集群就行了, 所以以下命令只需要在node1上运行.

Docker Swarm

解释:根据如上命令的提示:我们的其他节点服务器,以worker角色加入swarm集群需要登录到服务器运行如下命令:

Docker SwarmDocker Swarm

--advertise-addr参数,后面跟你swarm集群的通讯地址, 也就是node1的地址.

查看端口号监听情况

Docker Swarm

检查node1 docker swarm mode信息:

#docker  info

显示信息如下:

Docker Swarm

查看swarm集群node列表

Docker Swarm

注:如果你不记得上面提示的加入swarm集群的命令和**可以使用如下方式查看worker节点和manager节点的加入命令

Docker Swarm

不过现在集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 我们希望建立多个manager节点集群.

只需要通过如下命令, 提升worker节点成manager节点:

[[email protected] ~]#docker node promote node2

Docker Swarm

查看node2docker  info

Docker Swarm

现在我们可以看到, 已经有2manager节点了, 一个Leader节点, 一个Reachable节点. 现在你也可以在node2上面管理整个swarm集群.

我们的swarm集群就搭建完毕了. 超级简单

习惯使用docker命令帮助:docker<command> --help

总结:

dockerswarm:集群管理,子命令主要有下面几个。

dockerswarminit命令用于初始化一个集群

dockerswarm join命令用于加入一个现有集群

dockerswarmleave命令由于离开集群

附:node 下线

有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务不可用。使用 docker node update --availability drain <NODE-ID>将节点下线,swarm 会将当前节点上的容器关闭并在其他节点上启动。当维护完成,需要上线是,将节点状态修改为 active状态即可,命令如下:docker node update --availability active <NODE-ID>

有了 Docker Swarm 集群我们如何把我们的应用跑在 Swarm 集群上呢?

很简单, 基本上原来我们使用 docker run 的命令创建容器, 把前面替换成 docker service create 就行了.

建议搭建一个registry,为所的 docker 主机提供镜像下载,否则你需要在每个 docker 主机本地存在容器镜像。

所以搭建一个私有仓库,由私有仓库提供所需要的镜像,

本实验环境中用 node1 同时作为 registry

拉取本地私有仓库registry,查看 registry 镜像

开启路由转发

vi /etc/sysctl.cof

添加 net.ipv4.ip_forward=1

执行 sysctl -p 使修改生效

#docker pull registry:2

#docker images

Docker Swarm

附:registry1 python 语言写的,而现在registry2 版本即 docker distribution 更加安全和快速,并且是用 go 语言写的。

基于私有仓库镜像运行容器

默认情况下,registry2 会将仓库存放于容器的/var/lib/registry 目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/var/lib/registry 下,两个目录下都有!

·registry 的默认存储路径是/var/lib/registry,只是个临时目录,一段时间之后就会消失

·所以使用-v 参数,指定个本地持久的路径,

Docker SwarmDocker Swarm

返回{"repositories":[]} 说明 registry 服务工作正常.

注:镜像信息存放在/var/lib/registry 目录下,因此这里将宿主机目录映射到/var/lib/registry

所有主机都指向 registry 服务器:

停止 docker 服务         

#systemctl stop docker

修改/usr/lib/systemd/system/docker.service,修改后保存退出

Docker Swarm

重载 docker 服务并启动 docker 服务

#systemctl daemon-reload

#systemctl startdocker

测试本地镜像仓库

有了本地镜像仓库 registry, 现在我们推送一个测试镜像到本机镜像仓库, 测试下 registry 服务.

测试:在 node2 主机上推送镜像到 registry

如果想把镜像推送到本地 registry.

需要先 tag 这个镜像的名字成<registry>/<image name>:<tag>

Docker Swarm

将 tag 后的镜像上传到 registry.

有可能会上传不成功重启一下docker就好了

Docker Swarm

push 成功后, 可以调用 registry API 查看 registry 中的镜像

Docker Swarm

在 node3 主机测试从 registry 下载镜像

Docker Swarm

overlay 网络

解决了镜像构建问题, 为了让应用跑在 swram集群 上,我们还需要解决容器间的网络访问问题.

单台服务器的时候我们应用所有的容器都跑在一台主机上, 所以容器之间的网络是互通的.

现在我们的集群有 3 台主机, 所以 docker 应用的服务会分布在这 3 台主机上.

如何保证不同主机上的容器网络互通呢?

swarm 集群 已经帮我们解决了这个问题了,就是只用 overlay network .

在 docker 1.12 以前, swarm 集群需要一个额外的 key-value 存储(consul, etcd). 来同步

网络配置, 保证所有容器在同一个网段中.

在 docker 1.12 已经内置了这个存储, 集成了 overlay networks 的支持.

下面我们演示下如何创建一个 overlay network:

注:swarm 上默认已有一个名为 ingress 的 overlay 网络, 可以直接使用, 但本文会创建一个新的为我们的 docker 应用创建一个名为 dockercoins 的 overlay network

Docker Swarm

查询 docker network 列表

Docker Swarm

在网络列表中你可以看到 dockercoins 网络的 SCOPE 是 swarm, 表示该网络在整个 swarm 集群生效的, 其他一些网络是 local, 表示本机网络.

你只需要在 manager 节点创建 network, swarm 集群会自动处理配置到其他的节点,这是你可以查看其他节点的 network. dockercoins 网络已经都创建了.:

 

:一旦新的任务被指定给这个节点,Overlay 网络就会被按需创建。

 

swarm 集群上运行 docker 应用

概念解释:service

Docker1.12 swarm 引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器。服务包括两种类型:

复制服务(replicatedservices):类似 k8s 中复制集的概念,保持一定数量的相同任务在集

群中运行;

全局服务(global services):类似 k8s daemon 的概念,每个工作节点上运行一个

 

发布服务:

manager 上执行如下命令:

下面我们可以使用之前 push 到本地镜像仓库的镜像启动服务, centos:http 为例:


复制服务类型运行服务

manager 上执行如下命令:

Docker Swarm

docker service create 命令创建一个 service.

--name 标签命名 service web1.

--replicas 标签来声明 1 个运行实体(即容器副本数)

注意, 我们启动的镜像名字 192.168.157.128:5000/centos:http 使用我们本地镜像仓库的镜像名称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像.

使用 docker service ls查看服务

Docker Swarm

dockerservice inspect 命令用户查看 service 详细信息

 

使用 dockerserviceps<SERVICE-ID/NAME>查看服务运行在哪个节点上

Docker Swarm

现在你可以用浏览器访问http://192.168.157.128:8080 就能访问测试页

Docker Swarm

事实上, 你可以访问swarm集群中的所有节点 192.168.157.129192.168.157.1308000端口, 都可以访问测试页。(注:将 firewall 防火墙默认区域设置为 trusted

 

manager 上执行如下命令:

Docker Swarm

这个要过一会才能够启动     可能是因为他本地没有镜像正在下载所导致的

 

--replicas 标签来声明 2 个运行实体

查看服务:

Docker Swarm

从上图可以看到 web 名称的 service 2 个副本分别运行在 node2 node3 节点上。

 

全局服务类型运行服务

Docker Swarm

从下图可以看到服务 web4 在每个节点上都运行一个

Docker Swarm

下面我们扩展旧的服务,从下图可以看到 web1 service 目前只有一个副本

Docker Swarm

扩展已有的服务的副本数,这里将 web1 服务扩展到 3 个副本

Docker Swarm

缩减已有的服务的副本数,这里将 web1 服务缩减到 2 个副本

Docker Swarm


Swarm 节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节

点或容器宕掉,swarm engine 就会尝试修复,下面我们来具体看一下

自修复(self-healing)

经过上面的操作之后,我们有以下 3 个节点:

Docker Swarm

运行着 3 个服务共 7 个任务(容器)

Docker Swarm

Node1 节点上运行着容器 3 个容器还有一个私有仓库注册服务器容器

Docker Swarm

Node2 节点上运行着容器 3 个容器

Docker Swarm

Node3 节点上运行着容器 2 个容器

Docker Swarm

现在我们让 node3 上的容器都删除掉

docker rm -f $(docker ps -qa)

一旦 node3 上所有容器删掉,Docker 就会试图在这个节点上启动 2 个不同 ID 的容器。

这就是 Docker Swarm Engine 的 self-healing 功能。

在 node3 节点上执行 dockerps 查看

 

Self-Organizing

现在我们让 node3 整个宕掉,node3 上的容器会自动在其它节点上启动。

在 manager 节点上执行 docker server ps 服务名

分类:

技术点:

相关文章: