Compose 简介
Compose是用于定义和运行多容器Docker应用程序的工具,通过Compose,可以使用YML文件来配置应用程序需要的所有服务,然后使用一个命令,就可以从YML文件配置中创建并启动所有服务
Compose使用的三个步骤:
- 使用Dockerfile定义应用程序的环境
- 使用docker_compose.yml定义构成应用程序的服务,这样他们可以再隔离环境中一起运行
- 最后执行dokcer_compose up命令来启动并运行整个应用程序
# yaml 配置实例
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose 安装
Linux
linux上我们可以从Github上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
运行以下命令以先下载Docker Compose的当前稳定版本
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
将可执行权限应用于二进制文件
$ sudo chmod +x /usr/local/bin/docker-compose
创建软链
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
测试是否安装成功:
$ docker-compose --version
cker-compose version 1.24.1, build 4667896b
注意: 对于 alpine,需要以下依赖包: py-pip,python-dev,libffi-dev,openssl-dev,gcc,libc-dev,和 make。
使用
1.创建一个测试目录
$ mkdir composetest
$ cd composetest
在测试目录中创建一个名为app.py的文件,并复制粘贴以下内容:
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)
在此示例中,redis是应用程序网络上的redis容器的主机名,该主机使用的端口为6379
在composetest目录中创建另一个名为requirements.txt的文件,内容如下:
flask
redis
2.创建Dockerfile文件
在composetest目录中,创建一个名为dockerfile的内容如下:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
FROM python:3.7-alpine:从Python3.7影响开始构建镜像
WORKDIR /code 将工作目录设置为/code
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0
设置flask命令使用的环境变量
RUN apk add --no-cache gcc musl-dev linux-headers
安装gcc,以便于入住MarkupSafe和SQLAlchemy之类的P包可以编译加速
COPY ..将.项目中的当前目录复制到.镜像中的工作目录。
CMD["flask","run"]容器提供默认的执行命令:flask run
3.创建docker-compose.yml
# yaml 配置
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
该Compose文件定义了两个服务 web,redis
web:该web服务使用从Dockerfile当前目录中构建的镜像,然后,它将容器和主机保定到暴露的端口5000
redis 该redis服务使用Docker Hub的公共Redis镜像
yml 配置指令参考
version
指定本yml依从的compose哪个版本制定的。
build
指定为构建颈项上下文路径
例如webapp服务,指定为从上下文路径./dir/DOckerfile所右键的镜像:
version: "3.7"
services:
webapp:
build: ./dir
或者,作为具有在上下文指定的路径的对象,以及可选的Dockerfile和args:
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
target: prod
context:上下文路径
dockerfile 指定构建镜像的Dockerfile文件名
args:添加构建参数,这是只能在构建过程中访问的环境变量
labels:设置构建镜像的标签
target:多层构建,可以指定构建哪一层
cap_add,cap_drop
添加或删除容器拥有的宿主机的内核功能
cap_add:
- ALL # 开启全部权限
cap_drop:
- SYS_PTRACE # 关闭 ptrace权限
cgroup_parent
为容器指定父cgroup组,意味着将继承改组的资源限制
cgroup_parent: m-executor-abcd
command
覆盖容器启动的默认命令
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
指定自定义容器名称,而不是生成的默认名称
container_name: my-web-container
depends_on
设置依赖关系
- docker-compose up :以依赖性顺序启动服务。在以下示例中,先启动 db 和 redis ,才会启动 web。
- docker-compose up SERVICE :自动包含 SERVICE 的依赖项。在以下示例中,docker-compose up web 还将创建并启动 db 和 redis。
- docker-compose stop :按依赖关系顺序停止服务。在以下示例中,web 在 db 和 redis 之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
注意:web 服务不会等待 redis db 完全启动 之后才启动。
deploy
指定与服务的部署和运行有关的配置,只在swarm模式下才会有用
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
mode:replicated
replicas: 6
endpoint_mode: dnsrr
labels:
description: "This redis service label"
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
window: 120s
可以选择参数:
endpoint_mode 访问集群服务的方式
labels:在服务上设置标签,可以用容器上的labels(跟deploy同级的配置)覆盖deploy下的labels
mode 指定服务提供的模式:
- replicated:复制服务,复制指定服务到集群的机器上
- global全局服务,服务将部署至集群的每个节点
replicas:mode为replicated时,需要使用此参数配置具体运行的节点数量
resources:配置服务器资源使用的限制,
devices 指定设备映射列表
dns 自定义DNS服务器,可以时单个值或列表的多个值
dns_search 自定义DNS搜索域