Docker三剑客之Docker Compose


编排功能是复杂系统实现灵活可操作性的关键。在Docker中,编排意味着用户可以灵活的对各种容器资源实现定义和管理

Compose可以让用户通过编写一个简单的模板文件,快速的创建和管理基于Docker容器的应用集群

简介

Compose定位是:定义和运行多个Docker容器的应用

使用Dockerfile模板文件,可以让用户方便的定义一个单独的应用容器

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目

Compose中的概念:

  1. 服务:一个应用的容器,实际上可以包含若干个运行相同镜像的容器实例

  2. 项目:由一组关联的应用容器组成的一个完整的业务单元,在docker-compose.yml文件中定义

Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷的生命周期管理

Compose实现上调用了Docker服务提供的API来对容器进行管理


安装与卸载

安装Compose之前,先安装Docker

Compose可以通过pip工具进行安装,下载编译好的二进制文件直接使用,直接运行在Docker容器中

前两种方式为传统方式,适合本地环境安装使用;第三种则不破坏系统环境,更适合云计算场景

pip安装

Compose当作一个Python应用来从pip源中安装

1
pip install -U docker-compose

之后可以添加docker-composebash补全命令

1
curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

二进制包

1
2
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose

测试是否安装成功

1
docker-compose version

容器中运行

1
2
curl -L https://github.com/docker/compose/releases/download/1.22.0/run.sh > /usr/local/bin/docker-compose
chmod a+x /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...]

命令选项:

  1. -f,--file FILE:指定使用的Compose模板文件,默认为docker-compose.yml,可多次指定

  2. -p,--project-name NAME:指定项目名称,默认使用所在目录名称作为项目名

  3. --x-networking:使用Docker的可拔插网络后端特性

  4. --x-networking-driver DRIVER:制定网络后端的驱动,默认为bridge

  5. --verbose:输出更多调试信息

  6. -v,--version:打印版本并退出

build

格式:docker-compose build [options] [SERVICE...]

构建(重构)项目中的服务容器

选项:

  1. --force-rm:删除构建过程中的临时容器

  2. --no-cache:构建镜像过程中不使用缓存

  3. --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

显示某个容器端口所映射的公共端口

选项:

  1. --protocol=proto:指定端口协议,默认TCP

  2. --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...]

删除所有(停止状态的)服务容器

选项:

  1. -f,--force:强制删除

  2. -v:删除容器所挂载的数据卷

run

格式:docker-compose run [options] [-p PORT...] [-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]

在指定服务上执行一条命令

默认,如果存在关联,则所有关联的服务将会自动启动,除非这些服务已在运行中

该命令类似于启动容器后运行指定的命令。数据卷,链接等都会按配置自动创建

有两个不同点:

  1. 给定命令将会覆盖原有的自动运行命令

  2. 不会自动创建端口,避免冲突

可使用--no-deps选项,不自动启动关联的容器

选项:

  1. -d:后台运行服务容器

  2. --name NAME:指定容器名

  3. --entrypoint CMD:覆盖默认的容器启动指令

  4. -e KEY=VAL:设置环境变量,可多次使用此选项

  5. -u,--user="":指定运行容器的用户名或uid

  6. --no-deps:不自动启动关联的服务容器

  7. --rm:运行命令后自动删除容器,不可与-d同时使用

  8. -p,--publish=[]:映射端口

  9. --service-ports:配置服务端口并映射到本地主机

  10. -T:不分配伪tty,意味着依赖tty的指令将无法运行

scale

格式:docker-compose scale [options] [SERVICE=NUM...]

设置指定服务运行的容器个数

例:docker-compose scale web=3 db=2

一般情况下,当指定容器数目多于该服务当前实际运行容器个数,将新创建并启动容器;反之,将停止容器

选项:

  1. -t,--timeout TIMEOUT:停止容器时的超时时间(默认10秒)

start

格式:docker-compose start [SERVICE...]

启动已经存在的服务容器

stop

格式:docker-compose stop [options] [SERVICE...]

停止处于运行状态的容器

选项:

  1. -t,--timeout TIMEOUT:停止容器时的超时时间(默认10秒)

unpause

格式:docker-compose unpause [SERVICE...]

恢复处于暂停状态的服务

up

格式:docker-compose up [options] [SERVICE...]

该命令将尝试自动完成包括构建镜像,创建和重建服务,启动服务,关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态

默认,此命令启动的容器都运行在前台,控制台将会同时打印所有容器的输出信息

默认,如果服务容器已存在,此命令会尝试停止容器,然后重新创建,以保证新启动的服务匹配docker-compose.yml文件最新内容

选项:

  1. -d:在后台运行服务容器

  2. --no-color:不使用颜色来区分不同服务的控制台输出

  3. --no-deps:不启动服务所链接的容器,用于重新部署某个服务,不影响其所依赖的服务

  4. --force-recreate:强制重新创建容器,不可与--no-recreate同时使用

  5. --no-recreate:如果容器存在,则不重新创建,不可与--force-recreate同时使用

  6. --no-build:不自动构建缺失的服务镜像

  7. -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
2
3
4
5
6
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"

版本2中,除了可以声明网络和存储信息外,最大的不同是:

  1. 添加了版本信息

  2. 需要将所有的服务放到services根下面

1
2
3
4
5
6
7
8
version: "2"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"

每个服务都必须通过image指令指定镜像或build指令(需要Dockerfile)等来自动构建生成镜像

如果使用build指令,在Dockerfile中设置的选项将会自动被获取,无需在docker-compose.yml中再次设置

build

指定Dockerfile所在的目录路径(绝对路径或者相对路径),Compose将会利用它自动构建镜像,然后使用这个镜像

1
build: /path/to/build/dir

cap_add,cap_drop

指定容器的内核能力分配

让容器拥有所有能力

1
2
cap_add:
- ALL

去掉NET_ADMIN能力

1
2
cap_drop:
- NET_ADMIN

command

覆盖容器启动后默认执行的命令

1
command: echo "hello"

cgroup_parent

指定父cgroup组,意味着将继承该组的资源限制

1
cgroup_parent: cgroups_1

container_name

指定容器名称,默认“项目名称服务名称序号”格式

指定容器名称后,该服务无法进行扩展,因Docker不允许多个容器具有相同的名称

1
container_name: docker-web-container

devices

指定设备映射关系

1
2
devices:
- "/dev/ttyusb1:/dev/ttyusb0"

dns

自定义DNS服务器。可以是一个值,也可以是一个列表

1
2
3
4
5
dns: 8.8.8.8

dns:
- 8.8.8.8
- 9.9.9.9

配置DNS搜索域

1
2
3
4
5
dns_search: example.com

dns_search:
- domain1.example.com
- domain2.example.com

dockerfile

指定额外的编译镜像的Dockerfile文件

不可与image指令同时使用

1
dockerfile: ...

env_file

从文件中获取环境变量

如果通过docker-compose -f FILE方式指定Compose模板文件,则env_file中变量的路径会基于模板文件的路径

如果有变量名称与environment指令冲突,则以environment为准

1
2
3
4
5
6
env_file: .env

env_file:
- ./common.env
- ./apps/web.env
- ./opt/secrets.env

环境变量文件每一行必须符合格式,支持#开头的注释行

1
2
# common.env
PROG_ENV=development

environment

设置环境变量,数组或字典格式

只给定名称的变量会自动获取运行Compose主机上对应变量的值,用来防止泄露不必要的数据

1
2
3
environment:
RACK_ENV: development
SESSION_SECRET:

如果变量名称或者值中用到true|false,yes|no等布尔值,最好放到引号里

expose

暴露端口,但不映射到宿主机,只允许能被连接的服务访问

仅可以指定内部端口为参数

1
2
3
expose:
- "3000"
- "8000"

extends

基于其他模板文件进行扩展

1
2
3
extends:
file: common.yml #其他模板文件
service: webapp #其他模板文件中的服务

会自动继承common.yml中的webapp服务及环境变量定义

注意:

  1. 避免出现循环依赖,例如A依赖B,B依赖C,C依赖A的情况

  2. extends不会继承linksvolumes_from中定义的容器和数据卷资源

链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器

1
2
3
external_links:
- readis
- mysql

extra_hosts

指定额外的host名称映射信息,类似于Docker中的--add-host参数

1
2
3
extra_hosts:
- "googledns:8.8.8.8"
- "dockerhub:52.1.157.61"

会在启动后的服务容器中/etc/hosts文件中添加如下条目

1
2
8.8.8.8 googledns
52.1.157.61 dockerhub

image

指定为镜像名称或镜像ID,如果镜像不存在,Compose将会尝试拉取这个镜像

1
2
image: ubuntu
image: a4bc

labels

为容器添加Docker元数据信息

1
2
labels:
com.startupteam.release: "rc3 for v1"

链接到其他服务中的容器

使用服务名称或服务别名或“服务名称:服务别名”

1
2
3
4
links:
- db
- db:database
- redis

使用的别名将会自动在服务容器中的/etc/hosts中创建

所连接容器中相应的环境变量也将创建

log_driver

指定日志驱动类型,支持三种日志驱动类型,类似于Docker中的--log-driver参数

1
2
3
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"

log_opt

日志驱动的相关参数

1
2
3
log_driver: "syslog"
log_opt:
syslog-address: "tcp://192.168.0.42:123"

net

设置网络模式,类似于docker client--net参数

1
net: "bridge"

pid

跟主机系统共享进程命名空间

打开该选项的容器之间,以及容器与宿主机系统之间可以通过进程ID来相互访问和参数

1
pid: "host"

ports

暴露端口信息

“宿主机:容器”格式或仅指定容器的端口(宿主机会选择随机端口)

1
2
3
4
ports:
- "3000"
- "80:80"
- "127.0.0.1:8000:8000"

security_opt

指定容器模板标签(label)机制的默认属性(用户,角色,类型,级别等)

1
2
3
security_opt:
- label:user:USER
- label:role:ROLE

ulimits

指定容器的ulimits限制值

最大进程数65535,文件句柄数20000(软限制,应用可随时更改,不可超过硬限制)和40000(系统硬限制,只能root用户提高)

1
2
3
4
5
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000

volumes

数据卷所挂载路径设置

1
2
3
4
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro

volumes_driver

数据卷的插件驱动

用户可以先使用第三方驱动创建一个数据卷,然后使用名称来访问它

通过volumes_driver来指定驱动

1
volumes_driver: mydriver

volumes_from

从另一个服务或容器挂载它的数据卷

1
2
3
volumes_from:
- service_name
- container_name

其他指令

指定使用CPU核0和核1,只是用50%资源

1
2
cpuset: 0,1
cpu_shares: 50

指定服务容器启动后执行的命令

1
entrypoint: /code/entrypoint.sh

指定容器中运行应用的用户名

1
user: nginx

指定容器中工作目录

1
working_dir: /code

指定容器中搜索域名,主机名,mac地址等

1
2
3
domainname: your_website.com
hostname: test
mac_address: ...

指定容器

1
ipc: host

指定容器中内存和内存交换区限制

1
2
mem_limit: 1g
memswap_limit: 1g

允许容器中运行一些特权命令

1
privileged: true

指定容器退出后的重启策略

1
restart: always

以只读模式挂载容器的root文件系统

1
read_only: true

打开标准输入,可以接受外部输入

1
stdin_open: true

模拟一个假的远程控制台

1
tty: true

读取环境变量

Compose模板文件支持动态读取主机的系统环境变量

从运行模板文件的环境中读取变量${MONGO_VERSION}的值,并将其写入执行的指令中

1
2
db:
image: "mongo:${MONGO_VERSION}"
---------------The End---------------
0%