zoukankan      html  css  js  c++  java
  • 系统综合实践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
    • 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'

  • 相关阅读:
    Redis命令行之Hash
    Redis命令行之String
    Redis配置
    访问者模式【行为模式】
    状态模式【行为模式】
    责任链模式【行为模式】
    观察者模式【行为模式】
    策略模式【行为模式】
    模板方法模式【行为模式】
    组合模式【结构模式】
  • 原文地址:https://www.cnblogs.com/lance-haha/p/14738678.html
Copyright © 2011-2022 走看看