容器编排

我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦。如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排。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. uniapp中使用animate.css4.1.1动画库在小程序中不生效解决办法

    找到源码animate.css修改以下代码 :root { --animate-duration: 1s; --animate-delay: 1s; --animate-repeat: 1; } // ...

  2. MA8621带SD读卡的USB 2.0高速3端口HUB方案芯片|MA8621中文规格书|USB 2.0方案

    MA8621说明 MA8621是USB 2.0高速3端口集线器的高性能解决方案,带有SD卡控制器,完全符合通用串行总线规范2.0.控制器继承了先进的串行接口技术,当3个DS(下游)端口同时工作时,功耗 ...

  3. CS5211替代LT7211 DP转LVDS芯片方案 替代龙迅LT7211方案

    LT7211是一种用于虚拟现实/显示应用的高性能C/DP1.2至LVDS芯片方案.LT7211支持DP1.2输入,LT7211可以配置为1.2.4车道,还支持车道交换功能.自适应均衡使其适用于长电缆应 ...

  4. 网络划分和各层协议以及webservice 浅谈

    最近在公司做一些和其他外部系统接口调用的工作,遇到一些网络传输的问题,趁周末的时间记录.整理一下. 提到网络我们不得不提网络的分层架构: 我们通常听到 网络七层架构/五层架构/四层架构,但是不了解很容 ...

  5. Java程序设计基础笔记 • 【第8章 方法】

    全部章节   >>>> 本章目录 8.1 方法概述 8.1.1 方法的简介 8.1.2 方法的类 8.1.3 自定义方法简介 8.1.3 自定义方法调用 8.1.4 实践练习 ...

  6. SpringBoot中如何优雅的使用多线程

    SpringBoot中如何优雅的使用多线程 当异步方法有返回值时,如何获取异步方法执行的返回结果呢?这时需要异步调用的方法带有返回值CompletableFuture

  7. Elasticsearch集群安装Version6.2.2

    Elasticsearch集群安装, 基于Elasticsearch6.2.2版本, 在Linux上安装Elasticsearch集群. 1.安装规划 IP HostName Service Mast ...

  8. 使用 try-catch

    ECMA-262 第 3 版引入了 try-catch 语旬,当 try-catch 语句中发生错误时, 浏览器会认为错误已经被处理了 ,因而不会报告错误.对于那些不要求用户懂技术,也不需要用户理解错 ...

  9. Linux上天之路(五)之Linux基本命令

    1. Linux命令格式 命令 命令选项 学会看语法: {必选项}[可选项] 举例 ls -a /tmp 等价 ls –all /tmp ls 命令 -a 命令选项 简写使用- 全写-- /tmp 参 ...

  10. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...