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