zoukankan      html  css  js  c++  java
  • 2017级系统综合实践第5次实践作业

    本次作业为Python专题。Python是将练习使用docker容器运行Python程序。Python是很常用的程序设计语言,但是Python程序的运行依赖于提前的系统环境配置,为了降低系统配置的复杂度,同时减小资源开销,将系统环境容器化是一种解决方案。请根据Python官方镜像的镜像说明,自定义Python镜像文件,将Python程序运行起来。

    项目结构

    .
    ├── apps
    │   ├── date.py          (用于日期的实验)
    │   ├── helloworld.py    (用于最开始的helloworld实验)
    │   ├── mysql.py         (用于mysql的实验)
    │   ├── opencv.py        (用于opencv实验)
    │   ├── p1.jpg         (opencv的实验中的源图像)
    │   └── test_result.jpg  (opencv的实验中的目的图像)
    ├── Dockerfile           (用于构建镜像)
    └── requirements.txt     (可以认为为了上面的opencv和mysql的py添加头文件)
    

    文件夹home/yu3/py/apps

    构建容器

    ①配置文件

    Dockerfile

    FROM python:3
    MAINTAINER LQY
    WORKDIR /usr/src/app   # 容器内部通过这个目录来找py文件,是处于容器内,不是宿主机
    COPY requirements.txt ./
    RUN pip install -r requirements.txt -i https://pypi.douban.com/simple  #  -i就是修改源   并安装依赖
    COPY apps/helloworld.py /usr/src/app/   #  先将helloworld.py文件放入容器内的工作目录中,以防默认待会儿目录没挂载上去报错
    VOLUME /usr/src/app
    ENTRYPOINT ["python"]    # 实现命令行式调用容器
    CMD ["helloworld.py"]   # ENTRYPOINT默认参数 可以不写没事
    

    requirements.txt

    PyMySQL
    opencv-python
    

    ②构建镜像
    sudo docker build -t docker-python .

    运行代码

    ①helloworld.py

    print('hello the world')
    

    ps

    这里的rm指的是,运行完这个容器,就删除了。 然后Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定方式为 宿主机目录:容器内目录,然后容器内目录就是容器的工作目录,由上面的dockerfile决定了,对于两个目录尽量都用绝对路径吧,不然可能会有一些小问题。

    ②date.py

    import calendar
    yy = int(input("输入年份: "))
    mm = int(input("输入月份: "))
    print(calendar.month(yy,mm))
    

    运行命令

    sudo docker run -it --rm-v /home/yu3/py/apps:/usr/src/app docker-python date.py
    

    ③mysql

    import pymysql
    
    # 打开数据库连接
    db = pymysql.connect("10.0.2.15", "root", "admin", "myDBPDO")
    
    # 第一个参数是本地容器名字
    # 第二三个参数是数据库的使用用户与密码
    # 第四个参数是数据库名称
    # 创建游标对象
    
    cursor = db.cursor()
    # 先查询一次数据库数据
    sql = """select * FROM testone"""
    cursor.execute(sql)
    results = cursor.fetchall()
    print(results)
    
    # SQL插入语句
    sql = """insert palyer(firstname,email)
    	values('lqy','1781610742qq.com')"""
    cursor.execute(sql)
    db.commit()
    
    # 插入完成后再读取一次数据库数据
    sql = """select * FROM palyer"""
    cursor.execute(sql)
    results = cursor.fetchall()
    print(results)
    
    # 关闭数据库连接
    db.close()
    

    运行命令

    sudo docker run -it --rm-v /home/yu3/py/apps:/usr/src/app docker-python mysql.py
    

    ④opencv.py

    #截取图片的一部分,即ROI(region of interest)
    import cv2
    import numpy as np
    image = cv2.imread('p1.png')
    result = image[250:1700, 0:900]
    cv2.imwrite('test_result.jpg', result)
    

    运行命令

    sudo docker run -it --rm-v /home/yu3/py/apps:/usr/src/app docker-python opencv.py
    


    实验总结

    时间花费
    项目 时间(估算)
    搭建镜像 60min
    各个程序部署运行 4h
    写博客 30min
    总结:

    搭建镜像时我又遇到了一个问题,构建镜像时出现问题,卡了一段时间后终于发现问题所在。那就是写配置文件时,注释和代码尽量不能在同一行。。。


    其次就是数据库那边,我用的是实验三的镜像,不知怎的容器和数据流的会出现问题,后来修改IP地址不用link指令才勉强搞定。
    你别看我说的这么轻描淡写,做的时候整个人都要爆炸了。。。。
    这次实验也充分磨练了我的耐心和动手能力,那句话怎么说来着--梅花香自苦寒来,保剑锋出磨砺出。等我把剑磨好,这种题目建一个砍一个。

  • 相关阅读:
    Tomcat线程参数
    CDH平台规划注意事项
    python 不同数据类型的序列化
    Python 中__new__方法详解及使用
    线程生命周期
    如何在JAVA中每隔一段时间执行一段程序
    手动开启是事务提交回滚
    MySQL数据类型转换函数CAST与CONVERT的用法
    mybatis插入是返回主键id
    解决dubbo注册zookepper服务IP乱入问题的三种方式
  • 原文地址:https://www.cnblogs.com/liang-an/p/12924860.html
Copyright © 2011-2022 走看看