首页 > 代码库 > docker swarm集群
docker swarm集群
Docker1.12+swrmkit
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容器执行器(Docker Container Executor)。
(1)内建分布式存储,不要额外的数据库
(2)支持Rolling update
(3容器高可用
(4)通过TLS保证了节点之间通讯的安全
管理节点(Manager):负责接收和响应用户请求,将集群状态调节到最终状态。在SwarmKit中,用户可以动态调整节点的角色,即在Manager和Worker之间转换。
如下图所示,这是一个典型的master-slave的架构。每个节点都是运行着Docker Engine的Docker主机。一些节点有更高的权限,被称为Manager。下面的节点是worker节点,接收来自manager组的任务指示。
部署docker.12 Swarm
实验环境:
1 )这里选择三台主机运行Swarm,依次为:
Vim /etc/hostname (更改好执行bash使其生效)
node1192.168.1.104
node2192.168.1.105
node3192.168.1.113
2) 基本环境配置
3台主机确保时间一致
三台主机以实现时间同步
3台主机均关闭selinux,开启路由转发。
3 )系统环境准备
准备系统环境, 配置host列表
3台主机均修改/etc/hosts文件,添加所有主机的ip地址和主机名的映射记录
4 ) 3台主机开启宿主机之间的端口
TCP端口2377集群管理端口
TCP与UDP端口7946节点之间通讯端口
TCP与UDP端口4789 overlay网络通讯端口
(以host1 为例,)
5 )配置所有节点密钥登录.
配置所以节密钥互信, 在node1可以免密码登录各节点,只在node1上执行:
生成sshkey
发布sshkey到各个节点
把/root/.ssh目录下的id_rsa.pub公钥发布给其它两台node主机上,发布给那台主机,就在那台主机的/root/.ssh目录下生产authorized.key文件,其内容和node1的id_rsa.pub一样
测试密钥登录
6 )在所有节点上安装docker 1.12(如果没有docker 1.12软件包,按照docs.docker.com官网安装)
添加docker repo文件
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
安装docker package
yum -y install docker-engine
我这里已经有下载好的docker1.12软件包,所以不适用上面提供的方法,直接使用rpm在三台主机上都安装
(以host1 为例)
检查docker版本
docker1.12 Swarm 模式简介
Docker Engine 1.12 集成了Swarm集群工具.
主要使用三个新的命令行工具创建一个swarm集群:
docker swarm 开启swarm模式; 加入Swarm集群; 配置集群参数
docker node 查询集群节点信息; 提升/移除一个管理节点; 管理swarm节点主机
docker service 创建管理 service
可以查看docker --help
创建 Swarm集群
在node1上初始化swram集群:
注意 你只需要在一个node1上初始化swarm集群, 其他node加入这个集群就行了, 所以以下命令只需要在node1上运行.
解释:根据如上命令的提示:
我们的其他节点服务器,以worker角色加入swarm集群需要登录到服务器运行如下命令:
以manager角色加入swarm集群:
--advertise-addr参数, 后面跟你swarm集群的通讯地址, 也就是node1的地址.
查看端口号监听情况
检查node1 docker swarm mode信息:
查看swarm集群node列表
可以看到,我们的swarm集群中只有一个节点.现在我们把其他节点加入我们的集群中:
把其他节点加入集群中:
注: 如果你不记得上面提示的加入swarm集群的命令和密钥可以使用如下方式查看worker节点和manager节点的加入命令
在node1通过ssh, 在node2-node3上执行上面的加入集群命令:
再次检查集群节点列表, 我们可以看到所有的服务器都已经加入swarm集群了
不过现在集群只有一个manager节点node1, 为了swarm集群的高可用,和避免单点故障. 我们希望建立多个manager节点集群.
只需要通过如下命令, 提升worker节点成manager节点:并
查看node2的docker info
现在我们可以看到, 已经有2个manager节点了, 一个Leader节点, 一个Reachable节点. 现在你也可以在node2上面管理整个swarm集群.
我们的swarm集群就搭建完毕了.
习惯使用docker命令帮助:docker<command> --help
总结:
docker swarm:集群管理,子命令主要有下面几个。
dockerswarm init命令用于初始化一个集群
dockerswarm join命令用于加入一个现有集群
dockerswarm leave命令由于离开集群
附: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主机本地存在容器镜像。
所以搭建一个私有仓库,由私有仓库提供所需要的镜像,
本实验环境中用node2同时作为registry。
拉取本地私有仓库registry,查看registry镜像
1开启路由转发
vi /etc/sysctl.cof
添加net.ipv4.ip_forward=1
执行sysctl -p使修改生效
2 将registry2.tar导入到本地,并查看
Registry1和registry2版本的区别
1 registry1是python语言写的,而现在registry2版本即docker distribution更加安全和快速,并且是用go语言写的。
基于私有仓库镜像运行容器
2默认情况下,registry2会将仓库存放于容器的/var/lib/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/var/lib/registry下,两个目录下都有!
·registry的默认存储路径是/var/lib/registry,只是个临时目录,一段时间之后就会消失
·所以使用-v参数,指定个本地持久的路径,
返回{"repositories":[]} 说明registry服务工作正常.
注:镜像信息存放在/var/lib/registry目录下,因此这里将宿主机目录映射到/var/lib/registry
私有仓库已搭建完毕
所有主机都指向registry服务器:(以node1为例,其他两台主机作相同的配置)
停止docker服务
重载docker服务并启动docker服务
测试本地镜像仓库
有了本地镜像仓库registry, 现在我们推送一个测试镜像到本机镜像仓库, 测试下registry服务.
测试:在node1主机上推送镜像到registry
如果想把镜像推送到本地registry.
需要先tag这个镜像的名字成<registry>/<image name>:<tag>,并查看镜像
将tag后的镜像上传到registry.
push成功后, 可以调用registry API查看 registry中的镜像
在node3主机测试从registry下载镜像,并查看
overlay网络
解决了镜像构建问题, 为了让应用跑在swram集群上,我们还需要解决容器间的网络访问问题.
单台服务器的时候我们应用所有的容器都跑在一台主机上, 所以容器之间的网络是互通的. 现在我们的集群有3台主机, 所以docker应用的服务会分布在这3台主机上.
如何保证不同主机上的容器网络互通呢?
swarm集群已经帮我们解决了这个问题了,就是只用overlay network.
在docker 1.12以前, swarm集群需要一个额外的key-value存储(consul, etcdetc). 来同步网络配置, 保证所有容器在同一个网段中.
在docker 1.12已经内置了这个存储, 集成了overlay networks的支持.
下面我们演示下如何创建一个 overlay network:
注:swarm上默认已有一个名为ingress的overlay 网络, 可以直接使用, 但本文会创建一个新的
为我们的docker应用创建一个名为dockercoins的overlay network
查询docker network 列表
在网络列表中你可以看到dockercoins网络的SCOPE是swarm, 表示该网络在整个swarm集群生效的, 其他一些网络是local, 表示本机网络.
你只需要在manager节点创建network, swarm集群会自动处理配置到其他的节点,这是你可以查看其他节点的network. dockercoins网络已经都创建了.:
注:一旦新的任务被指定给这个节点,Overlay网络就会被按需创建。
在swarm集群上运行docker应用
概念解释:service
Docker1.12 swarm引入了服务的概念,一个服务由多个任务组成,一个任务即一个运行的容器。
服务包括两种类型:
复制服务(replicated services):类似 k8s 中复制集的概念,保持一定数量的相同任务在集群中运行;
全局服务(global services):类似 k8s 中 daemon 的概念,每个工作节点上运行一个。
发布服务:
在manager上执行如下命令:
下面我们可以使用之前push到本地镜像仓库的镜像启动服务, 以centos:http为例:
以复制服务类型运行服务
在manager上执行如下命令:
docker service create命令创建一个 service.
--name标签命名service为web1.
--replicas标签来声明1个运行实体(即容器副本数)
注意, 我们启动的镜像名字192.168.1.104:5000/centos:http使用我们本地镜像仓库的镜像名称, 这样当主机上没有这个镜像时, 会自动到本地镜像仓库拉取镜像.
使用docker service ls查看服务
docker service inspect命令用户查看service详细信息
使用docker service ps <SERVICE-ID/NAME>查看服务运行在哪个节点上
现在你可以用浏览器访问http://192.168.1.104:8000 就能访问测试页
事实上, 你可以访问swarm集群中的所有节点 192.168.1.105、192.168.1.113的8000端口, 都可以访问测试页。(注:将firewall防火墙默认区域设置为trusted)
在manager上执行如下命令:
--replicas标签来声明2个运行实体
查看服务:(需等待一会,才会显示REPLICAS)
从上图可以看到web2名称的service有2个副本分别运行在node2和node3节点上。
以全局服务类型运行服务
从下图可以看到服务web4在每个节点上都运行一个
下面我们扩展旧的服务,从下图可以看到web1 service目前只有一个副本
扩展已有的服务的副本数,这里将web1服务扩展到3个副本
缩减已有的服务的副本数,这里将web1服务缩减到2个副本
Swarm节点是自组织(self-organizing)和自修复(self-healing)的,什么意思?只要有节点或容器宕掉,swarm engine就会尝试修复,下面我们来具体看一下
自修复(self-healing)
经过上面的操作之后,我们有以下3个节点:
运行着3个服务共7个任务(容器)
Node2节点上运行着容器3个容器还有一个私有仓库注册服务器容器
Node1节点上运行着容器2个容器
Node3节点上运行着容器2个容器
现在我们让node3上的容器都宕掉或部分宕掉
一旦node3上所有容器停止,Docker就会试图在相同的节点上启动2个不同ID的容器。
这就是Docker Swarm Engine的self-healing功能。
在node3节点上执行docker ps查看
Self-Organizing
现在我们让node3整个宕掉,node3上的容器会自动在其它节点上启动。
在manager节点上执行docker server ps 服务名
总结:docker swarm 既能实现容器的高可用,也能实现负载均衡
本文出自 “12179708” 博客,谢绝转载!
docker swarm集群