当前位置: > Linux服务器 > Docker >

Docker---编排工具--Docker Compose

时间:2016-12-09 18:52来源:linux.it.net.cn 作者:IT

编排

编排(orchestration),指自动配置、协作和管理服务的过程,在 Docker 中,编排用来描述一组实践过程,这个过程会管理运行在多个 Docker 里的应用,这些 Docker 容器也可能运行在不同的宿主机上。

关于 Docker Compose

本文主要介绍 Docker 编排工具 Docker Compose ,由 Python 编写。使用 Docker Compose ,可以用一个 YAML 文件定义一组要启动的容器,以及容器运行时的属性。Docker Compose 称这些容器为“服务”:

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

安装 Docker Compose

Docker Compose 的安装,官方文档非常详细:https://docs.docker.com/compose/install/

Docker Compose 目前可以安装在 Linux、Windows 和 OS X上。可以从 GIthub 直接下载可执行安装包,也可以通过 pip 安装pip install docker-compose, 这里采用前者:

  • 从 Github 下载 docker-compose 可执行程序并到 /usr/local/bin 目录中,并赋予可执行权限。
# 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
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
  • 测试 Docker Compose 是否工作
  docker-compose -v
  docker-compose version 1.8.1, build 878cff1
  • 1
  • 2
  • 1
  • 2

Docker Compose 应用示例

这里通过一个 Python Flask 应用来演示 Docker Compose 的使用,需要用到两个容器:

  • 应用容器:运行 Python 示例程序
  • Redis容器:运行 Redis 数据库

1.创建项目目录

mkdir composeapp
cd composeapp
  • 1
  • 2
  • 1
  • 2

2.创建 Python Flask 应用 app.py

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

3.创建 requirements.txt 保存程序依赖

flask
redis
  • 1
  • 2
  • 1
  • 2

4.创建 Docker image

这一步骤创建 Docker image,该镜像包含Python应用程序需要的所有依赖关系,包括Python本身。

  • 在项目中创建 Dockerfile 文件如下:
FROM python:2.7
MAINTAINER Loya Chen <qingkang1993@163.com>

ADD . /composeapp

WORKDIR /composeapp

RUN pip install -r requirements.txt -i https://pypi.douban.com/simple

CMD python app.py
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 构建镜像
docker build -t web .
  • 1
  • 1

这里通过 Dockerfile 的方式构建了 web 镜像,Redis 容器的镜像则直接从 Docker Hub 拉取(我这里提前pull下来了)。

docker pull redis
  • 1
  • 1

5.通过 docker-compose.yml 定义服务

在项目目录下创建 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

这个 Compose 文件定义了两组服务, web 和 redis。web 服务:

  • 指定使用的镜像 web
  • web容器内的 5000 端口映射到主机的 5000 端口。
  • 将当前项目目录挂载到容器的 /composeapp 目录,一遍无需重新构建镜像即可修改代码。
  • 将 web 服务连接至 Redis 服务。

Redis 服务直接从 Docker Hub 拉取最新的 Redis 镜像使用,这个镜像默认会在标准端口上启动一个 Redis 数据库。

Compose 可以像 web 服务中那样指定要使用的镜像,也可以构建 Docker 镜像,使用 build 指令,并提供 Dockerfile 所在路径,例如使用当前目录下的 Dockerfile 构建镜像并使用:

web:
    build: .
  • 1
  • 2
  • 1
  • 2

如果使用相同的配置,在命令行中使用 docker run 执行服务,需要执行以下命令:

docker run -d -p 5000:5000 -v .:/composeapp --link redis:redis --name web
  • 1
  • 1

6.运行 Compose

docker-compose up

在项目目录中,通过 docker-compose up启动应用

docker-compose up
  • 1
  • 1
# 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

大多数的 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
  • 1
  • 1

#### docker-compose up -d

使用 Ctrl + C 停止 Compose 的同时,也会停止运行的服务,可以在运行 Compose 时执行 -d ,以守护进程的模式来运行服务(类似于 docker run -d )

# docker-compose up -d

Creating composeapp_redis_1
Creating composeapp_web_1 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

验证服务

# curl http://127.0.0.1:5000
Hello World! I have been seen 1 times.
  • 1
  • 2
  • 1
  • 2

每次请求,Redis中保存的计数器就会加1

7.Compose其他命令

docker-compose ps

列出本地 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

docker-compose logs

显示 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

docker-compose stop

停止正在运行的服务

# docker-compose stop
Stopping composeapp_web_1 ... done
Stopping composeapp_redis_1 ... done 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

该命令会同时停止两个服务,如果服务没有停止,可以使用docker-compose kill强制杀死

docker-compose start

如果使用docker-compose stopdocker-compose kill停止服务,还可以使用docker-compose重启这些服务。

docker-compose rm

删除 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

以上就是 Docker Compose的简单使用,更多内容可以参考官网:http://www.docker.com/products/docker-compose




(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容