compose介绍
Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。
使用docker-compose脚本来启动,停止和重启服务和容器
安装docker-compose
Compose 支持Linux、macOS、Windows10三大平台。Compose可以通过Python的包管理工具pip进行安装,也可以直接下载编译好的二进制文件使用。
- PIP安装
执行安装命令:$ sudo pip install -U docker-compose>
可以看到类似如下输出,说明安装成功。
Collecting docker-composeDownloading docker-compose-1.17.1.tar.gz(149kB): 149kB downloaded...Successfully installed docker-compose cached-property requests texttable websocket-cli ent docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
- 二进制包
在Linux上的也安装十分简单,从官方GitHub Release 处直接下载编译好的二进制文件即可。
例如,在Linux64位系统上直接下载对应的二进制包。
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compo se-`uname -s`-`uname -m` > /usr/local/bin/docker-composesudo chmod a+x /usr/local/bin/docker-compose# 查看compose版本$ docker-compose --versiondocker-compose version 1.17.1, build 6d101fb
compose使用
术语
- 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose面向项目进行管理。
下面我们用Python来建立一个能够记录页面访问次数的web网站。
web应用
新建文件夹,在目录中编写app.py文件
>mkdir composetestcd composetest
import timeimport redisfrom flask import Flaskapp = Flask(__name__)cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)if __name__ == "__main__":app.run(host="0.0.0.0", debug=True)
编辑requirements.txt
此文件包含我们项目中需要下载的包
flaskredis
Dockerfile
编写Dockerfile制作我们需要的镜像
FROM python:3.7-alpine # 以Python 3.7-alpine为基础镜像ADD . /code # 将当前目录添加.到/code镜像中的路径WORKDIR /code # 将工作目录设置为/codeRUN pip install -r requirements.txt # 安装Python依赖项CMD ["python", "app.py"] # 将容器的默认命令设置为python app.py
docker-compose.yaml
在compose文件中定义服务
version: '3'services:web:build: . # 使用当前目录中Dockerfile构建的镜像ports:- "5000:5000" # 容器中端口5000映射到本地端口5000volumes:- .:/code # 添加挂载,将目录下所有的文件挂载到容器/code目录下redis:image: "redis:alpine" # 若本地没有redis将自动获取并使用docker-hub提供的redis:alpine镜像deploy:replicas: 1 # 设置容器复制因子resources:limits: # 每个实例限制为最多使用10%的CPU(在所有核心中)以及50MB RAMcpus:'0.1'memory:50Mrestart_policy: # 如果某个容器发生故障,立即重启容器condition: on-failurenetworks: # 使用默认设置定义webnet网络- webnetnetworks:webnet:
启动compose
在项目目录中,通过运行docker-compose up命令启动应用程序
$ docker-compose upCreating network "composetest_default" with the default driverCreating composetest_web_1 ...Creating composetest_redis_1 ...Creating composetest_web_1Creating composetest_redis_1 ... doneAttaching to composetest_web_1, composetest_redis_1web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Ooredis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just startedredis_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.confweb_1 | * Restarting with statredis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.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.web_1 | * Debugger is active!redis_1 | 1:M 17 Aug 22:11:10.483 # Server initializedredis_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.web_1 | * Debugger PIN: 330-787-903redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections
启动完成以后可以查看现在的镜像列表,此时列表应返回web和redis两个镜像
$ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZEcomposetest_web latest e2c21aa48cc1 4 minutes ago 93.8MBpython 3.7-alpine 84e6077c7ab6 7 days ago 82.5MBredis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB
查看当前运行的容器列表
$ docker-compose psName Command State Ports-------------------------------------------------------------------composetest_redis_1 /usr/local/bin/run Upcomposetest_web_1 /bin/sh -c python app.py Up 5000->5000/tcp
此时,访问本地http://0.0.0.0:5000/可以查看到我们正在运行的应用程序返回的页面,每次刷新页面,计数就会加1:
"Hello World! I have been seen 1 times."
docker-compose scale
docker-compose scale [options] [SERVICE=NUM...]设置指定服务运行的容器个数。
通过service=num的参数来设置数量。例如:
>docker-compose scale web=3 redis=2 # 将启动3个容器运行web服务,2个容器运行redis服务
一般的,当指定数目多于该服务当前实际运行容器,将新创建并启动容器;反之,将停止容器
停止compose服务
asd
>docker-compose stop
