编排(orchestration),指自动配置、协作和管理服务的过程,在 Docker 中,编排用来描述一组实践过程,这个过程会管理运行在多个 Docker 里的应用,这些 Docker 容器也可能运行在不同的宿主机上。
本文主要介绍 Docker 编排工具 Docker Compose ,由 Python 编写。使用 Docker Compose ,可以用一个 YAML 文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose 称这些容器为“服务”:
容器通过某些方法并制定一些运行时的属性来和其他容器产生交互。
Docker Compose 的安装,官方文档非常详细:https://docs.docker.com/compose/install/
Docker Compose 目前可以安装在 Linux、Windows 和 OS X上。可以从 GIthub 直接下载可执行安装包,也可以通过 pip 安装 pip install docker-compose
, 这里采用前者:
# curl -L "https://github.com/docker/compose/releases/download/1.8.1/docker-compose-$(uname -s)-$(uname -m)" > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
docker-compose -v
docker-compose version 1.8.1, build 878cff1
这里通过一个 Python Flask 应用来演示 Docker Compose 的使用,需要用到两个容器:
mkdir composeapp
cd composeapp
from flask import Flask
from redis import Redis
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)
这个简单的 Flask 应用追踪保存在 Redis 里的计数器。每次访问根路径/时,计数器将自增。
flask
redis
这一步骤创建 Docker image,该镜像包含Python应用程序需要的所有依赖关系,包括Python本身。
FROM python:2.7
MAINTAINER Loya Chen @163.com>
ADD . /composeapp
WORKDIR /composeapp
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
CMD python app.py
docker build -t web .
这里通过 Dockerfile 的方式构建了 web 镜像,Redis 容器的镜像则直接从 Docker Hub 拉取(我这里提前pull下来了)。
docker pull redis
在项目目录下创建 docker-compose.yml 文件来定义一组服务。docker-compose.yml 是 YAML 格式的文件,每个要启用的服务都使用一个 YAML 的散列键定义,服务以 Docker 容器的形式表现,同时定义服务启动时的运行属性。
version: '2'
services:
web:
image: web
ports:
- "5000:5000"
volumes:
- .:/composeapp
depends_on:
- redis
redis:
image: redis
这个 Compose 文件定义了两组服务, web
和 redis
。web 服务:
Redis 服务直接从 Docker Hub 拉取最新的 Redis 镜像使用,这个镜像默认会在标准端口上启动一个 Redis 数据库。
Compose 可以像 web 服务中那样指定要使用的镜像,也可以构建 Docker 镜像,使用 build 指令,并提供 Dockerfile 所在路径,例如使用当前目录下的 Dockerfile 构建镜像并使用:
web:
build: .
如果使用相同的配置,在命令行中使用 docker run 执行服务,需要执行以下命令:
docker run -d -p 5000:5000 -v .:/composeapp --link redis:redis --name web
在项目目录中,通过 docker-compose up
启动应用
docker-compose up
# docker-compose up
Creating composeapp_redis_1
Creating composeapp_web_1
Attaching to composeapp_redis_1, composeapp_web_1
redis_1 | 1:C 30 Oct 09:17:47.220 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis_1 | _._
redis_1 | _.-``__ ''-._
redis_1 | _.-`` `. `_. ''-._ Redis 3.2.4 (00000000/0) 64 bit
redis_1 | .-`` .-```. ```\/ _.,_ ''-._
redis_1 | ( ' , .-` | `, ) Running in standalone mode
redis_1 | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
redis_1 | | `-._ `._ / _.-' | PID: 1
redis_1 | `-._ `-._ `-./ _.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' | http://redis.io
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | |`-._`-._ `-.__.-' _.-'_.-'|
redis_1 | | `-._`-._ _.-'_.-' |
redis_1 | `-._ `-._`-.__.-'_.-' _.-'
redis_1 | `-._ `-.__.-' _.-'
redis_1 | `-._ _.-'
redis_1 | `-.__.-'
redis_1 |
redis_1 | 1:M 30 Oct 09:17:47.222 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis_1 | 1:M 30 Oct 09:17:47.222 # Server started, Redis version 3.2.4
redis_1 | 1:M 30 Oct 09:17:47.222 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis_1 | 1:M 30 Oct 09:17:47.222 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis_1 | 1:M 30 Oct 09:17:47.222 * The server is now ready to accept connections on port 6379
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger pin code: 147-498-872
大多数的 Compose 命令必须在 docker-compose.yml 文件所在目录下执行
可以看到 Compose 创建了 composeapp_redis_1
和 composeapp_web_1
两个服务。为保证服务唯一,Compose 将 docker-compose.yml 文件中指定的服务名字加上目录作为前缀,并分别使用数字作为后缀。
Compose 接管了每个服务输出的日志,输出的日志每一行都使用缩短的服务名作为前缀,并交替输出在一起。
redis_1 | 1:M 30 Oct 09:17:47.222 # Server started, Redis version 3.2.4
#### docker-compose up -d
使用 Ctrl + C 停止 Compose 的同时,也会停止运行的服务,可以在运行 Compose 时执行 -d ,以守护进程的模式来运行服务(类似于 docker run -d )
# docker-compose up -d
Creating composeapp_redis_1
Creating composeapp_web_1
# curl http://127.0.0.1:5000
Hello World! I have been seen 1 times.
每次请求,Redis中保存的计数器就会加1
列出本地 docker-compose.yml 文件定义的正在运行的所有服务,查看服务运行状态
# docker-compose ps
Name Command State Ports
------------------------------------------------------------------------------------
composeapp_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
composeapp_web_1 /bin/sh -c python app.py Up 0.0.0.0:5000->5000/tcp
显示 Docker Compose 服务日志
# docker-compose logs
Attaching to composeapp_web_1, composeapp_redis_1
web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web_1 | * Restarting with stat
web_1 | * Debugger is active!
web_1 | * Debugger pin code: 147-498-872
停止正在运行的服务
# docker-compose stop
Stopping composeapp_web_1 ... done
Stopping composeapp_redis_1 ... done
该命令会同时停止两个服务,如果服务没有停止,可以使用
docker-compose kill
强制杀死
如果使用docker-compose stop
或docker-compose kill
停止服务,还可以使用docker-compose
重启这些服务。
删除 Docker Compose 服务,两个服务均会被删除
# docker-compose rm
Going to remove composeapp_web_1, composeapp_redis_1
Are you sure? [yN] y
Removing composeapp_web_1 ... done
Removing composeapp_redis_1 ... done
以上就是 Docker Compose的简单使用,更多内容可以参考官网:http://www.docker.com/products/docker-compose