容器编排

我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦。如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排。Docker原生对容器编排的支持非常弱,但是可以通过社区提供的工具来实现容器编排。

Docker Compose

可以通过安装Docker Compose工具来实现基于YAML文件的容器编排,YAML文件会定义一系列的容器以及容器运行时的属性,Docker Compose会根据这些配置来管理容器。

  1. 安装Docker Compose。

    curl -L https://github.com/docker/compose/releases/download/1.25.0-rc2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    chmod +x /usr/local/bin/docker-compose

    说明:如果没有curl工具,在CentOS下可以先通过包管理工具yum安装curl再执行上面的命令。

    当然我们也可以使用Python的包管理工具pip来安装Docker Compose,命令如下所示。

    pip3 install -U docker-compose
  2. 使用Docker Compose。

    我们先创建一个名为composeapp的文件夹并在该文件夹下创建两个子文件夹product-serviceweb-site,如下所示。

    mkdir composeapp
    cd composeapp
    mkdir product-service
    mkdir web-site

    我们先在product-service文件夹下编写提供数据的API接口程序。

    vim product-service/api.py

    我们用Flask来实现一个非常简单的数据接口服务程序。

    from pickle import dumps, loads
    
    from flask import Flask
    from flask_restful import Resource, Api
    from redis import Redis
    from flask_cors import CORS app = Flask(__name__)
    CORS(app, resources={r'/api/*': {'origins': '*'}})
    api = Api(app)
    redis = Redis(host='redis-master', port=6379) class Product(Resource): def get(self):
    data = redis.get('products')
    if not data:
    products = ['Ice Cream', 'Chocolate', 'Coca Cola', 'Hamburger']
    redis.set('products', dumps(products))
    else:
    products = loads(data)
    return {'products': products} api.add_resource(Product, '/api/products') if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000, debug=True)

    由于上面的项目需要依赖flask、 flask-restful等三方库,所以我们再添加一个指明依赖库的文件并将其命名为requirements.txt,其内容如下所示。

    vim product-service/requirements.txt
    flask
    flask-restful
    flask-cors
    redis

    稍后我们会将上面的接口服务放在一个容器中运行,为此我们先编写一个Dockerfile文件以便创建对应的镜像,其内容如下所示。

    vim product-service/Dockerfile
    FROM python:3
    ADD . /root/product-service
    WORKDIR /root/product-service
    RUN pip install -r requirements.txt
    CMD ["python", "api.py"]

    我们再去到web-site目录下创建一个页面,稍后我们会通一个容器来提供Nginx服务并运行该页面,而这个页面会访问我们刚才部署的数据接口服务获取数据并通过Vue.js将数据渲染到页面上。

    vim web-site/index.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>首页</title>
    </head>
    <body>
    <div id="app">
    <h2>产品列表</h2>
    <ul>
    <li v-for="product in products">{{ product }}</li>
    </ul>
    </div>
    <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>
    <script>
    new Vue({
    el: '#app',
    data: {
    products: []
    },
    created() {
    fetch('http://1.2.3.4:8000/api/products')
    .then(resp => resp.json())
    .then(json => {this.products = json.products})
    }
    })
    </script>
    </body>
    </html>

    接下来,我们要通过一个YAML文件来创建三个容器并指明容器之间的依赖关系。

    vim docker-compose.yml
    version: '3'
    services: product-service:
    build: ./product-service
    ports:
    - '8000:8000'
    links:
    - redis-master web-site:
    image: nginx
    ports:
    - '80:80'
    volumes:
    - ./web-site:/usr/share/nginx/html redis-master:
    image: redis
    expose:
    - '6379'

    有了这个YAML文件,我们就可以使用docker-compose命令来创建和管理这三个容器,其命令如下所示。

    docker-compose up
    Creating network "composeapp_default" with the default driver
    Building product-service
    Step 1/5 : FROM python:3
    ---> e497dabd8450
    Step 2/5 : ADD . /root/product-service
    ---> fbe62813d595
    Removing intermediate container 6579e845565a
    Step 3/5 : WORKDIR /root/product-service
    ---> 3a722675e3b1
    Removing intermediate container 57fc490436ce
    Step 4/5 : RUN pip install -r requirements.txt
    ---> Running in cadc2d0c1b9b
    ... ...
    ---> fc747fc11f4a
    Removing intermediate container cadc2d0c1b9b
    Step 5/5 : CMD python api.py
    ---> Running in ecbbd2a69906
    ---> 637e760f2e5b
    Removing intermediate container ecbbd2a69906
    Successfully built 637e760f2e5b
    WARNING: Image for service product-service was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
    Creating composeapp_redis-master_1 ... done
    Creating composeapp_web-site_1 ... done
    Creating composeapp_product-service_1 ... done
    Attaching to composeapp_redis-master_1, composeapp_web-site_1, composeapp_product-service_1
    ... ...

docker容器编排 (4)的更多相关文章

  1. Docker学习(十)Docker容器编排 Docker-compose

    Docker学习(十)Docker容器编排 Docker-compose 标签(空格分隔): docker 容器编排是什么 应用一般由单独容器化的组件组成,须按照一定顺序在网络级别进行组织,以使其能够 ...

  2. Docker容器编排器概览

    就像Apple推出iPhone让智能手机变成主流,Docker让容器变成了主流.自从项目发布以来,Docker着重于提升开发者的体验.基本理念是可以在整个行业中,在一个标准的框架上,构建.交付并且运行 ...

  3. .net core docker容器编排部署(linux)

    环境准备 需要一个linux操作系统:我这里用的是ubuntu 18.04,安装步骤就不说了,网上很多教程,当然也可以私信我. 既然需要用到docker,那么就安装个docker,apt instal ...

  4. Docker 容器编排利器 Docker Compose

    Compose 简介 通过前面几篇文章的学习,我们可以通过 Dockerfile 文件让用户很方便的定义一个单独的应用容器.然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如 ...

  5. docker容器编排原来这么丝滑~

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 概念介绍: Docker Docker 这个东西所扮演的角色,容易理解,它是一个容器引擎,也就是说实际上我们的容器最终是由Docker ...

  6. Docker容器编排工具——docker-compose

    1.docker-compose介绍 2.使用的三个步骤 3.安装docker-compose yum install docker-compose 4.docker-compose.yml 文件 ( ...

  7. Docker - 容器编排工具 compose 之安装

    准备 首先,在使用和安装 docker compose之前,我们应该确保我们已经安装了 docker engine. 安装 官网上面有好多种安装方式,由于我们现在是在使用Docker, 个人感觉应该以 ...

  8. 实战Docker容器调度

    目录 一.前言 二.Docker Compose 2.1.简介 2.2.下载安装 2.3.小实验 2.4.小实验的细节 2.5.Compose file的编写规则 三.Docker Swarm 3.1 ...

  9. docker容器技术基础入门

    目录 docker容器技术基础入门 容器(Container) 传统虚拟化与容器的区别 Linux容器技术 Linux Namespaces CGroups LXC docker基本概念 docker ...

随机推荐

  1. Deep Residual Learning for Image Recognition (ResNet)

    目录 主要内容 代码 He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition[C]. computer vi ...

  2. freeswitch APR-UTIL库线程池实现分析

    概述 freeswitch的核心源代码是基于apr库开发的,在不同的系统上有很好的移植性. APR库在之前的文章中已经介绍过了,APR-UTIL库是和APR并列的工具库,它们都是由APACHE开源出来 ...

  3. 【C#】C#中使用GDAL3(三):Windows下编译插件驱动

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15720236.html 本文为<C#中使用GDAL3>的第三篇,总目录地址:https://www. ...

  4. Java Web程序设计笔记 • 【第4章 JavaBean和JSP标准动作】

    全部章节   >>>> 本章目录 4.1 JavaBean 4.1.1 JavaBean 概述 4.1.2 JavaBean的重要性 4.1.3 JavaBean的特点 4.1 ...

  5. AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at

    AVD Pixel_2_API_30 is already running. lf that is not the case, delete the files at C:\Users\Adminis ...

  6. C# 高性能对象复制

    需求背景:对象复制性能优化:同时,在对象复制时,应跳过引用类型的null值复制,值类型支持值类型向可空类型的复制 -------------- 1 using Common; 2 using Syst ...

  7. css基础-1

    css简介 一.CSS 指层叠样式表 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是为了解决内容与表现分离的问题 外部样式表可以极大提高工作效率 外部 ...

  8. 分享一款开源堡垒机-jumpserver

    本文主文章地址为:https://blog.csdn.net/KH_FC JumpServer是由FIT2CLOUD(飞致远)公司旗下一款开源的堡垒机,这款也是全球首款开源的堡垒机,使用 GNU GP ...

  9. Jenkins_创建git任务(3)

    jenkins创建git任务,需要使用插件 点击Manage Jenkins,点击Manage Plugins 点击Available搜索git,安装git plugin 进入项目管理界面,会有个Gi ...

  10. Python_闭包

    闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...