欢迎您, 来到 宁时修博客.^_^

Docker系列11--Docker Compose(上)

2018/11/20 言则行 Docker 421
Docker容器技术

一、Docker Compose

    Docker Compose  是 Docker 官方开源编排(Orchestration)项目之一,负责实现对 Docker 容器集群的快速编排,快速的部署分布式应用。

    Compose  定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。

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

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


    Compose  中有两个重要的概念:

        服务 ( service  ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

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


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

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




二、安装与卸载

    Compose  可以通过 Python 的包管理工具  pip  进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

    前两种方式是传统方式,适合本地环境下安装使用;最后一种方式不破坏系统环境,更适合云计算场景。

    Docker for Mac  、 Docker for Windows  自带  docker-compose  二进制文件,安装 Docker 之后可以直接使用。Linux系统需要另外安装。


    1)二进制包安装

    从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

$ curl -L  \ 
> /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose 
$ ll /usr/local/bin/docker-compose 
-rwxr-xr-x 1 root root 11737584 Nov 20 05:56 /usr/local/bin/docker-compose



    2) 卸载

    二进制包方式安装的,删除二进制文件即可:

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



三、使用Compose

    术语:

        服务 ( service  ):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

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

    

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



    示例项目

    最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。

    用  Python  来建立一个能够记录页面访问次数的 web 网站。


    新建个目录,该目录下用python写一个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: '3'
services:

  web:
    build: .
    ports:
     - "5000:5000"

  redis:
    image: "redis:alpine"


    运行docker-compose项目:

$ docker-compose up


    访问  主机IP:5000 ,每次刷新页面,计数就会加 1。这个项目并不持久运行,退出就结束了。



四、Compose命令

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

docker-compose --help
Define and run multi-container applications with Docker.

Usage:
  docker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]
  docker-compose -h|--help

Options:
  -f, --file FILE             Specify an alternate compose file
                              (default: docker-compose.yml)
                              指定使用的Compose 模板文件(默认docker-compose.yml)。
                              可以多次指定。
  -p, --project-name NAME     Specify an alternate project name
                              (default: directory name)
                              指定项目名称(默认 使用所在目录名作为项目名)。
  --verbose                   Show more output
                              显示更多调试信息
  --log-level LEVEL           Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
                              设置日志级别
  --no-ansi                   Do not print ANSI control characters
  -v, --version               Print version and exit
  -H, --host HOST             Daemon socket to connect to
                              连接守护进程的unix socket
  --tls                       Use TLS; implied by --tlsverify
  --tlscacert CA_PATH         Trust certs signed only by this CA
  --tlscert CLIENT_CERT_PATH  Path to TLS certificate file
  --tlskey TLS_KEY_PATH       Path to TLS key file
  --tlsverify                 Use TLS and verify the remote
  --skip-hostname-check       Don't check the daemon's hostname against the
                              name specified in the client certificate
  --project-directory PATH    Specify an alternate working directory
                              (default: the path of the Compose file)
                              指定容器的工作目录(默认 compose文件路径)
  --compatibility             If set, Compose will attempt to convert deploy
                              keys in v3 files to their non-Swarm equivalent

Commands:
  build              Build or rebuild services
                     构建(或重新构建)项目中的服务容器
  bundle             Generate a Docker bundle from the Compose file
  config             Validate and view the Compose file
                     验证 Compose 文件格式是否正确,正确则显示配置,格式错误显示错误原因。
  create             Create services
  down               Stop and remove containers, networks, images, and volumes
                     将停止up命令所启动的容器,并移除containers、networks、images、volumes。
  events             Receive real time events from containers
  exec               Execute a command in a running container
                     进入一个运行着容器执行命令
  help               Get help on a command
  images             List images
                     列出 Compose 文件中包含的镜像
  kill               Kill containers
                     发送SIGKILL信号来强制停止服务容器。-s:指定发送的信号。
  logs               View output from containers
                     查看服务容器的输出。默认情况下,docker-compose 将对不同的服务
                     输出使用不同的颜色来区分。可以通过--no-color来关闭颜色。
  pause              Pause services
                     暂停一个服务容器
  port               Print the public port for a port binding
                     打印某个容器端口所映射的公共端口
  ps                 List containers
                     列出项目中目前的所有容器。-q  只打印容器的 ID 信息
  pull               Pull service images
                     拉取服务依赖的镜像。--ignore-pull-failures忽略拉取镜像过程中的错误
  push               Push service images
                     推送服务依赖的镜像到镜像仓库
  restart            Restart services
                     重启项目中的服务容器。
  rm                 Remove stopped containers
                     删除停止状态的服务容器
  run                Run a one-off command
  scale              Set number of containers for a service
  start              Start services
                     启动已经存在且处于停止状态的服务容器
  stop               Stop services
                     停止已经处于运行状态的容器,并不删除
  top                Display the running processes
                     显示各个服务容器内运行的进程
  unpause            Unpause services
                     恢复处于暂停状态中的服务容器
  up                 Create and start containers
  version            Show the Docker-Compose version information

    执行  docker-compose [COMMAND] --help  或者  docker-compose help [COMMAND]  可以查看具体某个命令的使用格式。


  

    命令使用:

    build

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

    格式:

docker-compose build [options] [--build-arg key=val...] [SERVICE...]

    服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。

    可以随时在项目目录下运行  docker-compose build  来重新构建服务。


    选项包括:

--compress   使用gzip压缩构建上下文。
--force-rm    删除构建过程中的临时容器。
--no-cache    构建镜像过程中不使用 cache(这将加长构建过程)。
--pull        始终尝试通过 pull 来获取更新版本的镜像。
-m, --memory MEM  设置构建的容器内存限制


    port

    打印某个容器端口所映射的公共端口。

    --protocol=proto  指定端口协议,tcp(默认值)或者 udp。

    --index=index  如果同一服务存在多个容器,指定命令对象容器的序号(默认为 1)。


    rm

    删除停止状态的服务容器,先执行  docker-compose stop  命令来停止容器。

    -f, --force  强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。

    -s, --stop   删除容器之前停止容器

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


    run

    默认情况下,如果存在关联,则所有关联的服务将被自动启动,除非这些服务已经在运行中。

    该命令类似启动容器后运行指定的命令,相关卷、链接等等都将会按照配置自动创建。


    两个不同点:

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

        不会自动创建端口,以避免冲突。


    如果不希望自动启动关联的容器,可以使用  --no-deps  选项。

    命令参数:

-d, --detach     后台运行容器。
--name NAME   为容器指定一个名字。
--entrypoint CMD  覆盖默认的容器启动指令。
-e KEY=VAL    设置环境变量值,可多次使用选项来设置多个环境变量。
-u, --user=""    指定运行容器的用户名或者 uid。
--no-deps    不自动启动关联的服务容器。
--rm    运行命令后自动删除容器, -d 模式下将忽略。
-p, --publish=[]  映射容器端口到本地主机。
--service-ports  配置服务端口并映射到本地主机。
--use-aliases    在所连接的网络中使用服务的网络别名
-v, --volume=[]   挂载一个数据卷
-T  不分配伪 tty,意味着依赖 tty 的指令将无法运行。
-w, --workdir=""   容器内的工作目录


    scale

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

    格式为 service=num,例如:

$ docker-compose scale web=3 db=2

    启动 3 个容器运行 web 服务,2 个容器运行 db 服务。

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


    up

    创建和运行服务容器。

    up命令将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。

    被链接的服务都将会被自动启动,除非已经处于运行状态。

    大部分时候都可以直接通过该命令来启动一个项目。

    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, --detach      在后台运行服务容器。
--no-color    不使用颜色来区分不同的服务的控制台输出。
--no-deps     不启动服务所链接的容器。
--force-recreate  强制重新创建容器,不能与  --no-recreate 同时使用。
--no-recreate  如果容器已经存在了,则不重新创建,不能与--force-recreate同时使用。
--no-build  不自动构建缺失的服务镜像。


点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群