编排功能是复杂系统实现灵活可操作性的关键。在Docker中,编排意味着用户可以灵活的对各种容器资源实现定义和管理
Compose可以让用户通过编写一个简单的模板文件,快速的创建和管理基于Docker容器的应用集群
简介
Compose定位是:定义和运行多个Docker容器的应用
使用Dockerfile模板文件,可以让用户方便的定义一个单独的应用容器
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目
Compose中的概念:
服务:一个应用的容器,实际上可以包含若干个运行相同镜像的容器实例
项目:由一组关联的应用容器组成的一个完整的业务单元,在
docker-compose.yml文件中定义
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理
Compose实现上调用了Docker服务提供的API来对容器进行管理
安装与卸载
安装Compose之前,先安装Docker
Compose可以通过pip工具进行安装,下载编译好的二进制文件直接使用,直接运行在Docker容器中
前两种方式为传统方式,适合本地环境安装使用;第三种则不破坏系统环境,更适合云计算场景
pip安装
将Compose当作一个Python应用来从pip源中安装
1 | pip install -U docker-compose |
之后可以添加docker-compose的bash补全命令
1 | curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose |
二进制包
1 | curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose |
测试是否安装成功
1 | docker-compose version |
容器中运行
1 | curl -L https://github.com/docker/compose/releases/download/1.22.0/run.sh > /usr/local/bin/docker-compose |
run.sh执行,其实是下载了docker/compose镜像并运行
卸载
二进制包安装方式
直接删除二进制文件即可
1 | rm /usr/local/bin/docker-compose |
pip安装方式
1 | pip uninstall docker-compose |
Compose命令
对于Compose来说,大部分命令的对象既可以是项目本身,也可以是指定为项目中的服务或者容器
格式:docker-compose [-f=<tag>...] [options] [command] [args...]
命令选项:
-f,--file FILE:指定使用的Compose模板文件,默认为docker-compose.yml,可多次指定-p,--project-name NAME:指定项目名称,默认使用所在目录名称作为项目名--x-networking:使用Docker的可拔插网络后端特性--x-networking-driver DRIVER:制定网络后端的驱动,默认为bridge--verbose:输出更多调试信息-v,--version:打印版本并退出
build
格式:docker-compose build [options] [SERVICE...]
构建(重构)项目中的服务容器
选项:
--force-rm:删除构建过程中的临时容器--no-cache:构建镜像过程中不使用缓存--pull:始终尝试通过拉取操作来获取更新版本镜像
help
获得一个命令的帮助
kill
格式:docker-compose kill [options] [SERVICE...]
通过发送SIGKILL信号来强制停止服务容器
支持通过-s参数来指定发送的信号
logs
格式:docker-compose logs [options] [SERVICE...]
查看服务容器的输出
pause
格式:docker-compose pause [SERVICE...]
暂停一个服务容器
port
格式:docker-compose port [options] SERVICE PRIVATE_PORT
显示某个容器端口所映射的公共端口
选项:
--protocol=proto:指定端口协议,默认TCP--index=index:如果同一服务器存在多个容器,指定命令对象为容器序号(默认为1)
ps
格式:docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器
选项:
-q:只打印容器的ID信息
pull
格式:docker-compose pull [options] [SERVICE...]
拉取服务依赖的镜像
选项:
--ignore-pull-failures:忽略拉取镜像过程中的错误
restart
格式:docker-compose restart [options] [SERVICE...]
重启项目中的服务
选项:
-t,--timeout TIMEOUT:指定重启前停止容器的超时(默认10秒)
rm
格式:docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器
选项:
-f,--force:强制删除-v:删除容器所挂载的数据卷
run
格式:docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一条命令
默认,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已在运行中
该命令类似于启动容器后运行指定的命令。数据卷,链接等都会按配置自动创建
有两个不同点:
给定命令将会覆盖原有的自动运行命令
不会自动创建端口,避免冲突
可使用--no-deps选项,不自动启动关联的容器
选项:
-d:后台运行服务容器--name NAME:指定容器名--entrypoint CMD:覆盖默认的容器启动指令-e KEY=VAL:设置环境变量,可多次使用此选项-u,--user="":指定运行容器的用户名或uid--no-deps:不自动启动关联的服务容器--rm:运行命令后自动删除容器,不可与-d同时使用-p,--publish=[]:映射端口--service-ports:配置服务端口并映射到本地主机-T:不分配伪tty,意味着依赖tty的指令将无法运行
scale
格式:docker-compose scale [options] [SERVICE=NUM...]
设置指定服务运行的容器个数
例:docker-compose scale web=3 db=2
一般情况下,当指定容器数目多于该服务当前实际运行容器个数,将新创建并启动容器;反之,将停止容器
选项:
-t,--timeout TIMEOUT:停止容器时的超时时间(默认10秒)
start
格式:docker-compose start [SERVICE...]
启动已经存在的服务容器
stop
格式:docker-compose stop [options] [SERVICE...]
停止处于运行状态的容器
选项:
-t,--timeout TIMEOUT:停止容器时的超时时间(默认10秒)
unpause
格式:docker-compose unpause [SERVICE...]
恢复处于暂停状态的服务
up
格式:docker-compose up [options] [SERVICE...]
该命令将尝试自动完成包括构建镜像,创建和重建服务,启动服务,关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态
默认,此命令启动的容器都运行在前台,控制台将会同时打印所有容器的输出信息
默认,如果服务容器已存在,此命令会尝试停止容器,然后重新创建,以保证新启动的服务匹配docker-compose.yml文件最新内容
选项:
-d:在后台运行服务容器--no-color:不使用颜色来区分不同服务的控制台输出--no-deps:不启动服务所链接的容器,用于重新部署某个服务,不影响其所依赖的服务--force-recreate:强制重新创建容器,不可与--no-recreate同时使用--no-recreate:如果容器存在,则不重新创建,不可与--force-recreate同时使用--no-build:不自动构建缺失的服务镜像-t,--timeout TIMEOUT:停止容器时的超时时间(默认10秒)
migrate-to-labels
格式:docker-compose migrate-to-labels
重新创建容器,并添加label。添加缺失的容器标签
version
格式:docker-compose version
打印版本信息
Compose环境变量
COMPOSE_PROJECT_NAME
设置Compose的项目名称,默认为当前工作目录(docker-compose.yml文件所在目录)的名称
Compose会为每一个启动的容器前添加的项目名称
COMPOSE_FILE
设置要使用的docker-compose.yml的路径
COMPOSE_API_VERSION
通过指定API版本来临时解决Compose发出的Docker请求版本可能Docker服务端并不支持的问题
DOCKER_HOST
设置Docker服务器的监听地址
DOCKER_TLS_VERIFY
如果该环境变量不为空,则与Docker服务端的所有交互都通过TLS协议进行加密
DOCKER_CERT_PATH
配置TLS通信所需要的验证文件的路径,默认为~/.docker
COMPOSE_HTTP_TIMEOUT
Compose发送往Docker服务端的请求的超时,默认60秒
Compose模板文件
默认的模板文件名称为docker-compose.yml,格式为YAML格式
在版本1中,其中每个顶级元素为服务名称,次级元素为服务容器的配置信息
1 | webapp: |
版本2中,除了可以声明网络和存储信息外,最大的不同是:
添加了版本信息
需要将所有的服务放到
services根下面
1 | version: "2" |
每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)等来自动构建生成镜像
如果使用build指令,在Dockerfile中设置的选项将会自动被获取,无需在docker-compose.yml中再次设置
build
指定Dockerfile所在的目录路径(绝对路径或者相对路径),Compose将会利用它自动构建镜像,然后使用这个镜像
1 | build: /path/to/build/dir |
cap_add,cap_drop
指定容器的内核能力分配
让容器拥有所有能力
1 | cap_add: |
去掉NET_ADMIN能力
1 | cap_drop: |
command
覆盖容器启动后默认执行的命令
1 | command: echo "hello" |
cgroup_parent
指定父cgroup组,意味着将继承该组的资源限制
1 | cgroup_parent: cgroups_1 |
container_name
指定容器名称,默认“项目名称服务名称序号”格式
指定容器名称后,该服务无法进行扩展,因Docker不允许多个容器具有相同的名称
1 | container_name: docker-web-container |
devices
指定设备映射关系
1 | devices: |
dns
自定义DNS服务器。可以是一个值,也可以是一个列表
1 | dns: 8.8.8.8 |
dns_search
配置DNS搜索域
1 | dns_search: example.com |
dockerfile
指定额外的编译镜像的Dockerfile文件
不可与image指令同时使用
1 | dockerfile: ... |
env_file
从文件中获取环境变量
如果通过docker-compose -f FILE方式指定Compose模板文件,则env_file中变量的路径会基于模板文件的路径
如果有变量名称与environment指令冲突,则以environment为准
1 | env_file: .env |
环境变量文件每一行必须符合格式,支持#开头的注释行
1 | # common.env |
environment
设置环境变量,数组或字典格式
只给定名称的变量会自动获取运行Compose主机上对应变量的值,用来防止泄露不必要的数据
1 | environment: |
如果变量名称或者值中用到true|false,yes|no等布尔值,最好放到引号里
expose
暴露端口,但不映射到宿主机,只允许能被连接的服务访问
仅可以指定内部端口为参数
1 | expose: |
extends
基于其他模板文件进行扩展
1 | extends: |
会自动继承common.yml中的webapp服务及环境变量定义
注意:
避免出现循环依赖,例如A依赖B,B依赖C,C依赖A的情况
extends不会继承links和volumes_from中定义的容器和数据卷资源
external_links
链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器
1 | external_links: |
extra_hosts
指定额外的host名称映射信息,类似于Docker中的--add-host参数
1 | extra_hosts: |
会在启动后的服务容器中/etc/hosts文件中添加如下条目
1 | 8.8.8.8 googledns |
image
指定为镜像名称或镜像ID,如果镜像不存在,Compose将会尝试拉取这个镜像
1 | image: ubuntu |
labels
为容器添加Docker元数据信息
1 | labels: |
links
链接到其他服务中的容器
使用服务名称或服务别名或“服务名称:服务别名”
1 | links: |
使用的别名将会自动在服务容器中的/etc/hosts中创建
所连接容器中相应的环境变量也将创建
log_driver
指定日志驱动类型,支持三种日志驱动类型,类似于Docker中的--log-driver参数
1 | log_driver: "json-file" |
log_opt
日志驱动的相关参数
1 | log_driver: "syslog" |
net
设置网络模式,类似于docker client的--net参数
1 | net: "bridge" |
pid
跟主机系统共享进程命名空间
打开该选项的容器之间,以及容器与宿主机系统之间可以通过进程ID来相互访问和参数
1 | pid: "host" |
ports
暴露端口信息
“宿主机:容器”格式或仅指定容器的端口(宿主机会选择随机端口)
1 | ports: |
security_opt
指定容器模板标签(label)机制的默认属性(用户,角色,类型,级别等)
1 | security_opt: |
ulimits
指定容器的ulimits限制值
最大进程数65535,文件句柄数20000(软限制,应用可随时更改,不可超过硬限制)和40000(系统硬限制,只能root用户提高)1
2
3
4
5ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
volumes
数据卷所挂载路径设置
1 | volumes: |
volumes_driver
数据卷的插件驱动
用户可以先使用第三方驱动创建一个数据卷,然后使用名称来访问它
通过volumes_driver来指定驱动
1 | volumes_driver: mydriver |
volumes_from
从另一个服务或容器挂载它的数据卷
1 | volumes_from: |
其他指令
指定使用CPU核0和核1,只是用50%资源
1 | cpuset: 0,1 |
指定服务容器启动后执行的命令
1 | entrypoint: /code/entrypoint.sh |
指定容器中运行应用的用户名
1 | user: nginx |
指定容器中工作目录
1 | working_dir: /code |
指定容器中搜索域名,主机名,mac地址等
1 | domainname: your_website.com |
指定容器
1 | ipc: host |
指定容器中内存和内存交换区限制
1 | mem_limit: 1g |
允许容器中运行一些特权命令
1 | privileged: true |
指定容器退出后的重启策略
1 | restart: always |
以只读模式挂载容器的root文件系统
1 | read_only: true |
打开标准输入,可以接受外部输入
1 | stdin_open: true |
模拟一个假的远程控制台
1 | tty: true |
读取环境变量
Compose模板文件支持动态读取主机的系统环境变量
从运行模板文件的环境中读取变量${MONGO_VERSION}的值,并将其写入执行的指令中
1 | db: |