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-compose
Downloading 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-compose
sudo chmod a+x /usr/local/bin/docker-compose
# 查看compose版本
$ docker-compose --version
docker-compose version 1.17.1, build 6d101fb
compose使用
术语
- 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
- 项目(project):由一组关联的应用容器组成的一个完整业务单元。
可见,一个项目可以由多个服务(容器)关联而成,Compose面向项目进行管理。
下面我们用Python来建立一个能够记录页面访问次数的web网站。
web应用
新建文件夹,在目录中编写app.py文件
>
mkdir composetest
cd composetest
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.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
此文件包含我们项目中需要下载的包
flask
redis
Dockerfile
编写Dockerfile制作我们需要的镜像
FROM python:3.7-alpine # 以Python 3.7-alpine为基础镜像
ADD . /code # 将当前目录添加.到/code镜像中的路径
WORKDIR /code # 将工作目录设置为/code
RUN 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映射到本地端口5000
volumes:
- .:/code # 添加挂载,将目录下所有的文件挂载到容器/code目录下
redis:
image: "redis:alpine" # 若本地没有redis将自动获取并使用docker-hub提供的redis:alpine镜像
deploy:
replicas: 1 # 设置容器复制因子
resources:
limits: # 每个实例限制为最多使用10%的CPU(在所有核心中)以及50MB RAM
cpus:'0.1'
memory:50M
restart_policy: # 如果某个容器发生故障,立即重启容器
condition: on-failure
networks: # 使用默认设置定义webnet网络
- webnet
networks:
webnet:
启动compose
在项目目录中,通过运行docker-compose up命令启动应用程序
$ docker-compose up
Creating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_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 oO0OoO0OoO0Oo
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
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
web_1 | * Restarting with stat
redis_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 initialized
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.
web_1 | * Debugger PIN: 330-787-903
redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connections
启动完成以后可以查看现在的镜像列表,此时列表应返回web
和redis
两个镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB
python 3.7-alpine 84e6077c7ab6 7 days ago 82.5MB
redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB
查看当前运行的容器列表
$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------------
composetest_redis_1 /usr/local/bin/run Up
composetest_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