Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,可以使用YML文件配置应用程序所需要的所有服务,然后使用一个命令,就可以从YML文件配置中创建并启动所有服务了。
Compose的使用步骤:
- 使用Dockerfile定义应用程序的环境
- 使用docker-compose.yml定义构成应用程序的服务
- 执行docker-compose up命令启动并运行整个应用程序。
Compose离线安装
去这里(https://github.com/docker/compose/releases)下载,当前latest release是1.27.4,我下载的是docker-compose-Linux-x86_64。
cd /usr/local/bin
sudo mv /mnt/shared/docker-compose-Linux-x86_64 docker-compose # 把我放在共享文件夹里的文件拖过来
sudo chmod +x docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 制作软连接
pxy@pxy-pc:~/Desktop$ docker-compose --version # 验证
docker-compose version 1.27.4, build 40524192
Compose使用
准备:alpine镜像和相关包
alpine是一个极简os镜像,当成ubuntu那么用就行,装包的时候用
apk add --no-cache [包名]
这里需要 py-pip, libffi-dev, openssl-dev, libc-dev, make, gcc 直接套上面的语句即可。记得commit
docker commit -m="new alpine" -a="pxy" 1091ed6e7827 pxy7896/python-alpine:385
准备:创建测试目录并加入一个app.py文件
目录结构:
pxy@pxy-pc:~/Desktop/composetest$ ll
total 144
drwxrwxr-x 2 pxy pxy 4096 12月 15 17:19 ./
drwxrwxrwx 9 pxy pxy 135168 12月 15 17:17 ../
-rw-rw-r-- 1 pxy pxy 514 12月 15 17:19 app.py
-rw-rw-r-- 1 pxy pxy 12 12月 15 17:19 requirements.txt
app.py内容为
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379) # 主机叫redis
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)
requirements.txt的内容为:
flask
redis
创建Dockerfile文件
在当前目录下创建一个名为Dockerfile的文件,内容为:
FROM pxy7896/python-alpine:385
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"]
创建docker-compose.yml
内容为:
# yaml configuration
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
说明:该Compose文件定义了两个服务。
1.build指使用Dockerfile从当前目录中构建镜像。ports指:Flask Web服务器的默认端口是5000,这里是把容器和主机的5000端口绑定了。
2.redis服务使用DockerHub的公共Redis镜像。
使用Compose命令构建和运行应用
pxy@pxy-pc:~/Desktop/composetest$ docker-compose up
# 如果 docker-compose up -d 则是在后台运行
yml配置指令
version
指定本yml依照哪个compose版本制定。
build
指定构建镜像的上下文路径。也可以带参数。
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_parent: m-executor-abcd
command
覆盖容器启动的默认命令。
command: ["bundle", "exec", "thin", "-p", "3000"]
container_name
自定义容器名称,取代默认名称
container_name: my_name
depends_on
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
在上例中,
命令 | 说明 |
---|---|
docker-compose up | 以依赖性顺序启动服务。上例中先启动db和redis,然后启动web。 |
docker-compose up SERVICE | 启动指定服务。自动包含service的依赖项。也就是说,docker-compose up web 表示还要创建并启动db和redis。 |
docker-compose stop | 按依赖关系顺序停止服务,比如web会在db和redis之前停止。 |
另外,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 | vip:所有的请求会通过一个虚拟ip到达集群服务内部的机器;dnsrr:所有请求会自动轮询获取到集群ip列表中的一个ip地址。 |
labels | 可以用与deploy同级的labels覆盖这里的labels |
mode | replicated:复制服务,复制指定服务到集群的机器上;global:全局服务,服务将部署到集群的每个节点 |
replicas | 上面mode=replicated时,这里指具体运行的节点数量 |
resources | 资源限制。上例表示cpu百分比和内存大小 |
restart_policy | 配置重启容器的方式 |
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.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:
- ./common.env
- ./apps/web.env
- /opt/secrets.env
environment
布尔值需要加引号。
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地址和主机名的对应关系。
healthcheck
用于检测docker服务是否健康运行。
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"] # 设置检测程序
interval: 1m30s # 设置检测间隔
timeout: 10s # 设置检测超时时间
retries: 3 # 设置重试次数
start_period: 40s # 启动后,多少秒开始启动检测程序
image
值用名字、ID都可以。
logging
服务的日志记录配置。driver可以指定日志记录的驱动程序,默认是json-file。可选的是json-file syslog none。
1.达到文件限制上限时,自动删除旧文件。
logging:
driver: json-file
options:
max-size: "200k" # 单个文件大小为200k
max-file: "10" # 最多10个文件
2.指定日志接收地址
logging:
driver: syslog
options:
syslog-address: "tcp://192.168.0.42:123"
network_mode
restart
如果是swarm模式,需要使用restart_policy。
restart: "no" # 默认
restart: always
restart: on-failure # 非正常退出时重启
restart: unless-stopped # 容器退出时总是重启容器,但不重启在Docker守护进程启动时已经停止的容器
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_signal
设置停止容器的替代信号,默认是使用SIGTERM的。
stop_signal: SIGUSR1
stop_grace_period
指定在容器无法处理 SIGTERM (或者任何 stop_signal 的信号),等待多久后发送 SIGKILL 信号关闭容器。默认的等待时间是 10 秒。
stop_grace_period: 1s # 等待 1 秒
stop_grace_period: 1m30s # 等待 1 分 30 秒
sysctls
设置容器中的内核参数。
sysctls:
net.core.somaxconn: 1024
net.ipv4.tcp_syncookies: 0
sysctls:
- 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"