编配,大概描述了自动配置、协作、管理服务的过程。
在Docker中,编配用于描述一组实践过程,这个过程会管理运行在多个Docker容器里的“应用”,而这些Docker容器有可能运行在多个宿主机上。
编配工具分为三类:
后面主要介绍这三类工具。
#2 Consul
演示配合Consul的分布式应用使用
Docker中的DNS由Consul提供。
#3 Docker Swarm
集群管理工具。
将一组Docker主机作为一台单独的Docker主机来管理,将多台主机作为集群,通过Docker API的形式提供服务,不需要新的API。对于与Docker集成的工具,Swarm集群不过是另外的一个Docker主机。
# 创建Swarm集群
安装:Docker 1.4.0+;各个节点的版本要统一:
#!/bin/sh # 假设我们由两台主机:HostA - 10.0.0.125;HostB - 10.0.0.135; ################################################################################ # 官方提供了镜像 ################################################################################ docker pull swarm # on HostA docker pull swarm # on HostB ################################################################################ # 创建swarm集群 ################################################################################ # 「服务发现」:集群发现可以使用多种后端:Consul, Zookeeper, etcd。 # 也可以使用Docker Hub,它允许用户在Dokcer Hub中创建一个集群,返回一个集群ID,使用集群ID向集群中添加额外的节点。 docker run --rm swarm create # 任意主机 # poiefhoiahfdoashfoiehfasohdfisdfoiafads # 该命令返回的内容为一个集群的ID,利用这个ID向集群中添加节点。 # 「节点代理」:每台主机上都要运行swarm节点代理,用于将docker节点注册到集群中。 # HostA docker run -d swarm join --addr=10.0.0.125:2375 token://poiefhoiahfdoashfoiehfasohdfisdfoiafads # HostB docker run -d swarm join --addr=10.0.0.135:2375 token://poiefhoiahfdoashfoiehfasohdfisdfoiafads ################################################################################ # 管理swarm集群 ################################################################################ # 任意主机 docker run --rm swarm list token://poiefhoiahfdoashfoiehfasohdfisdfoiafads # 启动「集群管理」 docker run -d -p 2380:2375 swarm manage token://poiefhoiahfdoashfoiehfasohdfisdfoiafads # 端口2375是Docker的标准端口,然后就可以使用Docker客户端与该集群进行交互。 # 查看集群信息 docker -H tcp://localhost:2380 info # 创建容器节点 for i in `seq 1 6` do docker -H tcp://localhost:2380 run -d --name www-$i -p 80 nginx done # 创建6个Nginx容器,这些容器运行在不同的节点上。 # 这些容器运行在哪些节点上呢? # Swarm通过「过滤器(filter)」和「策略(strategy)」的结合来决定在哪个节点上运行容器。
# 过滤器
过滤器告知Swarm优先在哪个节点上运行容器的明确指令。
有五种过滤器:约束过滤器;亲和过滤器;依赖过滤器;端口过滤器;健康过滤器;
过滤器的完整列表及配置可以查看官方「Swarm filters」手册。
约束过滤器(constraint) – 在指定的节点运行
#!/bin/sh # 该过滤器需要为「节点」设置「标签」 docker daemon --lable datacenter=us-east1 # Docker还提供了一些Docker守护进程启动是标准的默认约束,包括内核、操作系统、执行驱动、存储驱动 # 使用如下命令,在指定的节点上启动容器 docker -H tcp://localhost:2380 run -e constraint:datacenter==us-east1 -d --name www-user1 -p 80 nginx # 使用约束条件(-e)会在设置了这个标签的Docker守护进程上启动容器。 # 标签过滤支持==和!=,也支持正则表达式。 docker -H tcp://localhost:2380 run -e constraint:datacenter==us-east* -d --name www-user1 -p 80 nginx
亲和过滤器(affinity) – 靠近某个容器运行
#!/bin/sh # 在包含www-use1容器的Swarm节点上运行 docker run -d --name www-use2 -e affinity:container==www-use1 nginx # 在不包含www-use1容器的Swarm节点上运行 docker run -d --name www-use2 -e affinity:container!=www-use1 nginx # 在拉去了指定镜像的节点上运行 docker run -d --name www-use2 -e affinity:image==nginx nginx # 也可以使用正则表达式 docker run -d --name www-use2 -e affinity:container==www-use* nginx
依赖过滤器(dependency) – 在具备指定卷或容器链接的节点上启动容器
端口过滤器(port) – 通过端口进行调度,在具有指定端口的节点上启动容器
#!/bin/sh docker -H tcp://localhost:2380 run -d --name haproxy -p 80:80 haproxy
健康过滤器(health) – 不再不健康的节点上创建容器
不健康的节点通常是指:「Swarm管理者」或者「发现服务」报告集群某个节点由问题。
通过swarm manager的--filter选项指定可用的过滤器。
# 策略
允许用户使用更隐式的特点还对容器进行调度,比如节点的资源数量。
三种策略:平铺、紧凑、随机。只有平铺和紧凑才能算是策略,默认是平铺。
使用swarm manager的–strategy指定可用的策略。
平铺策略:选择容器数最少的节点;
紧凑策略:通过CPU和资源进行打分,返回使用最紧凑的节点。保证资源的最大使用;
随机策略:随机选择一个节点来运行容器。生产环境不建议使用。
#4 其他的编配工具
编配工具有很多,主要分为两类:
服务发现;
Fleet & etcd
Fleet是一个集群管理工具,可以看作systemd的扩展,工作在集群层面。
etcd是一个键值数据库,用于共享配置和服务发现。
Fleet + systemd + etcd,为容器提供调度和管理能力
kubernetes
容器集群管理工具。关注于「需要使用多容器的应用程序」。
Apache Mesos
集群管理工具。
Helios
为了在全流程中发布和管理容器而设计的Docker般配平台。该工具创建一个抽象的「作业」,之后将这个「作业」发布到一个或者多个运行Docker的Helios主机。
Centruion
帮助开发者利用Docker做持续部署。
## 相关链接