共计 8703 个字符,预计需要花费 22 分钟才能阅读完成。
Docker Compose
Compose 简介
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您能够应用 YML 文件来配置应用程序须要的所有服务。而后,应用一个命令,就能够从 YML 文件配置中创立并启动所有服务。举荐分布式架构源码
如果你还不理解 YML 文件配置,能够先浏览。
Compose 应用的三个步骤:
应用 Dockerfile 定义应用程序的环境。
应用 docker-compose.yml 定义形成应用程序的服务,这样它们能够在隔离环境中一起运行。
最初,执行 docker-compose up 命令来启动并运行整个应用程序。
docker-compose.yml 的配置案例如下(配置参数参考下文):
实例
# 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 上下载它的二进制包来应用,最新发行的版本地址:。
运行以下命令以下载 Docker Compose 的以后稳固版本:
$ sudo curl -L "(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
要装置其余版本的 Compose,请替换 1.24.1。
将可执行权限利用于二进制文件:
$ 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。
macOS
Mac 的 Docker 桌面版和 Docker Toolbox 曾经包含 Compose 和其余 Docker 应用程序,因而 Mac 用户不须要独自装置 Compose。Docker 装置阐明能够参阅。
windows PC
Windows 的 Docker 桌面版和 Docker Toolbox 曾经包含 Compose 和其余 Docker 应用程序,因而 Windows 用户不须要独自装置 Compose。Docker 装置阐明能够参阅。
应用
1、筹备
创立一个测试目录:
$ mkdir composetest
$ cd composetest
在测试目录中创立一个名为 app.py 的文件,并复制粘贴以下内容:
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.0RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .CMD ["flask", "run"]
Dockerfile 内容解释:
FROM python:3.7-alpine: 从 Python 3.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 之类的 Python 包能够编译减速。
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
复制 requirements.txt 并装置 Python 依赖项。
COPY . .: 将 . 我的项目中的当前目录复制到 . 镜像中的工作目录。
CMD [“flask”, “run”]: 容器提供默认的执行命令为:flask run。
3、创立 docker-compose.yml
在测试目录中创立一个名为 docker-compose.yml 的文件,而后粘贴以下内容:
docker-compose.yml 配置文件
# yaml 配置
version : '3'
services:
web:
build : .
ports :
- "5000:5000"
redis:
image : "redis:alpine"
该 Compose 文件定义了两个服务:web 和 redis。
web:该 web 服务应用从 Dockerfile 当前目录中构建的镜像。而后,它将容器和主机绑定到裸露的端口 5000。此示例服务应用 Flask Web 服务器的默认端口 5000。
redis:该 redis 服务应用 Docker Hub 的公共 Redis 映像。
4、应用 Compose 命令构建和运行您的利用
在测试目录中,执行以下命令来启动应用程序:
docker-compose up
如果你想在后盾执行该服务能够加上 -d 参数:
docker-compose up -d
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:拜访集群服务的形式。
endpoint_mode: vip
# Docker 集群服务一个对外的虚构 ip。所有的申请都会通过这个虚构 ip 达到集群服务外部的机器。endpoint_mode: dnsrr# DNS 轮询(DNSRR)。所有的申请会主动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。能够用容器上的 labels(跟 deploy 同级的配置)笼罩 deploy 下的 labels。
mode:指定服务提供的模式。
replicated:复制服务,复制指定服务到集群的机器上。
global:全局服务,服务将部署至集群的每个节点。
图解:下图中黄色的方块是 replicated 模式的运行状况,灰色方块是 global 模式的运行状况。
replicas:mode 为 replicated 时,须要应用此参数配置具体运行的节点数量。
resources:配置服务器资源应用的限度,例如上例子,配置 redis 集群运行须要的 cpu 的百分比 和 内存的占用。防止占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。
condition:可选 none,on-failure 或者 any(默认值:any)。
delay:设置多久之后重启(默认值:0)。
max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:始终重试)。
window:设置容器重启超时工夫(默认值:0)。
rollback_config:配置在更新失败的状况下应如何回滚服务。
parallelism:一次要回滚的容器数。如果设置为 0,则所有容器将同时回滚。
delay:每个容器组回滚之间期待的工夫(默认为 0s)。
failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认 pause)。
monitor:每个容器更新后,继续察看是否失败了的工夫 (ns|us|ms|s|m|h)(默认为 0s)。
max_failure_ratio:在回滚期间能够容忍的故障率(默认为 0)。
order:回滚期间的操作程序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first)。
update_config:配置应如何更新服务,对于配置滚动更新很有用。
parallelism:一次更新的容器数。
delay:在更新一组容器之间期待的工夫。
failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者 pause(默认:pause)。
monitor:每个容器更新后,继续察看是否失败了的工夫 (ns|us|ms|s|m|h)(默认为 0s)。
max_failure_ratio:在更新过程中能够容忍的故障率。
order:回滚期间的操作程序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first)。
注:仅反对 V3.4 及更高版本。
devices
指定设施映射列表。
devices:
- "/dev/ttyUSB0:/dev/ttyUSB0"
dns
自定义 DNS 服务器,能够是单个值或列表的多个值。
dns: 8.8.8.8dns:
- 8.8.8.8
- 9.9.9.9
dns_search
自定义 DNS 搜寻域。能够是单个值或列表。
dns_search: example.com
dns_search:
- dc1.example.com - dc2.example.com
entrypoint
笼罩容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也能够是以下格局:
entrypoint:
- php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1
- vendor/bin/phpunit
env_file
从文件增加环境变量。能够是单个值或列表的多个值。
`env_file: .env`
也能够是列表格局:
env_file:
- ./common.env - ./apps/web.env - /opt/secrets.env
environment
增加环境变量。您能够应用数组或字典、任何布尔值,布尔值须要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment:
RACK_ENV: development
SHOW: 'true'
expose
裸露端口,但不映射到宿主机,只被连贯的服务拜访。
仅能够指定外部端口为参数:
expose:
- "3000"
- "8000"
extra_hosts
增加主机名映射。相似 docker client –add-host。
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
以上会在此服务的外部容器中 /etc/hosts 创立一个具备 ip 地址和主机名的映射关系:
162.242.195.82 somehost50.31.209.229 otherhost
healthcheck
用于检测 docker 服务是否衰弱运行。
healthcheck:
test: ["CMD", "curl", "-f", "] # 设置检测程序
interval: 1m30s # 设置检测距离
timeout: 10s # 设置检测超时工夫
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
image
指定容器运行的镜像。以下格局都能够:
image: redis
image: ubuntu:14.04image: tutum/influxdb
image: example-registry.com:4000/postgresql
image: a4bc65fd # 镜像 id
logging
服务的日志记录配置。
driver:指定服务容器的日志记录驱动程序,默认值为 json-file。有以下三个选项
driver: "json-file"driver: "syslog"driver: "none"
仅在 json-file 驱动程序下,能够应用以下参数,限度日志得数量和大小。
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为 200k
max-file: "10" # 最多 10 个文件
当达到文件限度下限,会主动删除旧得文件。
syslog 驱动程序下,能够应用 syslog-address 指定日志接管地址。
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode
设置网络模式。
network_mode: "bridge"network_mode: "host"network_mode: "none"network_mode: "service:[service name]"network_mode: "container:[container name/id]"
networks
配置容器连贯的网络,援用顶级 networks 下的条目。
services:
some-service:
networks:
some-network:
aliases:
- alias1
other-network:
aliases:
- alias2
networks:
some-network:
# Use a custom driver
driver: custom-driver-1
other-network:
# Use a custom driver which takes special options
driver: custom-driver-2
aliases:同一网络上的其余容器能够应用服务名称或此别名来连贯到对应容器的服务。
restart
no:是默认的重启策略,在任何状况下都不会重启容器。
always:容器总是重新启动。
on-failure:在容器非正常退出时(退出状态非 0),才会重启容器。
unless-stopped:在容器退出时总是重启容器,然而不思考在 Docker 守护过程启动时就曾经进行了的容器
restart: "no"restart: always
restart: on-failure
restart: unless-stopped
注:swarm 集群模式,请改用 restart_policy。
secrets
存储敏感数据,例如明码:
version: "3.1"services:mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret.txt
security_opt
批改容器默认的 schema 标签。
security-opt:- label:user:USER # 设置容器的用户标签
- label:role:ROLE # 设置容器的角色标签
- label:type:TYPE # 设置容器的安全策略标签
- label:level:LEVEL # 设置容器的安全等级标签
stop_grace_period
指定在容器无奈解决 SIGTERM (或者任何 stop_signal 的信号),期待多久后发送 SIGKILL 信号敞开容器。
stop_grace_period: 1s # 期待 1 秒 stop_grace_period: 1m30s # 期待 1 分 30 秒
默认的等待时间是 10 秒。
stop_signal
设置进行容器的代替信号。默认状况下应用 SIGTERM。
以下示例,应用 SIGUSR1 代替信号 SIGTERM 来进行容器。stop_signal: SIGUSR1
sysctls
设置容器中的内核参数,能够应用数组或字典格局。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0sysctls:
- net.core.somaxconn=1024
- net.ipv4.tcp_syncookies=0
tmpfs
在容器内装置一个临时文件零碎。能够是单个值或列表的多个值。
tmpfs: /run
tmpfs:
- /run - /tmp
ulimits
笼罩容器默认的 ulimit。
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
将主机的数据卷或着文件挂载到容器里。
version: "3.7"services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"