「Docker」- 容器编排与服务发现

编配,大概描述了自动配置、协作、管理服务的过程。

在Docker中,编配用于描述一组实践过程,这个过程会管理运行在多个Docker容器里的“应用”,而这些Docker容器有可能运行在多个宿主机上。

编配工具分为三类:

简单的容器编配工具:比如Docker Compose(前身为Fig)

分布式服务发现:比如Consul,由Go语言开发。

Docker的编配和集群:比如Swarm,由Go语言编写,由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做持续部署。

## 相关链接

Compose file reference