[翻译]Docker Compose工具快速入门

Docker Compose

译者注:原文地址,本译文仅供学习参考,如有侵权请立即联系我,我会立即删除。

Compose是一个用于在Docker上定义并运行复杂应用的工具。通过Compose,你可以很容易地使用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。

在开发环境、临时服务器、CI中使用Compose是非常合适的。但是,我们目前不建议你在生产环境中使用。

使用Compose需要三个基本步骤。

首先,你需要使用一个Dockerfile来定义你的应用的运行环境,这样你就可以在任何地方轻松地重建这个环境。

1
2
3
4
5
6
FROM python:2.7
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code
CMD python app.py

然后,你需要在docker-compose.yml中确定你的应用所使用的服务,这样它们就可以在一个隔离环境中一起运行。

1
2
3
4
5
6
7
8
web:
build: .
links:
- db
ports:
- "8000:8000"
db:
image: postgres

最后,执行docker-compose up命令,然后Compose就会启动并运行你的整个应用。

Compose有一整套命令来对你的应用的整个生命周期进行管理。

  • 启动、终止、重建服务。
  • 查看运行中服务的状态。
  • 将运行服务的日志输出整理成数据流。
  • 对一个服务运行一次性指令(原文:Run a one-off command on a service)(译者注:这个没看懂)。

Compose文档

快速开始

让我们完整地进行一套Compose的使用流程——在Compose上运行一个简单的Python的web应用。在这里我们假定你已有一点关于Python的知识,但是即使你不懂也没关系,下文中会出现的概念都很浅显易懂。

安装并搭建Compose环境

首先,安装Docker和Compose

然后,创建项目目录。

1
2
$ mkdir composetest
$ cd composetest

在目录中,创建app.py,这是一个使用Flask框架、用于递增Redis中的数据的简单应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
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 World! I have been seen %s times.' % redis.get('hits')

if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

接下来,在requirements.txt中确定Python依赖:

1
2
flask
redis

创建一个Docker镜像

现在,创建一个包含了你的应用所有依赖的Docker镜像。你需要在Dockerfile中确定你创建镜像的Docker命令:

1
2
3
4
FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt

这些命令会创建一个包含Python、你的代码、Python依赖的Docker镜像。想了解更多关于如何编写Dockerfile的信息,请看Docker用户指南Dockerfile参考文档

确定服务

接下来,在docker-compose.yml中定义你使用的服务的集合:

1
2
3
4
5
6
7
8
9
10
11
web:
build: .
command: python app.py
ports:
- "5000:5000"
volumes:
- .:/code
links:
- redis
redis:
image: redis

上文确定了两个服务:

  • web, 这个服务按照Dockerfile安装在当前目录。另外它在镜像中运行了python app.py命令。在镜像中,容器使用开放的5000端口连接宿主机的5000端口,同时访问Redis服务,并且将当前目录挂载到容器中,这样我们在代码上工作改进时就不需要重建镜像了。
  • redis,这个服务使用了公共镜像redis,这个进镜像可以从Docker中心注册镜像库(Docker Hub registry)上拉下来。

使用Compose构建并运行你的应用

现在,当我们执行docker-compose up命令时,Compose就会自动拉下Redis镜像,按你的需求建立镜像,然后将环境和依赖部署好,并运行相关服务:

1
2
3
4
5
6
7
$ docker-compose up
Pulling image redis...
Building web...
Starting composetest_redis_1...
Starting composetest_web_1...
redis_1 | [8] 02 Jan 18:43:35.576 # Server started, Redis version 2.8.3
web_1 | * Running on http://0.0.0.0:5000/

这个web应用现在应该正在Docker守护进程上监听5000端口(如果你使用了Boot2docker工具,执行boot2docker ip可以显示它的地址)。

如果你希望后台运行这些服务,就在执行docker-compose up时传入-d 标志,执行 docker-compose ps 就可以看到现在正在运行的服务:

1
2
3
4
5
6
7
8
$ docker-compose up -d
Starting composetest_redis_1...
Starting composetest_web_1...
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
composetest_redis_1 /usr/local/bin/run Up
composetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp

docker-compose run命令能够让你对服务执行一次性指令。比如,如果你想查看web服务的所有可用环境变量:

1
$ docker-compose run web env

通过查看docker-compose run web env的回显能够查看其他可用命令。

如果你使用docker-compose up -d命令启动Compose,你可能需要这条指令来在运行应用结束后终止你需要的服务:
$ docker-compose stop

看完以上内容,你已经了解了使用Compose的基本过程。