项目4 Docker集群
任务4.1 docker compose容器编排
4.1.1 Compose简介
Compose 定位是 “定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)”,其前身是开源项目 Fig,目前仍然兼容 Fig 格式的模板文件。
通过第一部分中的介绍,知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
(1). 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
(2). 项目(project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用Compose 来进行编排管理。
4.1.2 安装
Compose 目前支持 Linux 和 Mac OS 平台,两者的安装过程大同小异。
安装 Compose 之前,要先安装 Docker(需要 DockerEngine 1.7.1+),请参考第一部分中章节,在此不再赘述。
Compose 可以通过 Python 的 pip 工具进行安装,可以直接下载编译好的二进制文件使用,甚至直接运行在 Docker 容器中。
前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。
(1). 安装DockerCompose(选择1.8.1版本的)
[root@client ~]# sudo bash -c "curl -Lhttps://github.com/docker/compose/releases/download/1.8.0/docker-compose-'uname-s'-'uname -m' >/usr/local/bin/docker-compose"
%Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 54877 0 54877 0 0 2798 0 --:--:-- 0:00:19 --:--:-- 2578
[root@client ~]# sudo chmod +x/usr/local/bin/docker-compose
[root@client /]# yum -y install python-pip
[root@client /]# sudo pip install -Udocker-compose
(2). 安装好以后更新一下pip工具
[root@client yum.repos.d]# pip install --upgradepip
Collecting pip
Downloading pip-9.0.1-py2.py3-none-any.whl (1.3MB)
100% |████████████████████████████████| 1.3MB 28kB/s
Installing collected packages: pip
Foundexisting installation: pip 8.1.2
Uninstalling pip-8.1.2:
Successfully uninstalled pip-8.1.2
Successfully installed pip-9.0.1
(3). 验证docker-compose是否可用(注意要yum clean all)
[root@client bin]# sudo docker-compose --version
docker-compose version 1.8.1, build 258538
4.1.3 实例应用
编写一个python web案例,应用compose编排服务。例子包含2个容器,一个python web容器,一个是Redis数据库容器。
首先构建python web镜像和容器:
(1). 创建composeapp目录
[root@client /]# mkdir composeapp
[root@client /]# cd composeapp/
[root@client composeapp]# touch Dockerfile
(2). 编写python程序
[root@client composeapp]# touch app.py
[root@client composeapp]# vi app.py
from flask import Flask
from redisimport 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)
(3). 创建python的依赖包描述文件
~ [root@client composeapp]# touchrequirements.txt
[root@client composeapp]# vi requirements.txt
flask
redis
(4). 编写python web容器的镜像Dockerfile文件
[root@client composeapp]# vi Dockerfile
FROM python:2.7
MAINTAINER James Turnbull<james@example.com>
ENV REFRESHED_AT 2016-08-01
ADD . /composeapp
WORKDIR /composeapp
RUN pip install -r requirements.txt
(5). 构建镜像
[root@client composeapp]# sudo docker build -tjamtur01/composeapp .
[root@client composeapp]# sudo docker build -tjamtur01/composeapp .
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM python:2.7
Trying to pull repository192.168.200.11:5000/python ...
Pulling repository 192.168.200.11:5000/python
Error: image python not found
Trying to pull repositorydocker.io/library/python ...
2.7: Pu