Docker三剑客之Compose

什么是Compose

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

其代码目前在 https://github.com/docker/compose 上开源。
Compose 定位是 “定义和运行多个 Docker 容器的应用

我们知道使用一个 Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如要实现一个 Web 项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

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

Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。

安装与卸载

PIP 安装

1
sudo pip install -U docker-compose

安装之后可以通过docker-compose -h来查看用法

PIP 卸载

1
sudo pip uninstall docker-compose

使用

术语

首先介绍几个术语:

  • 服务(service):一个应用容器,实际上可以运行多个相同镜像的实例。
  • 项目(project):由一组关联的应用容器组成的一个完整业务单元。

可见,一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。

示例

Compose 命令说明

命令对象与格式

对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。

命令使用说明

  • build 构建(重新构建)项目中的服务容器。
  • help 获得一个命令的帮助。
  • kill 通过发送 SIGKILL 信号来强制停止服务容器。
  • logs 查看服务容器的输出。默认情况下,docker-compose 将对不同的服务输出使用不同的颜色来区分。可以通过 --no-color 来关闭颜色。
  • pause 暂停一个服务容器。
  • port 打印某个容器端口所映射的公共端口。
  • ps 列出项目中目前的所有容器。
  • restart 重启项目中的服务。
  • rm 删除所有(停止状态的)服务容器。
  • run 在指定服务上执行一个命令。
  • scale 设置指定服务运行的容器个数。
  • start 启动已经存在的服务容器。
  • stop 停止已经处于运行状态的容器,但不删除它。
  • unpause 恢复处于暂停状态中的服务。
  • up 该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。

Compose 模板文件

模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。这里面大部分指令跟docker run相关参数的含义都是类似的。

默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

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 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
  • cap_add, cap_drop 指定容器的内核能力(capacity)分配。
  • command 覆盖容器启动后默认执行的命令。
  • cgroup_parent 指定父 cgroup 组,意味着将继承该组的资源限制。
  • container_name 指定容器名称。默认将会使用 项目名称服务名称序号 这样的格式。
  • devices 指定设备映射关系。
  • dns 自定义 DNS 服务器。可以是一个值,也可以是一个列表。
  • dns_search 配置 DNS 搜索域。可以是一个值,也可以是一个列表。
  • dockerfile 如果需要指定额外的编译镜像的 Dockefile 文件,可以通过该指令来指定。
  • env_file 从文件中获取环境变量,可以为单独的文件路径或列表。
  • environment 设置环境变量。你可以使用数组或字典两种格式。
  • expose 暴露端口,但不映射到宿主机,只被连接的服务访问。
  • extends 基于其它模板文件进行扩展。
  • external_links 链接到 docker-compose.yml 外部的容器,甚至 并非 Compose 管理的外部容器。参数格式跟 links 类似。
  • extra_hosts 类似 Docker 中的 –add-host 参数,指定额外的 host 名称映射信息。
  • image 指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉去这个镜像。
  • labels 为容器添加 Docker 元数据(metadata)信息。例如可以为容器添加辅助说明信息。
  • links 链接到其它服务中的容器。使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以。
  • log_driver 类似 Docker 中的 –log-driver 参数,指定日志驱动类型。
  • log_opt 日志驱动的相关参数。
  • net 设置网络模式。使用和 docker client 的 –net 参数一样的值。
  • pid 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以通过进程 ID 来相互访问和操作。
  • ports 暴露端口信息。
  • security_opt 指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)。
  • ulimits 指定容器的 ulimits 限制值。
  • volumes 数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式(HOST:CONTAINER:ro)。
  • volumes_driver 较新版本的 Docker 支持数据卷的插件驱动。
  • volumes_from 从另一个服务或容器挂载它的数据卷。

更多