• docker&kubernets篇(十六)


    docker编排小神器Fig/Compose

    安装docker-compose

    1. 下载最新版的docker-compose文件

      sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname    -s`-`uname -m` -o /usr/local/bin/docker-compose
      
      • 1

      若是github访问太慢,可以用daocloud下载

      sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.1/docker-compose-`uname    -s`-`uname -m` -o /usr/local/bin/docker-compose
      
      • 1
    2. 添加权限
      sudo chmod +x /usr/local/bin/docker-compose

    可以发现,Compose安装是足够简单的,基本上依靠一个可执行脚本就完成了所有工作。这比传统编排部署工具比如Puppet、Chef都要简单,而类似Cloud Foundry BOSH这样耗时的工具就该被称为超重量级云编排引擎了。当然,Compose简单的背后,是以牺牲一些功能为代价的。

    docker-compose实战

    1. Docker宿主机上创建工作目录和应用:
    mkdir composetest 
    cd composetest
    
    • 1
    • 2
    1. 该目录下创建一个名为testapp.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! Ihava been seen {} times.\n'.format(count)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    1. 在docker-compose目录创建如下文件
    [root@iZbp102fxl8duhse0avs3mZ composetest]# ll
    total 16
    -rw-r--r-- 1 root root 124 Aug 12 11:36 docker-compose.yml
    -rw-r--r-- 1 root root 248 Aug 12 11:39 Dockerfile
    -rw-r--r-- 1 root root  12 Aug 12 11:25 requirements.txt
    -rw-r--r-- 1 root root 516 Aug 12 11:59 testapp.py
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    testapp.py 一个支持也页面请求的python脚本,在第二步中已经给出详细的code,
    下面简单介绍下:
    docker-compose.yml : docker-compose 的配置文件

    # yaml 配置
    version: '3'
    services: 
      web:
        build: .
        ports:
          - "5000:5000"
        volumes:
          - .:/root/testcode
        links:
          - redis
      redis:
        image: "redis"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里简单解释下:
    web是web应用docker,然后将端口绑定到宿主机上,redis是后面redis的docker应用,在web脚本中用到的redis缓存,所以此处创建一个docker对应的服务;images是redis镜像,生成docker用
    requirements.txt

    这是编排部署核心所在,在这个YAML文件里,可以看到两个最高级别的key:web和redis,这意味着用Compose定义了由两个“服务”组成的Docker集群。其中,第一个服务叫web,它从当前目录的Dockerfile build得到;之后在容器中运行python testapp.py;把容器内的5000端口映射到宿主机的5000端口;挂载执行这些操作所在的目录到容器中/code目录下。之后,代码的修改就可以在容器中体现。第二个服务redis直接使用已有的redis镜像,Dockerfile不必另外编写。不难发现,Compose在这里扮演了指挥家的角色,它类似于Docker client的加强版,把docker run的参数列表固化在了YAML文件中,其语法格式和定义规则都与Docker命令行兼容。而且,可以按照这样的逻辑来定义更加复杂的“服务组”,例如分别为每个服务定义Dockerfile,然后把这些容器link到一起。而Docker在这里则扮演了乐队里的演奏者的角色,它们根据Compose的编排指令,执行具体的Docker容器部署工作。

    Dockerfile的详细

    FROM python:3.7-alpine
    WORKDIR /root/code
    ENV FLASK_APP testapp.py
    ENV FLASK_RUN_HOST 0.0.0.0
    RUN apk add --no-cache gcc musl-dev linux-headers
    COPY requirements.txt requirements.txt
    RUN pip install -r requirements.txt
    COPY . .
    CMD ["flask","run"]
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    WORKDIR 如果没有/root/code目录要自己创建一个程序可以访问的目录,一般来讲当前用户就可以,如果需要特殊权限,重新授权一下就可以了,这个是通过dockerfile来创建docker镜像,笔者已经执行了,所以可以通过命令看到自己生成的镜像

    [root@iZbp102fxl8duhse0avs3mZ composetest]# docker images
    REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
    composetest_web   latest    0369a9cf8695   46 hours ago    185MB
    haproxy           latest    575a5788d81a   7 months ago    101MB
    redis             latest    7614ae9453d1   7 months ago    113MB
    redis             alpine    3900abf41552   8 months ago    32.4MB
    ubuntu            latest    ba6acccedd29   10 months ago   72.8MB
    django            latest    eb40dcf64078   5 years ago     436MB
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    composetest_web 就是通过docker文件创建的web镜像,这里也简单说下flask,flask是python的轻量级框架,可以自动试下简单的web调用,django则相对而言比较重,它是比较全的python脚手架。如果感兴趣的小伙伴可以去详细了解,

    requirements.txt 是python脚本执行所需要依赖包:flask和redis

    [root@iZbp102fxl8duhse0avs3mZ composetest]# cat requirements.txt 
    flask
    redis
    
    • 1
    • 2
    • 3

    到此已经简单的docker-compose实战所需的文件基本上都完成了,下面我们执行下docker-compose up看下是否有报错,
    笔者执行执行的时候是多次报错,有很多语法错误,和格式错误,多踩几次坑就好了, 如果想在后台执行,只需要在 docke-compose up -d

    [root@iZbp102fxl8duhse0avs3mZ composetest]# docker ps
    CONTAINER ID   IMAGE             COMMAND                  CREATED       STATUS       PORTS                                       NAMES
    6b852f2b68b3   composetest_web   "flask run"              9 hours ago   Up 9 hours   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   composetest-web-1
    73ae66443764   redis             "docker-entrypoint.s…"   9 hours ago   Up 9 hours   6379/tcp                                    composetest-redis-1
    9b651b43076f   haproxy           "docker-entrypoint.s…"   4 weeks ago   Up 4 weeks   0.0.0.0:6301->6301/tcp, :::6301->6301/tcp   Haproxy
    0e206ce34569   django            "/bin/bash"              5 weeks ago   Up 4 weeks                                               App2
    ce9aa6740771   django            "/bin/bash"              5 weeks ago   Up 4 weeks                                               App1
    ee95a0ae7e5f   redis             "docker-entrypoint.s…"   5 weeks ago   Up 5 weeks   6379/tcp                                    redis-slave2
    0df99da2ff2e   redis             "docker-entrypoint.s…"   5 weeks ago   Up 5 weeks   6379/tcp                                    redis-slave1
    790681bc9bcf   redis             "docker-entrypoint.s…"   5 weeks ago   Up 4 weeks   6379/tcp                                    redis-master
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    如上可以看到compose-web对外映射的端口是5000,访问下可以可拿到如下结果,说明我们通过docker-compose查创建docker镜像已经成功了
    在这里插入图片描述

  • 相关阅读:
    Java架构师学习路线
    .Net中Redis的Hash表操作
    通关剑指 Offer——剑指 Offer II 028. 展平多级双向链表
    CMT2380F32模块开发11-RTC例程
    Linux开机自动挂载
    实战PyQt5: 150-QChart图表之如何使用图例标记
    并查集(蓝桥杯 C++ 题目 代码 注解)
    Qt消息对话框的使用
    Kubernetes 集群和应用监控方案的设计与实践
    离散制造企业如何打造MES管理系统
  • 原文地址:https://blog.csdn.net/yitian881112/article/details/126318066