zoukankan      html  css  js  c++  java
  • 使用 Docker-Compose 编排容器

    我们知道使用一个 Dockerfile 模板文件可以定义一个单独的应用容器,如果需要定义多个容器就需要服务编排。服务编排有很多种技术方案,今天给大家介绍 Docker 官方产品 Docker Compose 。

    Dockerfile 可以让用户管理一个单独的应用容器;而 Compose 则允许用户在一个模板(YAML 格式)中定义一组相关联的应用容器(被称为一个 project,即项目),例如一个 Web 服务容器再加上后端的数据库服务容器等。

    在Docker for Windows中,docker-compose是被默认安装的,你可以通过--version参数来查看安装的版本:

    Docker Compose 介绍

    Docker-Compose 是 Docker 的一种编排服务,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。

    通过 Docker-Compose 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

    Docker Compose 工作原理图

     Compose 中有两个重要的概念:

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

    一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理,通过子命令对项目中的一组容器进行便捷地生命周期管理。

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

    Quick Start

    我们以官网上的简单示例来看看 docker compose 的使用方法。

    我们设计这么一个场景,使用 Python 启动一个 Web 服务,输出一个hello()方法,每次访问的时候在 Redis 缓存中进行计数,并且将统计的结果打印到页面中。

    第一步,创建 Python 服务

    创建项目路径:

    mkdir composetest
    cd composetest

    在目录下创建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.
    '.format(count)
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", debug=True)

    在这个例子中, redis 使用了容器内的网络默认端口是6379。这段 Python 程序的内容就是,启动后连接 Redis 并且输出 hello()方法,当每次访问的时候累计访问次数并且将结果放回到页面。

    在同目录下创建requirements.txt文件,添加项目依赖的python包:

    flask
    redis

    第二步,创建 Dockerfile

    我们来写一个 Dockerfile 来定义 Docker 镜像,此镜像包含了 Python 的依赖包和 Python 环境。

    同样在此目录下,我们创建一个 Dockerfile 文件。

    FROM python:3.4-alpine
    ADD . /code
    WORKDIR /code
    RUN pip install -r requirements.txt
    CMD ["python", "app.py"]

    这段代码表示:

    • 使用基础镜像 Python 3.4
    • 将当前目录映射到镜像/code目录下
    • 设置工作目录为 /code
    • 安装 Python 依赖包
    • 启动 app.py 程序

    第三步,使用 Compose 文件定义一个服务

    在当期目录下,我们创建一个 docker-compose.yml 文件,内容如下:

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

    这个 Compose 文件定义了两个服务, 一个 Pyhon Web 服务和 redis 服务。

    • Pyhon Web 服务:使用 Dockerfile 构建了当前镜像。将 Web 容器内部的5000端口映射到 host 的5000端口;并将 Web 容器与 redis 容器连接。
    • redis服务:该容器直接由官方的 redis 镜像创建。

    此时,工作文件夹应如下:

    第四步,使用 Compose 编译启动应用

    使用命令docker-compose up启动(+d的话表示在后台启动):

    version: '2'
    services:
      web:
        build: .
        command: python app.py
        ports:
         - "5000:5000"
        volumes:
         - .:/code
      redis:
        image: "redis:alpine"

    启动成功之后,在浏览器访问:http://ipaddress:5000/ ,返回如下:

    不断的刷新数字会不断的增长。

     Docker Compose 常用命令

    使用 docker-compose up -d 在后台启动服务

    C:Users20928Downloadscomposetest>docker-compose up
    Starting composetest_web_1   ... done                                                                                                                        Starting composetest_redis_1 ... done                                                                                                                        Attaching to composetest_web_1, composetest_redis_1

    使用 docker-compose ps 命令查看启动的服务 

    C:Users20928Downloadscomposetest>docker-compose ps
    系统找不到指定的路径。
           Name                      Command               State    Ports
    ---------------------------------------------------------------------
    composetest_redis_1   docker-entrypoint.sh redis ...   Exit 0
    composetest_web_1     python app.py                    Exit 0

    使用docker-compose stop停止服务。

    C:Users20928Downloadscomposetest>docker-compose stop
    Stopping composetest_web_1   ... done                                                                                                                        Stopping composetest_redis_1 ... done   

    其它常用命令

    #查看帮助
    docker-compose -h
    
    # -f  指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
    docker-compose -f docker-compose.yml up -d 
    
    #启动所有容器,-d 将会在后台启动并运行所有的容器
    docker-compose up -d
    
    #停用移除所有容器以及网络相关
    docker-compose down
    
    #查看服务容器的输出
    docker-compose logs
    
    #列出项目中目前的所有容器
    docker-compose ps
    
    #构建(重新构建)项目中的服务容器。服务容器一旦构建后,将会带上一个标记名,例如对于 web 项目中的一个 db 容器,可能是 web_db。可以随时在项目目录下运行 docker-compose build 来重新构建服务
    docker-compose build
    
    #拉取服务依赖的镜像
    docker-compose pull
    
    #重启项目中的服务
    docker-compose restart
    
    #删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
    docker-compose rm 
    
    #在指定服务上执行一个命令。
    docker-compose run ubuntu ping docker.com
    
    #设置指定服务运行的容器个数。通过 service=num 的参数来设置数量
    docker-compose scale web=3 db=2
    
    #启动已经存在的服务容器。
    docker-compose start
    
    #停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
    docker-compose stop

    参考链接:

    1. https://zhuanlan.zhihu.com/p/34935579

    2. https://www.cnblogs.com/daxnet/p/7719574.html

  • 相关阅读:
    C语言写的trim()函数
    TCP/IP和Socket的关系
    sizeof(数组名)和sizeof(指针)
    字符数组和结束符/0之间的关系
    C语言中二维字符数组的定义和初始化
    异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
    do{...}while(0)的意义和用法
    Mirror--如何在主库上增加文件
    曲苑杂坛--收缩数据库文件
    常用脚本--SQL Server获取OS日志
  • 原文地址:https://www.cnblogs.com/lfri/p/11670159.html
Copyright © 2011-2022 走看看