Docker学习之Compose介绍(6)

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。其代码目前在 https://github.com/docker/com... 上开源。

介绍

Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and runningmulti-container Docker applications)」。python

咱们知道经过Dockerfile 模板文件,可让用户很方便的定义一个单独的应用容器。然而,在平常工做中,常常会碰到须要多个容器相互配合来完成某项任务的状况。例如要实现一个 Web 项目,除了 Web 服务容器自己,每每还须要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。linux

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

Compose 中有两个重要的概念:github

  • 服务 ( service ):一个应用的容器,实际上能够包括若干运行相同镜像的容器实例。
  • 项目 ( project ):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml 文件中定义。

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

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

安装与卸载

Compose 支持 Linux、macOS、Windows 10 三大平台。
Compose 能够经过 Python 的包管理工具 pip 进行安装,也能够直接下载编译好的二进制文件使用,甚至可以直接在 Docker 容器中运行。
前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。docker

接下来看看在Linux系统上的安装。shell

二进制包的安装

在 Linux 上的也安装十分简单,从 官方 Github Realease 处直接下载编译好的二进制文件便可。
好比64为的linux下能够经过以下命令进行安装:数据库

curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

二进制方式安装
设置权限

PIP 安装

注: x86_64 架构的 Linux 建议按照上边的方法下载二进制包进行安装,若是您计算机的架构是 ARM (例如,树莓派),再使用 pip 安装。
这种方式是将 Compose 看成一个 Python 应用来从 pip 源中安装。安装与卸载执行安装命令:flask

sudo pip install -U docker-compose

卸载

若是是二进制包方式安装的,删除二进制文件便可。

$ sudo rm /usr/local/bin/docker-compose

若是是经过 pip 安装的,则执行以下命令便可删除。

$ sudo pip uninstall docker-compose

使用

首先介绍几个术语。

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

可见,一个项目能够由多个服务(容器)关联而成, Compose 面向项目进行管理
最多见的项目是 web项目的管理,如python建站项目

下面咱们用 Python 来创建一个可以记录页面访问次数的 web 网站。

新建文件夹,在该目录中编写 app.py 文件

from flask import Flask
from redis import Redis
app = Flask(__name__)
redis = Redis(host='redis', port=6379)
@app.route('/')
def hello():
count = redis.incr('hits')
return 'Hello World! 该页面已被访问 {} 次。\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)

编写 Dockerfile 文件,内容为

FROM python:3.6-alpine
ADD . /code
WORKDIR /code
RUN pip install redis flask
CMD ["python", "app.py"]

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。

version: '2'
services:
web:
    build: .
    ports:
        - "5000:5000"
redis:
    image: "redis:alpine"

最后经过docker-compose up命令运行 compose 项目

运行项目
这样每刷新一次浏览器就看到数字加1了
展现运行结果

Compose命令说明

命令对象与格式

对于 Compose 来讲,大部分命令的对象既能够是项目自己,也能够指定为项目中的服务或者容器。若是没有特别的说明,命令对象将是项目,这意味着项目中全部的服务都会受到命令影响。
执行 docker-compose [COMMAND] --help 或者 docker-compose help
[COMMAND] 能够查看具体某个命令的使用格式。
docker-compose 命令的基本的使用格式是

docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]

命令选项

  • -f, --file FILE 指定使用的 Compose 模板文件,默认为 dockercompose.yml ,能够屡次指定。
  • -p, --project-name NAME 指定项目名称,默认将使用所在目录名称做为项目名。
  • --x-networking 使用 Docker 的可拔插网络后端特性
  • --x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
  • --verbose 输出更多调试信息。
  • -v, --version 打印版本并退出。

命令使用说明

build
格式为 docker-compose build [options] [SERVICE...] 。构建(从新构建)项目中的服务容器。
命令说明
服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,多是 web_db。
能够随时在项目目录下运行 docker-compose build 来从新构建服务。
选项包括:
--force-rm 删除构建过

$ docker-compose kill -s SIGINT

logs
格式为 docker-compose logs [options] [SERVICE...] 。
查看服务容器的输出。默认状况下,docker-compose 将对不一样的服务输出使用不一样的颜色来区分。能够经过 --no-color 来关闭颜色。
该命令在调试问题的时候十分有用。
pause
格式为 docker-compose pause [SERVICE...] 。
暂停一个服务容器。
port
格式为 docker-compose port [options] SERVICE PRIVATE_PORT 。
打印某个容器端口所映射的公共端口。
选项:
--protocol=proto 指定端口协议,tcp(默认值)或者 udp。
--index=index 若是同一服务存在多个容器,指定命令对象容器的序号(默
认为 1)。
ps
格式为 docker-compose ps [options] [SERVICE...] 。
列出项目中目前的全部容器。
选项:
-q 只打印容器的 ID 信息。
pull
格式为 docker-compose pull [options] [SERVICE...] 。
命令说明

拉取服务依赖的镜像。
选项:
--ignore-pull-failures 忽略拉取镜像过程当中的错误。
push
推送服务依赖的镜像到 Docker 镜像仓库。
restart
格式为 docker-compose restart [options] [SERVICE...] 。
重启项目中的服务。
选项:

  • -t, --timeout TIMEOUT 指定重启前中止容器的超时(默认为 10 秒)。

rm
格式为 docker-compose rm [options] [SERVICE...] 。
删除全部(中止状态的)服务容器。推荐先执行 docker-compose stop 命令来
中止容器。
选项:

  • -f, --force 强制直接删除,包括非中止状态的容器。通常尽可能不要使用该

选项。

  • -v 删除容器所挂载的数据卷。

run
格式为 docker-compose run [options] [-p PORT...] [-e KEY=VAL...]SERVICE [COMMAND] [ARGS...] 。
在指定服务上执行一个命令。
例如:
命令说明

$ docker-compose run ubuntu ping docker.com

将会启动一个 ubuntu 服务容器,并执行 ping docker.com 命令。
默认状况下,若是存在关联,则全部关联的服务将会自动被启动,除非这些服务已
经在运行中。
该命令相似启动容器后运行指定的命令,相关卷、连接等等都将会按照配置自动创
建。
两个不一样点:

  • 给定命令将会覆盖原有的自动运行命令;
  • 不会自动建立端口,以免冲突。

若是不但愿自动启动关联的容器,可使用 --no-deps 选项,例如

$ docker-compose run --no-deps web python manage.py shell

将不会启动 web 容器所关联的其它容器。
选项:

  • -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...] 。
设置指定服务运行的容器个数。
经过 service=num 的参数来设置数量。例如:

$ docker-compose scale web=3 db=2

将启动 3 个容器运行 web 服务,2 个容器运行 db 服务。
通常的,当指定数目多于该服务当前实际运行容器,将新建立并启动容器;反之,将中止容器。
选项:

  • -t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。

start
格式为 docker-compose start [SERVICE...] 。
启动已经存在的服务容器。
stop
格式为 docker-compose stop [options] [SERVICE...] 。
中止已经处于运行状态的容器,但不删除它。经过 docker-compose start 能够再次启动这些容器。
选项:

  • -t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。

top
查看各个服务容器内运行的进程。
unpause
格式为 docker-compose unpause [SERVICE...] 。
命令说明
恢复处于暂停状态中的服务。
up
格式为 docker-compose up [options] [SERVICE...] 。
该命令十分强大,它将尝试自动完成包括构建镜像,(从新)建立服务,启动服务,并关联服务相关容器的一系列操做。连接的服务都将会被自动启动,除非已经处于运行状态。能够说,大部分时候均可以直接经过该命令来启动一个项目。
默认状况, docker-compose up 启动的容器都在前台,控制台将会同时打印全部容器的输出信息,能够很方便进行调试。
当经过 Ctrl-C 中止命令时,全部容器将会中止。
若是使用 docker-compose up -d ,将会在后台启动并运行全部的容器。通常推荐生产环境下使用该选项。
默认状况,若是服务容器已经存在, docker-compose up 将会尝试中止容器,而后从新建立(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配docker-compose.yml 文件的最新内容。若是用户不但愿容器被中止并从新建立,可使用 docker-compose up --no-recreate 。这样将只会启动处于中止状态的容器,而忽略已经运行的服务。若是用户只想从新部署某个服务,可使用docker-compose up --no-deps -d <SERVICE_NAME> 来从新建立服务并后台中止旧服务,启动新服务,并不会影响到其所依赖的服务。
选项:

  • -d 在后台运行服务容器。
  • --no-color 不使用颜色来区分不一样的服务的控制台输出。
  • --no-deps 不启动服务所连接的容器。
  • --force-recreate 强制从新建立容器,不能与 --no-recreate 同时使用。
  • --no-recreate 若是容器已经存在了,则不从新建立,不能与 --forcerecreate 同时使用。命令说明
  • --no-build 不自动构建缺失的服务镜像。
  • -t, --timeout TIMEOUT 中止容器时候的超时(默认为 10 秒)。

version格式为 docker-compose version 。打印版本信息。

相关文章
相关标签/搜索