2020系统综合实践 第5次实践作业

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

1、Python自定义镜像搭建

docker pull python:3.7  #拉取dockerhub上的python镜像
  • Dockerfile文件
FROM python:3.7
WORKDIR /usr/src/app  
COPY requirements.txt ./  
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY apps/hello.py /usr/src/app/
VOLUME /usr/src/app
ENTRYPOINT ["python"]    
CMD ["hello.py"]   
  • requirements.txt中声明所需依赖:
PyMySQL
opencv-python
  • 文档结构

docker build -t python:v1 .  #构建自定义镜像

2、运行Python程序

通过容器完成简单helloworld、日历输出mysql数据库操作opencv程序的部署运行
mysql数据库可以使用之前作业创建的镜像
opencv可以参照链接任意选择

为便于程序修改调试,在容器启动时需将本地文件目录挂载至容器内的工作目录

2.1 helloworld

#hello.py
print('hello world')
#无交互式输入:
docker run -v /home/ubuntu/fifth/apps:/usr/src/app --rm python:fifth

参数说明:

  • 使用-v将本地目录挂载到python工作目录以方便代码修改
  • --rm运行完毕后自动移除容器
  • 默认使用Dockerfile中ENTRYPOINT默认参数CMD ["hello.py"] 指定的hello.py作为命令行参数

2.2 日历输出

#date.py
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
#有交互式输入:
docker run -it -v /home/ubuntu/fifith/apps:/usr/src/app --rm python:fifth date.py

注意:

  • 当命令行有输入需要执行的python文件就不会执行dockerfile中的CMD ["hello.py"]命令。
  • 由于用到了input,需要输入内容,因此运行容器的时候需要用到-it参数,否则会报EOFError: EOF when reaeding a line的错误。

2.3 mysql数据库操作

db.py文件

#添加('031702521','yzl')
import pymysql

# 打开数据库连接
db = pymysql.connect("cthmysql", "docker", "123456", "docker_mysql")

# 第一个参数是本地容器名字
# 第二三个参数是数据库的使用用户与密码
# 第四个参数是数据库名称
# 创建游标对象

cursor = db.cursor()
# 先查询一次数据库数据
sql = """select * FROM test"""
cursor.execute(sql)
results = cursor.fetchall()
print(results)

# SQL插入语句
sql = """insert test(id,name)
	values('031702521','yzl')"""
cursor.execute(sql)
db.commit()

# 插入完成后再读取一次数据库数据
sql = """select * FROM test"""
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

  • 然后我们再去终端看看数据库,成功添加了。

2.4 opencv程序的部署运行

opencv.py

# cv.py将图片旋转90度并保存
import cv2

# flags传入0表示灰度图像, 1表示彩色图像
img=cv2.imread('test.jpg',flags=1)

# 获取图片尺寸
rows,cols=img.shape[:2]

# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)

# 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(cols,rows))

# 写入文件
cv2.imwrite("test-rotated.jpg", dst, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
print('rotated and saved.')
docker run -v /home/ubuntu/fifth/apps:/usr/src/app --rm python:fifth opencv.py

3、小结

3.1 问题和解决办法

问题一:镜像构建不成功,说是找不到目录

解决方法:百度了下是因为docker的注释问题#影响到了镜像构建时的读入问题,把注释换行或是去掉即可。

问题二:数据库连接不成功

解决方法:容器没开启且名字不匹配,要注意匹配各个对于的名字和格式,就可以连接成功

3.2 经验和时间

这次实验较上次简单很多,花了大概6小时左右,注意理解好数据库,镜像构建,就可以轻松完成。与之前的实验二汇总联系起来,更通俗易懂,让我理解了许多内容,思路也清晰起来。

原文地址:https://www.cnblogs.com/xzytxdy/p/12933279.html