Linux命令指南(二)

作业地址
http://39.104.202.12:8000/monitor/cpu

自动化监控与报警

自动监控CPU,内存使用率

安装wechatpy、cryptography模块

  import psutil, time, datetime

  class Monitor():
      cpu_data = []

    @classmethod
    def mem(cls, mem_max=90):
      """内存使用监控"""
          val = psutil.virtual_memory().percent
          # print(val)
          if val > mem_max:
              cls.send_msg('内存使用率为{:1f}%,超过{}%,请关注!!!'.format(val, mem_max))

      @classmethod
      def cpu(cls, cpu_max=90):
          """CPU使用监控"""
          val = psutil.cpu_percent(1)
          cls.cpu_data.append(val)
          print(cls.cpu_data)

    if len(cls.cpu_data) >= 3:
        avg = sum(cls.cpu_data)/len(cls.cpu_data)

        if val > cpu_max:
            # cls.send_msg('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
            # cls.email('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
            cls.weChat('CPU使用率为{:1f}%,超过{}%,请关注!!!'.format(avg, cpu_max))
            print('已向微信发送警告消息')
        cls.cpu_data.pop(0)

      @classmethod
      def send_msg(cls, content):
          """发送报警信息"""
            print(content)

        @classmethod
        def email(cls, content):
              import smtplib
              from email.mime.text import MIMEText
              from email.utils import formataddr
    
              nickname = '监控程序'
              sender = '[email protected]'
              password = 'wkezvmukjgqjbhjb'
              reciever = '[email protected]'

              msg = MIMEText(content, 'html', 'utf-8')
              msg['From'] = formataddr([nickname, sender])
              msg['Subject'] = '自动报警' # 邮件主题

             server = smtplib.SMTP_SSL('smtp.qq.com', 465)

            try:
                  server.login(sender, password)
                  server.sendmail(sender, [reciever], msg.as_string())
           except Exception as err:
                  print(er)
          finally:
                  server.quit()

          @classmethod
          def weChat(cls, content):
                  """发送微信提醒"""
                from wechatpy import WeChatClient

                client = WeChatClient('wxfe4f8777c09bd3fe', '71a2f3afbc44cfd56585dbe4e63dbbe8')
                template_id = 'XJ-ezE5udUqsPg6XlC_O7y9nX5Ttu3sxwgKp6MUmYF4'
                openid = 'oUyaM1Ra-KKjHRaiyNepr1ju1sZI'
              data = {
                    'msg':{'value': content,'color': '#173177'},
                    'time': {'value': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'color': '#173177'},
              }

              client.message.send_template(openid, template_id, data)

      """
      mem_max = 25
      Monitor.mem(mem_max)
      """
      cpu_max = 1
      while True:
            Monitor.cpu(cpu_max)
            time.sleep(2)

自动化安装与配置——以ngix为例

自动化安装-以源码编译方式

去niginx官网查看文档:http://nginx.org/en/docs/configure.html,查看所需参数

自动化配置

自动化部署

分布式版本工具git的使用

  1. 为git仓库创造一个用户

     useradd -m git #创建一个git的用户
    
  2. 为git用户设置密码

         passwd git
    
  3. 切换到git用户

    su - git

  4. 初始化仓库

    git init --bare .git # --bare表示创建的是空的仓库

使用Fabric批量部署项目

Docker

docker安装

步骤参见官方文档https://docs.docker.com

  service docker stop/start/restart
  docker info  # 查看当前docker更多信息
  docker --help # 查看相应帮助文档
镜像管理
  1. docker hub : http://hub.docker.com

  2. 阿里云:http://dev.aliyun.com

       docker pull alpine # 拉取未指定标签的alpine
    
使用docker image 查看相关命令
    docker image
    docker image ls 或docker images # 当前已拉取的镜像
    docker image rm  # 删除镜像

不要死记硬背命令,要善于查看帮助

容器管理

输入docker 查看相关命令

    docker

查看管理命令

  docker run alpine echo "hello docker"
  docker container ls 或docker ps # 查看正在运行的镜像
  docker container ls -a # 查看容器
  docker container  # 删除容器
  docker run -d alpine ping www.baidu.com # 后台使用alpine 去ping百度
  docker stop  # 停止容器运行
  docker run --rm   # 容器停止运行后会自动删除容器,同时数据也会被删除

数据卷

将物理机中的目录映射到容器中

    docker run --rm -v /root:/data alpine touch /data/test.txt # 将物理机中root目录映射到容器data中去,在容器data中创建一个文件test.txt,这个
    docker run --rm -v "$(pwd):/data" alpine touch /data/test.txt # 将物理机中 **当前目录** 映射到容器data中去
    docker run --rm -v "$(pwd):/data:ro" alpine touch /data/test.txt # 加上ro表明只进行**只读**映射
在docker中运行web服务

从docker hub中获取nginx镜像

      docker pull nginx:alpine # 下载标签为alpine的nginx镜像 
      docker run --rm nginx:alpine # 运行nginx服务,但会卡在界面中
      docker run -d --rm nginx:alpine 
      docker ps # 查看当前运行的容器
      docker kill  # 关闭容器

后台运行nginx后,还不能访问端口,可以(1)

      docker run --rm -d -P nginx:alpine # 

此时PORTS显示 0.0.0.0:32768->80/tcp,表明物理机中的32768端口映射到了容器中的80端口,这种端口是随机绑定映射的
(2)第(1)种方法物理机端口随机,无法提供稳定的服务,因此需要重新指定端口

      docker run --rm -d -p 8080:80 nginx:alpine 
查看所有运行中的docker 容器id
        docker ps -q
        docker kill -$(docker ps -q) # 关闭所有运行中的容器

构建镜像 docker build

构建镜像之前需要先编写Dockerfile
docker官方文档中reference:

  • FROM: 指定基础镜像
  • RUN:
  • CMD: 指定容器启动时执行的命令
  • LABLE: 用于添加扩展信息到容器中
  • COPY:用于将文件拷贝到容器中
  • WORKDIR:设置工作目录

利用vi Dockerfile 进入编辑页面

    FROM alpine (也可以使用ubuntu:16.04)
    LABEL version = '1.0'
    LABEL description = 'my first image'
    RUN apk update && apk add python3  #(如果使用ubuntu系统,则RUN apt update && apt -y install python3)
    COPY . /code # 将当前目录下的文件拷贝到code目录中。此方式下修改原来目录中的文件,运行容器时结果仍然不变
    WORKDIR /code # 指定容器运行后的工作目录
    CMD ['', '']  # 

编辑完Dockerfile后

    docker build -t myapp . # 在当前目录(.)中构建一个tag为myapp的镜像
    
    docker inspect redis:alpine # 查看镜像

综合实战

python程序,将数据存放在redis中,并且

  1. 创建目录存放数据

       mkdir /redis-data
       docker run -d --name redis -v /redis-data:/data redis:alpine # 为容器指定一个名字 --name 
    
  2. 创建python文件

    mkdir myweb 
    cd myweb/  
    vi app.py
    

    编辑app.py 文件

    # 使用flask创建一个web服务
    from flask import Flask
    import redis
    
    app = Flask(__name__)
    # 连接redis
    r = redis.Redis(host='redis', port=6379)
    
    @app.route('/')
    def hello():
            count = r.incr('clicks')
            return "ZSC love CS! {}".format(count)
    
    if __name__ == '__main__':
            app.run('0.0.0.0', port=5000)
    
  3. 编辑Dockerfile

     FROM python:alpine # docker 提供了python镜像
     COPY . /code
     RUN pip install flask redis #不用使用pip3
     WORKDIR /code
     EXPOSE 5000 # 开放5000的端口
     CMD ['python', 'app.py']
    
  4. 构建镜像

     docker build -t myweb .
    
  5. 启动运行app
    docker run --rm -d -p 80:5000 myweb
    访问地址后,显示Internal Server Error,但是虽然80已经映射到了myweb容器的5000端口,而redis和pythonl两个容器之间是隔离的。

  6. 连接redis后启用镜像

        docker run --rm --link redis -p 80:5000 myweb
    

你可能感兴趣的:(Linux命令指南(二))