系统综合实践——第4次实践作业:基于Python的容器技术
Python是很常用的程序设计语言,但是Python程序的运行依赖于提前的系统环境配置,为了降低系统配 置的复杂度,同时减小资源开销,将系统环境容器化是一种解决方案。
一、实践记录
1.实践问答
(1)时间记录
- 开始时间——2021/04/30 19:00
- 结束时间——2021/05/06 22:00
- 有效时长——20h
(2)难易程度
- B.比较困难
2.实验环境
- VisualBox_6.1虚拟机
- Ubuntu 18.04.5 Desktop amd64 的虚拟机系统;
【软件工具】
- nano/Text Editor
- Docker Engine-Community
- docker-hub
- aliyun镜像仓库
- Firefox浏览器
- NginX
- mysql-5.7
- PHP
- apache-tomcat-8.5.65.tar.gz
- jdk-8u211-linux-x64.tar.gz
- python:3.9.4
3.实验任务
自定义Python镜像文件,将Python程序运行起来。
(提示:为便于程序修改调试,在容器启动时需将本地文件目录挂载至容器内的工作目录; )
(1)opencv程序的部署运行;
(2)针对第3次作业的nginx-tomcat负载均衡,编写一个python测试脚本,通过容器运行测试;
(3)运行face_distance.py,并解释代码的含义,画出程序流程图。
- 学习参考:
二、实践1——opencv
OpenCV是一个基于BSD许可(开源)发行跨平台计算机视觉和机器学习软件库,可以运行在Linux等操作系统上;同时提供了Python等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1.环境准备
(1)拉取python镜像
sudo docker pull python:3.9.4
(2)建立工作目录
/home/ubuntu/lancl/docker_build/python3
tree
2.编写配置文件
(1)requirements.txt
sudo nano requirements.txt
PyMySQL
opencv-python
(2)Dockerfile
sudo nano Dockerfile
# 指定基础镜像
FROM python:3.9.4
# 指定镜像的维护者
MAINTAINER 032092135
# 在容器内设置一个工作目录
WORKDIR /usr/src/app
COPY requirements.txt ./
# 修改源并安装依赖
RUN apt-get update
&& apt-get -y install libgl1-mesa-glx
&& pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY code/helloworld.py /usr/src/app/
# 创建挂载点
VOLUME /usr/src/app
# 给容器配置一个"可执行程序",可以搭配CMD命令使用:一般是变参才会使用CMD,这里的CMD等于是在给ENTRYPOINT传参
ENTRYPOINT ["python"]
# 指定在容器启动时所要执行的命令
CMD ["helloworld.py"]
(3)代码库——code
① sudo nano helloworld.py
print('hello world ! myPython.')
② sudo nano dockerfile_nginx
#基础镜像
FROM nginx
#作者信息
MAINTAINER 032092135
#声明暴露端口
EXPOSE 9191
③ sudo nano date.py
import calendar
# 输入指定年月
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
#设置第一天是星期天
calendar.setfirstweekday(firstweekday=6)
# 显示日历
print(calendar.month(yy,mm))
④ sudo nano sql.py
import pymysql
# 打开数据库连接
db = pymysql.connect(host="mysql_container_92135", user="root", password="123456", db="myDB")
# 创建游标对象
cursor = db.cursor()
# 查询数据库数据
sql = """select * FROM user"""
cursor.execute(sql)
results = cursor.fetchall()
print(results)
# 插入
sql = """insert user(id,name,age)
values('02','darling',18)"""
cursor.execute(sql)
db.commit()
# 插入完成后再读取一次数据库数据
sql = """select * FROM user"""
cursor.execute(sql)
results = cursor.fetchall()
print(results)
# 关闭数据库连接
db.close()
⑤ sudo nano opencv.py
import cv2
img = cv2.imread("test.jpg", 1)
res = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR->GRAY
cv2.imwrite('result.jpg', res)
print("success!")
3.实验过程——运行python程序
(1)构建python镜像
cd /home/ubuntu/lancl/docker_build/python3
sudo docker build -t 92135_python3 .
(2)试运行
--rm:运行完毕后自动移除容器。
sudo docker run --rm -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python3
(3)交互日历
-it:声明需要交互式终端以读取输入
sudo docker run -it --rm -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python3 date.py
(4)对MySQL数据库进行写操作
① 连接上一次实践课创建的MySQL容器:
sudo docker restart mysql_container_92135
sudo docker exec -it mysql_container_92135 /bin/bash // 进入容器前需要先启动
mysql -u root -p
② 查找容器的Networks信息
sudo docker inspect 92135_python3
sudo docker network ls //查看所有容器Networks信息
③ 连接MySQL容器并且执行脚本
sudo docker run --rm --link=mysql_container_92135 --net compose_docker_default -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python3 sql.py
(5)opencv部署
sudo docker run -it --rm -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python394 opencv.py
三、实践2——python脚本实现Tomcat+Nginx负载均衡
1.创建-脚本文件
cd /home/ubuntu/lancl/docker_build/python3/code
(1)轮询
sudo nano testBlance1.py
import requests
url="http://localhost:9292"
for i in range(0,10):
reponse=requests.get(url)
print(reponse.text)
(2)权重
sudo nano testBlance2.py
import requests
url="http://localhost:9292"
context={}
for i in range(0,100):
response=requests.get(url)
if response.text in context:
context[response.text]+=1
else:
context[response.text]=1
print(context)
2.运行结果
(1)to be continue......
四、实践3——Python 使用 face_recognition 人脸识别
1.环境配置
(1)配置镜像的函数依赖库
2.实践过程
(1)运行face_distance.py,并解释代码的含义,画出程序流程图;
to be continue......
《Tips》
针对实践任务中遇到的各类问题和解决办法进行总结(不少于5条)。
一、实验心得
1.进一步加深了对镜像构建的理解,对于关键函数依赖的引用可以避免后续操作的诸多麻烦;
2.对python代码的学习有待加强,不能独立的进行相关代码的编写;
3.对软件工程的认知依旧尚浅,以为很简单的一次作业,越做越发现自己的欠缺越多,需要后续不断学习、积累。
二、问题记录
1.如何打开python镜像的/bin/bash?
sudo docker run -it python:3 bash
报错:python: can't open file '/usr/src/app/bash': [Errno 2] No such file or directory
(1)需要修改镜像的函数依赖库:
sudo docker run -it --rm -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python394 opencv.py
报错:ImportError: libGL.so.1: cannot open shared object file: No such file or directory
——Docker容器缺少 libGL.so.1静态链接库
- 推倒重建?
- 利用容器?
- 尝试写入requirement.txt?
(2)Dockfile-RUN
RUN ……
&& apt-get update
&& apt-get install sudo
&& sudo apt update
&& sudo apt install libgl1-mesa-glx
- 报文:The command 'xxx' returned a non-zero code: 2
- WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
修改:要记住,所有pip命令都不要加sudo?
RUN apt-get update
&& apt-get -y install libgl1-mesa-glx
&& ……
(3)requirement.txt添加:libgl1-mesa-glx
- 报错:ERROR: Could not find a version that satisfies the requirement libgl1-mesa-glx (from versions: none)
- ERROR: No matching distribution found for libgl1-mesa-glx
2.运行face_distance.py
sudo docker run -it --rm -v /home/ubuntu/lancl/docker_build/python3/code:/usr/src/app 92135_python394 face_distance.py
报错:ModuleNotFoundError: No module named 'face_recognition'
3.--link=[]: 添加链接到另一个容器;
-
报错:Cannot link to /mysql_container_92135, as it does not belong to the default network.
参考:https://blog.csdn.net/hanchaobiao/article/details/81911587
-
报错:Traceback (most recent call last):
File "/usr/src/app/sql.py", line 4, in
db = pymysql.connect("mysql_container_92135", "root", "123456", "myDB")
TypeError: init() takes 1 positional argument but 5 were given参考:http://linxingyang.net/2021/bd7886a8b31e4fae9b51795b33d12sxx