Python教程

系统综合实践4:基于Python的容器技术

本文主要是介绍系统综合实践4:基于Python的容器技术,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

系统综合实践——第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
    • 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,并解释代码的含义,画出程序流程图。


  • 学习参考:
    • 知乎:Github开源人脸识别项目face_recognition
    • Python官方镜像
    • OpenCV-Python 中文教程(搬运)目录
    • face_distance.py
    • Nginx服务器之负载均衡策略(6种)

二、实践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'

  • 报错: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

这篇关于系统综合实践4:基于Python的容器技术的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!