• 系统综合实践-第五次作业


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

    项目结构

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


    exam-5文件夹创建在/home/cgh/目录下面。

    构建容器

    (1)Dockfile

    FROM python:3
    MAINTAINER CGH
    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默认参数 可以不写没事
    

    (2)requirements.txt

    PyMySQL
    opencv-python
    

    (3)建立镜像

    docker build -t exam5-py .        (exam5-py 是构建出来的镜像名字,自己取得)
    


    到此时,镜像就已经成功构建出来

    运行代码

    helloworld.py

    helloworld.py的代码print('hello the world')
    运行指令:sudo docker run --rm -v /home/cgh/exam5/apps:/usr/src/app exam5-py

    这里讲解一下

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

    date.py

    date.py:

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

    运行指令:sudo docker run -it --rm-v /home/cgh/exam5/apps:/usr/src/app exam5-py date.py
    结果:
    小说明:带it表示交互性的,就是你可以输入东西的型

    mysql

    由于我之前在做实验四的时候,把之前的容器都清了一下,导致这里面没有我上次的容器,不过没关系,镜像还在就好了。

    先运行容器sudo docker run --name cghmysql -d -p 3306:3306 cghmysql

    再进入容器sudo docker exec -it cghmysql bash
    在进入数据库 mysql -u docker -p doker 是用户名,和之前实验二构建镜像的配置文件privileges.sql中的名字相关。

    先看看目前存在的数据库有哪些 show databases;

    再进入那个数据库 use docker_mysql

    再进入查看这个数据库里面有哪些表 show tables;

    再查看这个表里面的内容 select *from testone;

    这算是回顾了一下实验二哈哈哈
    先写一下mysql.py文件的内容

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

    然后运行指令:sudo docker run -it --rm -v /home/cgh/exam5/apps:/usr/src/app --link=cghmysql exam5-py mysql.py

    如果说你出现了

    这样的情况,应该是你的数据库的表的名字和我不同以及添加的内容也不同,可以回去实验二看自己的schema.sql 文件是如何添加的。

    然后我们再去终端看看数据库:

    成功添加了。

    opencv.py

    opencv:

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

    这个opencv的代码并不会,只能直接cv别人的了,自己改了点参数。
    执行指令:sudo docker run -it --rm -v /home/cgh/exam5/apps:/usr/src/app exam5-py opencv.py
    结果:

    原图:

    结果图:

    从结果上看,这是截取了图片的一部分。

    实验总结

    这次花的时间比实验四少的多,大概4小时前后。遇到的问题更多是在开始的时候用Dockerfile文件构建镜像的时候,老是出现走不下去的情况,报错说的是什么少一个/,后来我发现,可能是我当时没设置好相对路径和绝对路径的问题吧,反正后来再去考证了一下另外一个人的,就对了。然后这次实验算是对前面的实验的一个小汇合,和实验二也有汇合,让我更明白mysql的使用哈,不然之前都是迷迷糊糊,不懂自己在做啥。

  • 相关阅读:
    python网络编程之最简单的单工通信
    ruby : Exception Notification
    python学习之操作mysql
    python学习之最简单的获取本机ip信息的小程序
    python学习之最简单的用户注册及登录验证小程序
    mongo数据库的导入导出
    mac安装django1.5.4
    mac安装软件管家homebrew
    关于mac安装rails报错clang: error: unknown argument
    在mac上安装nodejs
  • 原文地址:https://www.cnblogs.com/cgh2333/p/12917398.html
Copyright © 2020-2023  润新知