第7章 使用Fig编配Docker–小铁笔记

2年前 (2016-02-16) admin 《第一本Docker书》 0评论 已收录 725℃

第7章 使用Fig编配Docker

编配(orchestration)描述了自动配置、协作和管理服务的过程。在Docker的世界里,编配用来描述

一组实践过程,这个过程会管理运行在多个Docker容器里的应用,而这些Docker容器有可能运行在多个宿

主机上。Docker对编配的原生支持非常弱,不过整个社区围绕编配开发和集成了很多很棒的工具。

关注:

。简单的容器编配

。分布式服务发现

7.1 Fig

可以用一个YAML文件定义一组要启动的容器,以及容器运行时的属性。Fig称这些容器为“服务”:

容器通过某些方法并指定一些运行时的属性来和其它容器产生交互。

7.1.1 安装Fig

注意:Fig只能和Boot2Docker 1.3及更高版本以前工作。

为了在Linux上安装Fig,可以从GitHub下载Fig的可执行包,并让其可执行。和Docker一样,Fig目前

只能安装在64位Linux上。可以使用curl命令来完成安装。

-->bash-c "curl -L https://github.com/docker/compose/releases/download/0.5.2/linux > /usr/local/bin/fig"

(有问题)

-->chmod +x /usr/local/bin/fig

其它安装方法:

-->curl -L https://github.com/docker/fig/releases/download/1.0.0/fig-`uname \
-s`-`uname -m` > /usr/local/bin/fig; chmod +x /usr/local/bin/fig

% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:03 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:04 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:05 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:07 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:08 --:--:-- 0 0 0 0 0 0 0 0 --:--:-- 0:00:09 --:--:-- 100 140 0 140 0 0 12 0 --:--:-- 0:00:11 --:--:-- 37
0 0 0 392 0 0 33 0 --:--:-- 0:00:11 --:--:-- 33
100 5124k 100 5124k 0 0 52052 0 0:01:40 0:01:40 --:--:-- 105k

。OS X上安装:

-->curl -L https://github.com/docker/fig/releases/download/0.5.2/darwin > /usr/local/bin/fig

-->chmod +x /usr/local/bin/fig

。其它平台安装(Red Hat、Debian或者Ubuntu发行版)

-->pip install -U fig

。查看安装后的版本

-->fig --version

fig 1.0.0

7.1.2 获取示例应用

为了演示Fig是如何工作的,这里使用一个Python Flask应用作为例子,使用两个容器:

* 应用容器,运行Python示例程序

* Redis容器,运行Redis数据库

。拉取python镜像

-->docker search python

。创建 Dockerfile

-->vim Dockerfile

FROM python:2.7
MAINTAINER James Turnbull <james@example.com>
ENV REFRESHED_AT 2015-09-11

ADD . /figapp

WORKDIR /figapp

RUN pip install -r requirements.txt

这个Dockerfile它基于python:2.7镜像构建。首先添加文件app.py和requirements.txt到镜像中的/figapp

目录,之后Dockerfile将工作目录设置为/figapp,并执行pip命令来安装应用的依赖:flask和redis。

。需要添加应用程序的源代码,创建一个名叫app.py,内容如下:

-->vim app.py

from flask import Flask
from redis import Redis
import os

app = Flask(__name__)
redis = Redis(host="redis_1", 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)

这个Flask应用程序追踪保存在Redis里的计数器,每次访问根/路径时,计数器_会自增_。

。创建requirements.txt

该文件保存应用程序的依赖关系

-->vim requirements.txt

flask
redis

。构建镜像

-->cd figapp

-->docker build -t="jamtur01/figapp" .

7.1.3 fig.yml文件

使用Fig,可以定义一组服务,并启动这些服务。Fig还可以指定这些服务运行时的属性。这些属性和

docker run命令需要的参数类似。将所有与服务有关的的属性都定义在一个YAML文件里,之后执行fig up

命令,Fig会启动这些容器,使用指定的参数来执行,并将所有的日志输出合并到一起。

-->cd figapp

-->vim fig.yml

web:
image: jamtur01/figapp
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/figapp
links:
- redis
redis:
image: redis

每个要启动的服务都使用一个YAML的散列键定义:web和redis。

使用ports和volumes指定了服务要映射到的端口和卷,让服务里的5000端口映射到主机的5000端口,

并创建了卷/figapp。最后使用link制定了要连接到服务的其它服务:将redis服务连接到web服务。

对于web服务,指定了一些运行时参数。首先,使用image指定了要运行的镜像。Fig也可以构建Docker镜像,

可以使用build指令,并提供一个Dockerfile,来让Fig构建一个镜像,并使用这个镜像创建服务。

。创建容器

-->docker run -d -p 5000:5000 -v .:/figapp -link redis:redis \
--name jamtur01/figapp python app.py

指定了一个名叫redis的服务,这个服务没有指定任何运行时的参数,一切使用默认的配置。这个镜像默认会在

标准端口上启动一个Redis数据库。

7.1.4 运行Fig

一旦fig.yml中指定了需要的服务,就可以使用fig up命令来执行这些服务

-->cd figapp

-->fig up

可以看到Fig创建了两个新的服务:figapp_redis_1和figapp_web_1。Fig之后接管了每个服务输出的日志,输出

的日志每一行都使用缩短的服务名字作为前缀,并交替输出在一起。

服务(和Fig)交替运行,这意味着,如果使用Ctrl+C来停止Fig运行,也会停止运行的服务,也可以在启动Fig时

指定-d标志,以守护进程的模式来启动服务。(类似于docker run -d标志)。

-->fig up -d

。访问服务

-->http://ip:5000/

可以看到这个页面上显示了当前计数器的值。刷新网站,会看到这个值在增加。每次增加都会增加保存在Redis里

的值。Redis更新是通过由Fig控制的Docker容器之间的链接实现的。

提示:在默认情况下,Fig会试图连接到本地的Docker守护进程,不过也会受到Docker\_HOST环境变量的影响,去

连接到一个远程的Docker宿主机。

7.1.5 使用Fig

使用Ctrl+C关闭正在运行的服务,然后以守护进程的方式启动这些服务。

在figapp目录下按Ctrl+C,使用-d标志重新运行fig up命令

-->Ctrl+C

-->fig up -d

。查看服务运行状态

-->fig ps

此命令列出了本地fig.yml文件里正在运行的所有服务

。查看服务的日志事件

-->fig logs

这个命令会追踪服务的日志文件。

。停止服务

-->fig stop

这个命令会同时停止两个服务,如果该服务没有停止,可以使用fig kill命令强制

杀死该服务。

。查看服务是否停止了

-->fig ps

可以使用fig start启动服务

。删除这些服务

-->fig rm --> y

。再次查看

-->fig ps

7.1.6 Fig小结

使用一个文件就可以构建一个简单的Python-Redis栈,可以看出使用这种方法能够非常简单地构建一个需要

多个Docker容器的应用程序。

7.2 Consul、服务发现和Docker

服务发现:是分布式应用程序之间管理相互管理相互关系的一种机制。一个分布式程序一般由多个组件组成。

这些组件可以都放在一台机器上,也可以分布在多个数据中心,甚至分布在不同的地理区域。这些组件通常可以

为其它组件提供服务,或者为其它组件消费服务。

服务发现允许某个组件在想要与其它组件交互时,自动找到对方。

Docker主要关注分布式应用以及面向服务架构与微服务架构。这些关注点和适合于某个服务发现工具集合。

每个Docker容器可以将其中运行的服务注册到服务发现工具里。注册的信息可以是IP地址或者端口,或者两者都有,

以便服务之间进行交互。

Consul是一个使用一致性算法的特殊数据存储器。Consul使用Raft一致性算法来提供确定的写入机制。Consul

暴露了键值存储系统和服务分类系统,并提供高可用、高容错能力,并保证强一致性。服务可以将自己注册到Consul,

并以高可用且分布式的方式共享这些信息。

Consul提供了一些有趣的功能:

。提供了根据API进行服务分类,代替了大部分传统服务发现工具的键值对存储。

。提供两种接口来查询信息。

。提供了服务监控,也称作Aka健康控。Consul内置了强大的服务监控系统。

本章在Docker容器里分布式运行Consul,之后会从Docker容器将服务注册到Consul,并从其它Docker容器访问注册

的数据。

为了做到这些,需要做到以下几点:

。创建Consul服务的Docker镜像。

。构建三台运行Docker的宿主机,并在每台上运行一个Consul。这三台宿主机会提供一个分布式环境,来展现Consul

如何处理弹性和失效工作的。

。构建服务,并将其注册到Consul,然后从其它服务查询该数据。

7.2.1 构建Consul镜像

-->mkdir consul

-->cd consul

-->vim Dockerfile

FROM ubuntu:14.04
MAINTAINER James Turnbull <james@example.com>
ENV REFRESHED_AT 2014-08-01

RUN apt-get update
RUN apt-get -y install curl unzip

ADD https://dl.bintray.com/mitchellh/consul/0.3.1_linux_amd64.zip /tmp/consul.zip
RUN cd /usr/sbin && unzip /tmp/consul.zip && chmod +x /usr/sbin/consul && rm /tmp/consul.zip
ADD consul.json /config/

ADD https://dl.bintray.com/mitchellh/consul/0.3.1_web_ui.zip /tmp/webui.zip
RUN cd /tmp/ && unzip webui.zip && mv dist/ /webui/

EXPOSE 8300 8301 8301/udp 8302 8302/udp 8400 8500 53/udp

VOLUME ["/data"]

ENTRYPOINT [ "/usr/sbin/consul", "agent", "-config-dir=/config" ]
CMD []

这个Dockerfile基于ubuntu 14.04镜像,它安装了curl和unzip,然后下载了包含consul可执行程序的zip

文件,将这个可执行文件移动到/usr/sbin/ 并修改属性使其可以执行。下载了Consul网页界面,将其放在名

为/webui的目录里。之后将Consul配置文件consul.json添加到/config目录。指定了consul执行文件所在的目录

为/usr/sbin/。参数agent告诉Consul以代理节点的模式运行,-config-dir标志指定了配置文件consul.json所在

的目录是/config。

。consul.json配置文件为:

-->vim consul.json

{
"data_dir": "/data",
"ui_dir": "/webui",
"client_addr": "0.0.0.0",
"ports": {
"dns": 53
},
"recursor": "8.8.8.8"

consul.json配置文件是做过JSON格式化后的配置,提供了Consul运行时需要的信息。首先指定了数据目录

/data来保存Consul的数据,之后指定了网页界面文件的位置/webui。设置client_addr变量,将Consul绑定到

容器内的所有网页界面。之后使用port配置Consul服务运行时需要的端口。这里指定Consul的DNS服务运行在53

端口。之后,使用recursor选项指定了DNS服务器,这个服务器会用来解析Consul无法解析的DNS请求,这里指定

的8.8.8.8。

Consul的默认端口
-------------------------------------------------------------------------
端 口 用 途
-------------------------------------------------------------------------
53/udp DNS服务器

8300 服务器使用的RPC

8301+udp Serf服务器的LAN端口

8302+udp Serf服务器的WAN端口

8400 命令行RPC接入点

8500 HTTP API
-------------------------------------------------------------------------

主要关注:53/udp端口,使用DNS来获取服务信息。

8500端口:提供HTTP API和网页界面,其余的端口用于处理后台通信。

其余的端口用于处理后台通信,将多个Consul节点组成集群。

注意:

可以在http://www.consul.io/doc/agent/options.html找到每个端口更为详细的信息。

之后,使用VOLUME指令将/data目录设置为卷。

之后使用ENTRYPOINT指令指定从镜像启动容器时,启动Consul服务的consul可执行文件。

。构建镜像

-->docker build -t="jamtur01/consul" .

Sending build context to Docker daemon 13.82 kB
Sending build context to Docker daemon
Step 0 : FROM ubuntu:14.04
---> 3f126a502d09
Step 1 : MAINTAINER James Turnbull <james@example.com>
---> Using cache
---> 10b317f5826d
Step 2 : ENV REFRESHED_AT 2014-08-01
---> Running in 2fd29bb1450c
---> e5a119a56a60
Removing intermediate container 2fd29bb1450c
Step 3 : RUN apt-get update
---> Running in 396fa3311fc0

7.2.2 在本地测试Consul容器

首先查看本地单独运行一个Consul的情况

。启动一个容器

-->docker run -p 8500:8500 -p 53:53/udp \
-h node1 jamtur01/consul -server -bootstrap

这个容器映射了两个端口,容器中的8500端口映射到了主机的8500端口,容器中的53端口映射到了主机

的53端口。-h标志指定了容器的主机名node1。这个名子也是Consul节点的名字,之后指定了要启动的Consul

镜像jamtur01/consul。最后,给consul可执行文件传递了两个标志:-server和-bootstrap。标志-server

告诉Consul代理以服务器的模式运行,标志-bootstrap告诉Consul本节点可以自选举为集群领导者,这个参数

会让本节点以服务器模式运行,并可以执行Raft领导者选举。

警告:每个数据中心最多有一台Consul服务器可以用自启动(bootstrap)模式运行。否则,如果有多个可以

进行自选举的节点,整个集群无法保证一致性。

可以看出,Consul启动了node1节点,并在本地进行了领导者选举。因为没有别的Consul节点运行,刚启动

的节点也没有其余的连接动作。

。访问Consul网页

-->http://ip:8500/

博主

让学习成为习惯,坚持-共享-开源-自由! 成功者决不放弃,放弃者绝不成功!

相关推荐

嗨、骚年、快来消灭0回复。