美文网首页
Docker Compose

Docker Compose

作者: Alexander_Zz | 来源:发表于2020-03-31 09:45 被阅读0次

    介绍

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。其代码目前在 https://github.com/docker/compose 上开源。Compose 定位是 定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications),其前身是开源项目 Fig
    日常工作中,常会碰到需要多个容器相互配合来完成某项目情况。此时就需要用到 Compose 了,它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)
    Compose 中有两个概念

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

    Compose 默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理
    Compose 项目由 Python 编写,实际上调用了 Docker 服务提供的 API 来对容器进行管理。所以只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理

    安装与卸载

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

    $ docker-compose --version
    docker-compose version 1.17.1, build 6d101fb
    

    二进制安装

    在 Linux 上的安装十分简单,从官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包

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

    pip 安装

    注:x86_64 架构的 Linux 建议按照上述方法下载二进制包进行安装,如果架构是 ARM (如:树莓派),再使用 pip 安装
    这种方式是将 Compose 当做一个 Python 应用从 pip 源中安装,命令如下

    $ sudo pip install -U docker-compose
    Collecting docker-compose
      Downloading docker-compose-1.17.1.tar.gz (149kB): 149kB downloaded
    ...
    Successfully installed docker-compose cached-property requests texttable websocket-client docker-py dockerpty six enum34 backports.ssl-match-hostname ipaddress
    

    bash 补全命令

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

    容器中执行

    Compose 是一个 Python 应用,亦可使用容器来执行

    $ curl -L https://github.com/docker/compose/releases/download/1.8.0/run.sh > /usr/local/bin/docker-compose
    $ chmod +x /usr/local/bin/docker-compose
    

    run.sh 脚本内容如下

    #!/bin/bash
    #
    # Run docker-compose in a container
    #
    # This script will attempt to mirror the host paths by using volumes for the
    # following paths:
    #   * $(pwd)
    #   * $(dirname $COMPOSE_FILE) if it's set
    #   * $HOME if it's set
    #
    # You can add additional volumes (or any docker run options) using
    # the $COMPOSE_OPTIONS environment variable.
    #
    
    
    set -e
    
    VERSION="1.8.0"
    IMAGE="docker/compose:$VERSION"
    
    
    # Setup options for connecting to docker host
    if [ -z "$DOCKER_HOST" ]; then
        DOCKER_HOST="/var/run/docker.sock"
    fi
    if [ -S "$DOCKER_HOST" ]; then
        DOCKER_ADDR="-v $DOCKER_HOST:$DOCKER_HOST -e DOCKER_HOST"
    else
        DOCKER_ADDR="-e DOCKER_HOST -e DOCKER_TLS_VERIFY -e DOCKER_CERT_PATH"
    fi
    
    
    # Setup volume mounts for compose config and context
    if [ "$(pwd)" != '/' ]; then
        VOLUMES="-v $(pwd):$(pwd)"
    fi
    if [ -n "$COMPOSE_FILE" ]; then
        compose_dir=$(dirname $COMPOSE_FILE)
    fi
    # TODO: also check --file argument
    if [ -n "$compose_dir" ]; then
        VOLUMES="$VOLUMES -v $compose_dir:$compose_dir"
    fi
    if [ -n "$HOME" ]; then
        VOLUMES="$VOLUMES -v $HOME:$HOME -v $HOME:/root" # mount $HOME in /root to share docker.config
    fi
    
    # Only allocate tty if we detect one
    if [ -t 1 ]; then
        DOCKER_RUN_OPTIONS="-t"
    fi
    if [ -t 0 ]; then
        DOCKER_RUN_OPTIONS="$DOCKER_RUN_OPTIONS -i"
    fi
    
    exec docker run --rm $DOCKER_RUN_OPTIONS $DOCKER_ADDR $COMPOSE_OPTIONS $VOLUMES -w "$(pwd)" $IMAGE "$@"
    

    可以看到,它只是下载了 docker/compose 镜像并运行

    卸载

    若是二进制方式安装,删除二进制文件即可

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

    如果是通过 pip 安装的,执行如下命令即可

    $ sudo pip uninstall docker-compose
    

    使用

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

    $ mkdir pydemo
    $ vim pydemo/app.py
    
    import time
    import redis
    from flask import Flask
    
    app = Flask(__name__)
    cache = redis.Redis(host='redis', port=6379)
    
    def get_hit_count():
      retries = 5
      while True:
        try:
          return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
          if retries == 0:
            raise exc
          retries -= 1
          time.sleep(0.5)
    
    @app.route('/')
    def hello():
      count = get_hit_count()
      return 'Hello World! I have been seen {} times.\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"
        volumes:
        - .:/code
      redis:
        image: "redis:alpine"
    

    运行 compose 项目

    $ docker-compose up
    

    此时访问本地 5000 端口,每次刷新页面,计数就会加 1

    Compose 命令

    对于 Compose 来说,大部分命令的对象即可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响
    执行 docker-compose [COMMAND] --help 或者 docker-compose htlp [COMMAND] 可以查看具体某个命令的使用格式
    docker-compose 命令基本使用格式如下

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

    命令选项

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

    build 格式为 docker-compose build [options] [SERVICE...],构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db,可以随时在项目目录下运行 docker-compose build 来重新构建服务选项如下

    • --force-rm
      删除构建过程中的临时容器
    • --no-cache
      构建镜像过程中不是用 cache (这将加长构建过程)
    • --pull
      始终尝试通过 pull 来获取更新版本的镜像

    config:验证 Compose 文件格式是否正确,若正确则显示配置,若格式错误则显示错误原因
    down:此命令将会停止 up 命令所启动的容器,并移除网络
    exec:进入指定容器
    help:获得一个命令的帮助
    images:列出 Compose 文件中包含的镜像
    kill:格式为 docker-compose kill [options] [SERVICE...],通过发送 SIGKILL 信号来强制停止服务容器。支持通过 -s 参数来指定发送的信号,例如通过如下指令发送 SIGINT 信号

    $ 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=VALUE
      设置环境变量值,可多次使用选项来设置多个环境变量
    • -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-compuse up --no-recreate,如此至启动处于停止状态的容器,忽略运行中容器

    如果用户只想重新部署某个服务,可使用 docker-compose up --no-deps -d <SERVICE_NAME> 来重新创建服务并后台停止旧服务,启动新服务,并不影响其依赖服务,选项

    • -d
      在后台运行服务容器
    • --no-color
      不使用颜色来区分不同的服务控制台输出
    • --no-deps
      不启动服务所链接的容器
    • --force-recreate
      强制重新创建容器,不能与 --no-recreate 同时使用
    • --no-recreate
      若容器已存在,则不重新创建,不能与 --force-recreate 同时使用
    • --no-build
      不自动构建缺失的服务镜像
    • -t--timeout TIMEOUT
      停止容器的超时时长(默认 10 秒)

    相关文章

      网友评论

          本文标题:Docker Compose

          本文链接:https://www.haomeiwen.com/subject/wnhklhtx.html