容器编排

我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦。如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排。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. [opencv]白平衡算法中的灰度世界法,改善图像发红发蓝发绿的现象

    #include<iostream> #include <opencv2/opencv.hpp> #include <math.h> using namespace ...

  2. Java初学者作业——使用记事本编写Java程序

    返回本章节 返回作业目录 需求说明: 使用记事本编写 Java 程序,输出"大家好!我的梦想是做一名 Java 高级工程师!". 为 Java 程序添加单行和多行注释以及文档注释. ...

  3. MySQL入门安装,及环境配置,初始化教程

    一.MySQL安装(win64) 免费的社区版下载地址:https://dev.mysql.com/downloads/mysql 接着会跳到这个页面 下载完后,我们将 zip 包解压到相应的目录,这 ...

  4. 【Python+Django+Pytest】数据库异常pymysql.err.InterfaceError: (0, '') 解决方案

    问题背景: 接口自动化测试平台,在执行测试案例之外,还需要做以下五件事情(或步骤): 1.查询用户在数据准备中预置的测试套件层数据初始化相关sql  (setUp_class方法中) 2.查询用户在数 ...

  5. Selenium_获取浏览器名称和版本(5)

    from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...

  6. 用一道题 来 复习 MySQL 的 复杂 sql 语句

    1.前言 太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做, 一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作. 然而... ...

  7. js页面触发chargeRequest事件和Nginx获取日志信息

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6814836302966424072/ 承接上一篇文档<js页面触发pageView和event事件编写> ...

  8. println打印的原理

    由于out是System类中的一个不可变的变量 println方法在PrintStream类中 并且在打印都时候都会转换成字符串

  9. FIS本地发布-其他同事通过IP访问

    方法很简单,只需在fis的配置文件那里进行修改即可. 文件路径在 C:\Users\Su\AppData\Roaming\npm\node_modules\fis\node_modules\fis-c ...

  10. Zabbix漏洞利用 CVE-2016-10134

    最近也是遇见了Zabbix,所以这里以CVE-2016-10134为例复现一下该漏洞 什么是Zabbix? zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. ...