系統綜合實踐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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM