容器编排

我们的项目可能会使用了多个容器,容器多了之后管理容器的工作就会变得麻烦。如果要对多个容器进行自动配置使得容器可以相互协作甚至实现复杂的调度,这就需要进行容器编排。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. Capstone代商|Capstone代理商|Capstone选型

    Capstone专注于USB typec .Displaypor.hdmi.VGA.LVDS.MIPI 等端口音视频数据转换方案芯片的设计与开发,Capstone品牌起源于中国台湾,Capstone科 ...

  2. JDK HttpClient 单次请求的生命周期

    HttpClient 单次请求的生命周期 目录 HttpClient 单次请求的生命周期 1. 简述 2. uml图 3. Http连接的建立.复用和降级 3.1 调用流程及连接的建立和复用 3.2 ...

  3. Android物联网应用程序开发(智慧园区)—— 设置传感器阈值对话框界面

    效果图: 自定义对话框布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xml ...

  4. Android程序设计基础 • 【目录】

    章节 内容 实践练习 Android程序设计基础作业目录 (作业笔记) 第1章 Android程序设计基础 • [第1章 Android程序入门] 第2章 Android程序设计基础 • [第2章 基 ...

  5. 开源社区合入patch的步骤

    以Ranger项目为例,说明开源社区合入patch的详细步骤. 1.reviews页面下载patch 进入到review页面:https://reviews.apache.org/r/67919/ 点 ...

  6. 【PowerShell】格式化输出字符串

    1 '{0:d4}' -f 10 2 '数字的补零';{} 3 '{0:f4}' -f 10 4 '保留小数位数';{} 5 '{0:p2}' -f 0.4567 6 '转换为百分比';{} 7 '{ ...

  7. vue3.0+vite+ts项目搭建--基础配置(二)

    集成vue-router 使用yarn yarn add vue-router@next --save 安装完成之后在src目录下创建文件夹router/index.ts,创建完成之后需要在Vue-R ...

  8. 关于less使用初学者常犯错误

    1.多层嵌套 2.定义变量复用性不高 3.方法定义多余参数.

  9. 基于springboot的定时任务实现(非分布式)

    1. 核心注解 在springboot项目中我们可以很方便地使用spring自己的注解@Scheduled和@EnableScheduling配合来实现便捷开发定时任务. @EnableSchedul ...

  10. lua中的三目运算符

    开头先说结论 1.简单版三目运算符(需要自我保证"b"不为"false") a and b or c 2.通用版三目运算符 (a and {b} or {c}) ...