目录

  1. 简介
  2. Compose简单应用

1. 简介

Dockerfile 可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

Compose是一个用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用Compose文件配置应用程序的服务。然后,使用单个命令,从配置中创建和启动所有服务。

Compose非常适用于开发,测试和组织(临时)环境,以及CI工作流。

使用Docker Compose基本上包括以下三步流程:

  1. 通过Dockerfile定义您的应用环境以便于它能够在任何地方重用。
  2. 在docker-compose.yml中定义组成应用程序的服务,以便它们可以在隔离的环境中一起运行。
  3. 最后,运行docker-compose up,并将Compose启动并运行整个应用程序。

Docker Compose具有如下的特性:

  • 单个主机中具有多个隔离环境
  • 当容器创建时保存容器卷数据
  • 仅重建已更改的容器
  • 变量和在环境之间移动

2. Compose简单应用

Docker官方简单示例介绍。

  1. 创建项目目录
# mkdir composetest


# cd composetest
  1. 创建 Python 的程序app.py,功能就是利用 redis 的 incr 方法进行访问计数。
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. 由于 Python 依赖的flaskredis组件都需要另外安装,比如使用 pip来安装,单独设置一文件requirements.txt,内容如下:
flask
redis
  1. 创建 service 依赖的第一个 image,app.py 程序的运行环境,利用 Dockerfile 来制作,内容如下:
FROM python:2.7 #基于 python:2.7 镜像
ADD . /code  #将本地目录中的内容添加到 container 的 /code 目录下
WORKDIR /code  #设置程序工作目录为 /code
RUN pip install -r requirements.txt   #运行安装命令
CMD python app.py  #启动程序
  1. Dockerfile创建好就可以制作镜像了,运行下面命令生成Docker镜像:
# 生成Docker镜像

docker build -t compose/python_app .

Docker镜像生成成功后通过docker images查看即能看到:

docker images                                   
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
compose/python_app     latest              a92fed00abd        59 minutes ago      680.4 MB
  1. 配置Docker Compose配置文件docker-compose.yml, 定义版本和服务等信息。
version: '2'
services:
web:
    image: compose/python_app
    ports:
     - "5000:5000"
    volumes:
     - .:/code
    depends_on:
     - redis
redis:
    image: redis

说明:配置中创建了2个service,web和redis,各自有依赖的镜像,其中web服务开放container的5000端口,并与host的5000端口应对,方便通过 localhost:5000来访问, volumes 即将本地目录中的文件加载到容器的 /code 中,depends_on表明services web需要依赖另一个 service redis

  1. 生成并启动服务
# docker-compose up

Attaching to composetestbypython_redis_1
redis_1  | 1:C 04 Nov 10:35:17.448 # 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.5 (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 04 Nov 10:35:17.450 # 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 04 Nov 10:35:17.450 # Server started, Redis version 3.2.5
redis_1  | 1:M 04 Nov 10:35:17.451 # 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 04 Nov 10:35:17.451 # 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 04 Nov 10:35:17.451 * The server is now ready to accept connections on port 6379

Compose启动和部署成功后,通过命令查看容器运行情况。

# docker-compose ps                                                                       
          Name                          Command               State           Ports
---------------------------------------------------------------------------------------------
composetestbypython_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp
composetestbypython_web_1     /bin/sh -c python app.py         Up      0.0.0.0:5000->5000/tcp

通过浏览器访问http://localhost:5000就能看到相关的发布信息。