Docker新手入门之七:Docker编配工具介绍
2018-02-18T15:16:18
1622
0
0
#### Docker的编配是指容器的自动配置、协作和服务管理的过程。
#### 编配常常用于描述一组实践过程。通常会管理运行在多个Docker容器里面的应用,有时这些Docker容器也会运行在多个宿主机上。
#### 本文中,我们将主要讲解众多编配工作中的两种,分别是适用于简单容器编配的Fig以及管理分布式服务的Consul。
## Fig
### 安装
Fig是基于Python编写的一款Docker编配工具,可以执行使用Python的包管理工具`pip`来进行安装:
```bash
pip install -U fig
```
安装完成后可以执行如下命令来查看`fig`的版本:
```
fig 1.0.1
```
### 示例服务演示
为了演示Fig的工作原理,我们以一个Python Flask服务为例进行讲解。
该示例需要使用如下两个容器:
- 应用容器,运行Python代码
- Redis容器,运行Redis数据库
下面开始构建应用容器镜像:
```
mkdir figapp
cd figapp
touch Dockerfile
```
编辑`Dockerfile`如下:
```
FROM python:2.7
MAINTAINER nianshi
ENV REFRESHED_AT 2018-02-18
ADD . /figapp
WORKDIR /figapp
RUN pip install -r requirements.txt
```
接下来,我们需要在当前目录下创建如下两个文件:`app.py`程序运行文件及`requirements.txt`依赖库文件。
其中`app.py`文件内容如下:
```
from flask import Flask
from redis import Redis
import os
app = Flask(__name__)
redis = Redis(host="redis", port=6379)
@app.route('/')
def hello():
redis.incr('hits')
return 'Hello Docker Book reader! I have been seen {0} times'.format(redis.get('hits'))
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
```
`requirements.txt`文件内容如下:
```
flask
redis
```
这个简单的Flask服务的作用就是统计页面被访问的次数。
整体Dockerfile文件的作用也相对简单,首先就是将源代码加载至容器中,此外就是安装Flask服务依赖的一些第三方库。
下面,我们来构建该镜像:
```
docker build -t nianshi/figapp .
```
### fig.yml
现在,应用服务的镜像已经准备完成了,我们可以配置Fig来创建需要的服务了。
使用Fig,可以定义一组服务之间的相互关系,只要我们将这些配置信息都写入一个YAML的文件中,执行`fig up`命令即可启动这些容器。
首先,我们来创建一个`fig.yml`文件:
```
web:
image: nianshi/figapp
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/figapp
links:
- redis
redis:
image: nianshi/redis_base
command: redis-server
```
对于每个服务(web/redis),需要设置相关的配置参数。
以Web为例:
image表示该服务基于的镜像;
command表示启动容器时要执行的命令;
port指的是端口映射;
volumes指的是卷映射。
links表示的服务之间的连接关系。
对于该配置文件,我们可以转换为如下命令:
```
docker run -d -p 5000:5000 -v .:/figapp --link redis:redis --name nianshi/figapp python app.py
```
### 运行Fig
执行执行如下命令即可启动服务:
```
fig up
```
如果希望服务在后台运行,则直接添加`-d`参数即可:
```
fig up -d
```
接下来,我们打开浏览器访问页面:

### 使用Fig
在宿主机命令行使用如下命令可以查看所有Fig编配的服务的状态:
```
fig ps
```

同时,可以使用如下命令来查看服务日志:
```
fig logs
```
使用如下命令可以停止正在运行的服务:
```
fig stop
```
它们停止该编配文件中的所有服务。
Ps:`fig kill`可以用于停止服务。
对于停止后的服务,可以使用如下命令重新启动:
```
fig start
```
最后,我们使用如下命令来删除这些服务:
```
fig rm
```
Ps:补充一句,Fig的使用方式与目前流行的Docker三剑客之一的docker-compose十分类似,感兴趣的同学可以自行了解一下docker-compose的使用。
## Consul
对于分布式程序应用而言,一般由多个组件(服务)组成。
这些服务可以都放在一台机器上,也可以分布在多个数据中心中。而这些组件之间通常是互相关联的,即为其他组件提供相关服务。
而在这个过程中,服务发现就显得十分重要了。服务发现是指管理多个应用程序之间的相互关系。
由于应用服务本身是分布式的,因此服务发现机制通常也是分布式的。并且其本身要求足够可靠。
Consul就是一个典型的服务发现工具。它使用一个一致性算法的特殊数据存储器,即使用Raft一致性算法来提供确定的写入机制。
此外,Consul还有一些如下的功能:
- 根据API进行服务分类
- 提供基于DNS查询接口和REST API查询接口。
- 提供了完整强大的服务监控体系。
接下来的内容中,我们将会学习如下内容:
1. 创建Consul服务的Docker镜像。
2. 构建三台Docker宿主机,并在每台机器上运行一个Consul,来展现Consul如何处理弹性和失效的情况。
3. 构建服务并注册到Consul,然后从其他服务查询该数据。
### 构建Consul镜像
首先创建文件夹准备构建Consul镜像:
```
mkdir consul
cd consul
touch Dockerfile
```
修改`Dockerfile`文件如下:
```
FROM ubuntu:16.04
MAINTAINER nianshi
ENV REFRESHED_AT 2018-02-18
RUN apt-get -qq update
RUN apt-get -qq install curl unzip
ADD https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_linux_amd64.zip /tmp/consul.zip
RUN cd /usr/sbin && unzip /tmp/consul.zip && chmod +x /usr/sbin/consul && rm /tmp/consul.zip
RUN mkdir -p /webui/
ADD https://releases.hashicorp.com/consul/0.6.4/consul_0.6.4_web_ui.zip /webui/webui.zip
RUN cd /webui && unzip webui.zip && rm webui.zip
ADD consul.json /config/
EXPOSE 53/udp 8300 8301 8301/udp 8302 8302/udp 8400 8500
VOLUME ["/data"]
ENTRYPOINT [ "/usr/sbin/consul", "agent", "-config-dir=/config" ]
CMD []
```
其中,用到一个`consul.json`文件,其内容如下:
```
{
"data_dir": "/data",
"ui_dir": "/webui",
"client_addr": "0.0.0.0",
"ports": {
"dns": 53
},
"recursor": "8.8.8.8"
}
```
下面,我们来分析一下`Dockerfile`与`consul.json`两个文件:
1. 安装了curl unzip
2. 下载并解压consul的zip文件
3. 下载Consul网页界面并解压到/webui目录下。
4. 添加配置文件至/config/中。
5. 暴露一系列端口,作用如下:
端口|用途
-|-
53/udp|DNS服务器
8300 |服务器使用的RPC
8301+udp |Serf服务器使用的LAN端口
8302+udp |Serf服务器使用的WAN端口
8400 |命令行PRC接入点
8500 |HTTP API
下面,我们来构建镜像:
```
docker build -t nianshi/consul .
```
### 单机测试Consul容器
执行如下命令启动Consul容器
```
docker run -p 8500:8500 -p 53:53/udp -h node1 nianshi/consul -server -bootstrap
```
其中,`-server`表示告诉consul代理以服务器的模式运行,`-bootstrap`表示本节点自选举为集群领导者。
Ps:一个集群中,只能有一个节点可以添加`-bootstrap`。
浏览器访问8500端口可以看到如下页面:

## 其他编配工具介绍
### Fleet和etcd
Fleet是一个集群管理工具,etcd是一个高可用性的键值数据库,用于共享配置和服务发现。
### Docker三剑客
docker-compose、docker-machine以及swarm俗称Docker三剑客,是常用的Docker编配工具之一。
### Kubernetes
Kubernetes是Google开源的容器集群调度管理工具,是目前Docker容器编排中最流行的工具之一。
Ps:此外还有一些流行的工具,例如Apache Mesos,Helios,Centurion等。