转载过程中,图片丢失,代码显示错乱。
为了更好的学习内容,请访问原创版本:
https://www.missshi.cn/api/view/blog/5a6328370a745f6335000007
Ps:初次访问由于js文件较大,请耐心等候(5s左右)
Docker的编配是指容器的自动配置、协作和服务管理的过程。
编配常常用于描述一组实践过程。通常会管理运行在多个Docker容器里面的应用,有时这些Docker容器也会运行在多个宿主机上。
本文中,我们将主要讲解众多编配工作中的两种,分别是适用于简单容器编配的Fig以及管理分布式服务的Consul。
Fig
安装
Fig是基于Python编写的一款Docker编配工具,可以执行使用Python的包管理工具pip
来进行安装:
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 <nianshi0912@gmail.com>
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查询接口。
- 提供了完整强大的服务监控体系。
接下来的内容中,我们将会学习如下内容:
- 创建Consul服务的Docker镜像。
- 构建三台Docker宿主机,并在每台机器上运行一个Consul,来展现Consul如何处理弹性和失效的情况。
- 构建服务并注册到Consul,然后从其他服务查询该数据。
构建Consul镜像
首先创建文件夹准备构建Consul镜像:
mkdir consul
cd consul
touch Dockerfile
修改Dockerfile
文件如下:
FROM ubuntu:16.04
MAINTAINER nianshi <nianshi0912@gmail.com>
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
两个文件:
- 安装了curl unzip
- 下载并解压consul的zip文件
- 下载Consul网页界面并解压到/webui目录下。
- 添加配置文件至/config/中。
- 暴露一系列端口,作用如下:
端口 | 用途 |
---|---|
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等。
更多更详细的内容,请访问原创网站:
https://www.missshi.cn/api/view/blog/5a6328370a745f6335000007
Ps:初次访问由于js文件较大,请耐心等候(5s左右)