Compose 是 docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。
使用 compose,咱们能够经过 YAML 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的建立和启动。python
Compose 的使用方式很是简单,基本上就是下面的三板斧:git
其实 compose 提供的命令能够管理应用的整个生命周期:github
本文咱们经过一个简单的 demo 来介绍 Docker Compose 的基本用法。说明:本文的演示环境为 ubuntu 16.04。本文的演示代码能够从 github 上下载。web
安装 Docker Compose 前请先在本地安装 Docker。
Docker Compose 的安装十分简单,在 ubuntu 中直接把可执行文件下载到本地就能够了。redis
$ sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
其中 1.22.0 是最新的版本。固然 Docker Compose 是个开源项目,你能够选择安装不一样的版本,或者是自行编译。下图为笔者安装以后显示的版本信息:docker
注意,默认的安装并不包括命令补全功能,也就是说像 docker-compose restart 这样的命令,你输入 docker-compose re 后按 tab 键是没法自动补全的。想要这个功能还须要额外的安装,以 Bash 为例,执行下面的命令:flask
$ sudo curl -L https://raw.githubusercontent.com/docker/compose/1.22.0/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
而后从新登陆 Bash,就能够经过 tab 键自动补全命令了!ubuntu
下面的示例来自 docker 官网,就是一个简单的 Flask 网页应用,后端使用 redis 存储数据,其 web server 的代码以下(能够从这里下载到本文中的代码): 后端
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)
代码很是简单,就是对请求计数并显示给用户。为了增长健壮性,在访问 redis 时作了一点处理:尝试访问 5 次再报错。把上面的代码保存到文件 app.py 中。
要运行上面的代码,须要在环境中安装 flask 和 redis 包。建立 requirements.txt 文件,编辑其内容为:bash
flask
redis
建立一个保存项目文件的目录,好比 composecounter,把 app.py 和 requirements.txt 文件都放进去。
接下来咱们须要把上面的应用打包到容器镜像中。在 composecounter 目录下建立 Dockerfile 文件:
FROM python:3.4-alpine ADD . /code WORKDIR /code RUN pip install -r requirements.txt CMD ["python", "app.py"]
上面代码的含义为:
终于来到本文的重点了!咱们须要建立 Docker Compose 的配置文件来定义咱们的应用。
YAML 是一个可读性高,用来表达数据序列的格式。Docker Compose 使用 YAML 格式的文件做为配置文件。
在 composecounter 目录中建立 docker-compose.yml 文件,其内容以下:
version: '3' services: web: build: . ports: - "5000:5000" redis: image: "redis:alpine"
第一行的 version: '3' 表示当前的配置文件使用的语法版本。
services 中的内容指明该应用一共定义了多少个服务(容器镜像)。在运行时,一个服务是指从该镜像启动的一个或多个容器。
在咱们的示例中一共须要两个容器镜像。web 服务由咱们本身经过 build . 命令构建,映射的端口是 flask web server 默认的 5000 端口。
redis 服务则直接使用官方的镜像。
在 composecounter 目录下执行命令:
$ docker-compose up
跳过那些繁琐的输出,咱们直接访问本机的 5000 端口:
一个 web 应用程序运行起来了,而且输出了咱们访问服务器端的次数,看起来还不错!
若是要让容器安静的运行在后台,加上 -d 选项就能够了:
$ docker-compose up -d
分析 docker-compose up 命令的输出能够看清事情的真相,可是日志过于繁琐,咱们只说重点:
若是你手动去执行这些操做仍是挺很繁琐的,如今一个命令就搞定了,还能够把相关的代码和配置通通的用版本管理工具管理起来。
虽然示例程序可以运行起来了,但咱们只是来到了一个新的起点。Docker Compose 被设计来管理应用的整个生命周期,咱们也能够用它来极大的提升工做效率。笔者将在接下来的文章中介绍更多 Docker Compose 相关的内容。