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小时左右,注意理解好数据库,镜像构建,就可以轻松完成。与之前的实验二汇总联系起来,更通俗易懂,让我理解了许多内容,思路也清晰起来。