第5次实践作业

本次作业为Python专题。Python是将练习使用docker容器运行Python程序。Python是很常用的程序设计语言,但是Python程序的运行依赖于提前的系统环境配置,为了降低系统配置的复杂度,同时减小资源开销,将系统环境容器化是一种解决方案。请根据Python官方镜像的镜像说明,自定义Python镜像文件,将Python程序运行起来。
关于容器
(1)为便于程序修改调试,在容器启动时需将本地文件目录挂载至容器内的工作目录;
(2)如程序需要运行额外的Python库,请在自定义镜像时完成安装,安装方法参考docker hub上的Python镜像说明;
关于代码
(3)在(1)和(2)的基础上,通过容器完成简单helloworld、日历输出、mysql数据库操作、opencv程序的部署运行;
mysql数据库可以使用之前作业创建的镜像
opencv可以参照链接任意选择
关于python版本
(4)python2或python3版本不限,也可全部都做;

(1)前期准备

requirements.txt

PyMySQL

opencv-python

Dockerfile

FROM python:3

WORKDIR /usr/src/app

COPY requirements.txt ./

RUN pip install -r requirements.txt -i https://pypi.douban.com/simple  requirement.txt  

ENTRYPOINT ["python"]

CMD ["hello.py"]

构建镜像:

docker build -t mypython .

(2)helloworld

hello.py

print("hello world")

运行

docker run -it -v /home/h/桌面/py/app:/usr/src/app --rm mypython hello.py

(3)日历输出

sudo docker run -it -v /home/h/桌面/py/app:/usr/src/app --rm mypython date.py

date.py

import calendar

# 输入指定年月
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))

# 显示日历
print(calendar.month(yy,mm))

参考

(4)mysql数据库操作

因为容器删掉了,所以重新按第2次实践作业,创建容器并进入。
参考
mysql.py

import pymysql

class Mysql_db():

    def __init__(self,ip,username,password,db_name,table_name):

        self.ip=ip
        self.username=username
        self.password=password
        self.db_name=db_name
        self.table_name=table_name

    def db_conn(self):

        #打开数据库连接
        self.conn=pymysql.connect(self.ip,self.username,self.password,self.db_name)

        #创建一个游标
        self.cursor=self.conn.cursor()

    #创建表格
    def create_table(self,sql):

        self.cursor.execute('drop table if exists %s;' %self.table_name)

        self.cursor.execute(sql)

    #插入数据
    def insert_data(self,sql):
        #执行SQL语句,发生错误时回滚
        try:
            self.cursor.execute(sql)
            self.conn.commit()

        except :
            self.conn.rollback()

    #查询数据
    def select_all(self):

        sql='select * from %s' %self.table_name
        self.cursor.execute(sql)
        return self.cursor.fetchall()

    #更新数据库数据
    def update_data(self):
        #执行SQL语句,发生错误时回滚
        try:
            self.cursor.execute(sql)
            self.conn.commit()

        except :
            self.conn.rollback()        

    #删除数据
    def delete_data(self):
        #执行SQL语句,发生错误时回滚
        try:
            self.cursor.execute(sql)
            self.conn.commit()

        except :
            self.conn.rollback()


    #关闭数据库
    def conn_close(self):

        self.conn.close()

sql.py

from mysql import Mysql_db

ip='xenodochial_banach'          #容器名
username='docker'         #用户名
password='123456'      #密码
db_name='docker_mysql'#数据库名
table_name='user'    #表名
db=Mysql_db(ip, username, password, db_name,table_name)

db.db_conn()

sql1="insert into %s values(181700135,'123');" %table_name
db.insert_data(sql1)

print(db.select_all())

db.conn_close()

链接数据库并,运行插入指令

docker run -it -v /home/h/桌面/py/app:/usr/src/app --link=xenodochial_banach:db mypython  sql.py

(5)opencv程序的部署运行

参考
op.py

import numpy as np
import cv2

img = cv2.imread('tt.jpg',0)
#cv2.imshow('img',img)
cv2.imwrite('tt1.png',img)

运行

sudo docker run -it -v /home/h/桌面/py/app:/usr/src/app --rm mypython op.py


原图与结果

(6)发表一篇博客,记录主要过程、遇到的问题和解决方法,以及作业所花的时间。

遇到的问题和解决方法:

实验一:

换其他源解决
实验二:
实验二的问题其实很多 (忘记截图了),但是删了容器重新来一遍就可以了
实验三:
代码直接参考参考资料的,但是还是报错了:

百度后最简单的解决方法
虽然简单但是非常有效!

作业所花的时间

这次花的时间比之前少很多,一个下午完成的。

原文地址:https://www.cnblogs.com/wawu/p/12935377.html