Docker新手入门之七:Docker编配工具介绍
2018-02-18T15:16:18    1277    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 ``` 接下来,我们打开浏览器访问页面: ![title](/static/files/591/5989cee6e519f50ef7000031/87/images/450725cad45461d918ba4f2b9e33af60.png) ### 使用Fig 在宿主机命令行使用如下命令可以查看所有Fig编配的服务的状态: ``` fig ps ``` ![title](/static/files/591/5989cee6e519f50ef7000031/89/images/d89e7230f7bbd4fe147c4d0c4e5d0cf6.png) 同时,可以使用如下命令来查看服务日志: ``` 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端口可以看到如下页面: ![title](/static/files/591/5989cee6e519f50ef7000031/99/images/067d3e94583ac15d2dc653bd4cfe86d6.png) ## 其他编配工具介绍 ### Fleet和etcd Fleet是一个集群管理工具,etcd是一个高可用性的键值数据库,用于共享配置和服务发现。 ### Docker三剑客 docker-compose、docker-machine以及swarm俗称Docker三剑客,是常用的Docker编配工具之一。 ### Kubernetes Kubernetes是Google开源的容器集群调度管理工具,是目前Docker容器编排中最流行的工具之一。 Ps:此外还有一些流行的工具,例如Apache Mesos,Helios,Centurion等。

上一篇: Docker新手入门之六:Docker在生产环境中的使用实践

下一篇: Docker新手入门之八:Docker API详解

0条评论