compose介绍

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

  • 使用docker-compose脚本来启动,停止和重启服务和容器

安装docker-compose

Compose 支持Linux、macOS、Windows10三大平台。Compose可以通过Python的包管理工具pip进行安装,也可以直接下载编译好的二进制文件使用。

  1. PIP安装
    执行安装命令:
    1. $ sudo pip install -U docker-compose
    2. >


可以看到类似如下输出,说明安装成功。

  1. Collecting docker-compose
  2. Downloading docker-compose-1.17.1.tar.gz(149kB): 149kB downloaded
  3. ...
  4. Successfully installed docker-compose cached-property requests texttable websocket-cli ent docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
  1. 二进制包

在Linux上的也安装十分简单,从官方GitHub Release 处直接下载编译好的二进制文件即可。
例如,在Linux64位系统上直接下载对应的二进制包。

  1. sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compo se-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  2. sudo chmod a+x /usr/local/bin/docker-compose
  3. # 查看compose版本
  4. $ docker-compose --version
  5. docker-compose version 1.17.1, build 6d101fb

compose使用

术语

  • 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose面向项目进行管理。

下面我们用Python来建立一个能够记录页面访问次数的web网站。

web应用

新建文件夹,在目录中编写app.py文件

  1. >
  2. mkdir composetest
  3. cd composetest
  1. import time
  2. import redis
  3. from flask import Flask
  4. app = Flask(__name__)
  5. cache = redis.Redis(host='redis', port=6379)
  6. def get_hit_count():
  7. retries = 5
  8. while True:
  9. try:
  10. return cache.incr('hits')
  11. except redis.exceptions.ConnectionError as exc:
  12. if retries == 0:
  13. raise exc
  14. retries -= 1
  15. time.sleep(0.5)
  16. @app.route('/')
  17. def hello():
  18. count = get_hit_count()
  19. return 'Hello World! I have been seen {} times.\n'.format(count)
  20. if __name__ == "__main__":
  21. app.run(host="0.0.0.0", debug=True)

编辑requirements.txt

此文件包含我们项目中需要下载的包

  1. flask
  2. redis

Dockerfile

编写Dockerfile制作我们需要的镜像

  1. FROM python:3.7-alpine # 以Python 3.7-alpine为基础镜像
  2. ADD . /code # 将当前目录添加.到/code镜像中的路径
  3. WORKDIR /code # 将工作目录设置为/code
  4. RUN pip install -r requirements.txt # 安装Python依赖项
  5. CMD ["python", "app.py"] # 将容器的默认命令设置为python app.py

docker-compose.yaml

在compose文件中定义服务

  1. version: '3'
  2. services:
  3. web:
  4. build: . # 使用当前目录中Dockerfile构建的镜像
  5. ports:
  6. - "5000:5000" # 容器中端口5000映射到本地端口5000
  7. volumes:
  8. - .:/code # 添加挂载,将目录下所有的文件挂载到容器/code目录下
  9. redis:
  10. image: "redis:alpine" # 若本地没有redis将自动获取并使用docker-hub提供的redis:alpine镜像
  11. deploy:
  12. replicas: 1 # 设置容器复制因子
  13. resources:
  14. limits: # 每个实例限制为最多使用10%的CPU(在所有核心中)以及50MB RAM
  15. cpus:'0.1'
  16. memory:50M
  17. restart_policy: # 如果某个容器发生故障,立即重启容器
  18. condition: on-failure
  19. networks: # 使用默认设置定义webnet网络
  20. - webnet
  21. networks:
  22. webnet:

启动compose

在项目目录中,通过运行docker-compose up命令启动应用程序

  1. $ docker-compose up
  2. Creating network "composetest_default" with the default driver
  3. Creating composetest_web_1 ...
  4. Creating composetest_redis_1 ...
  5. Creating composetest_web_1
  6. Creating composetest_redis_1 ... done
  7. Attaching to composetest_web_1, composetest_redis_1
  8. web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  9. redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  10. redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
  11. redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
  12. web_1 | * Restarting with stat
  13. redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
  14. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  15. web_1 | * Debugger is active!
  16. redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized
  17. redis_1 | 1:M 17 Aug 22:11:10.483 # 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.
  18. web_1 | * Debugger PIN: 330-787-903
  19. redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

启动完成以后可以查看现在的镜像列表,此时列表应返回webredis两个镜像

  1. $ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB
  4. python 3.7-alpine 84e6077c7ab6 7 days ago 82.5MB
  5. redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB

查看当前运行的容器列表

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

此时,访问本地http://0.0.0.0:5000/可以查看到我们正在运行的应用程序返回的页面,每次刷新页面,计数就会加1:

  1. "Hello World! I have been seen 1 times."

docker-compose scale

docker-compose scale [options] [SERVICE=NUM...]设置指定服务运行的容器个数。

通过service=num的参数来设置数量。例如:

  1. >
  2. docker-compose scale web=3 redis=2 # 将启动3个容器运行web服务,2个容器运行redis服务

一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器;反之,将停止容器

停止compose服务

asd

  1. >
  2. docker-compose stop