本文主要闡述基於python鏡像和mysql鏡像,利用docker容器搭建python3的系統環境,並運行簡單的python程序
一.Python鏡像的構造文件、Python程序代碼
1️⃣ python鏡像的python3_dockerfile
#基礎鏡像
FROM python:3
#作者信息
MAINTAINER lxc
#工作目錄
WORKDIR /usr/src/app
#復制文件到容器中
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
ps:由於直接pip速度較慢,這里使用了清華源鏡像加速-i https://pypi.tuna.tsinghua.edu.cn/simple
2️⃣ 記錄python依賴的文件:requirement.txt
numpy==1.18.4
opencv-python==4.2.0.34
PyMySQL==0.9.3
生成方法:在本機編寫代碼調試程序后,在python代碼所在目錄下,使用命令:pip freeze > requirements.txt
,即可在該目錄下生成requirement.txt
文件。(參考鏈接)
👇
👇
3️⃣ python程序
①. 簡單測試程序HelloWord.py
print("Hello World!")
②. 簡單日歷顯示程序Calander.py
# Filename : test.py
# author by : www.runoob.com
# 引入日歷模塊
import calendar
# 輸入指定年月
yy = int(input("輸入年份: "))
mm = int(input("輸入月份: "))
# 顯示日歷
print(calendar.month(yy,mm))
③. 簡單數據庫操作程序MySql.py
import pymysql
import time
# 打開數據庫連接。connec參數依次為"容器IP或虛擬機IP","用戶名","密碼","數據庫名稱",字符集編碼格式
db = pymysql.connect("localhost", "root", "6666", "user", charset='utf8mb4' )
# 使用 cursor() 方法創建一個游標對象 cursor
cursor = db.cursor()
# 使用 execute() 方法執行 SQL,如果表存在則刪除
cursor.execute("DROP TABLE IF EXISTS myuser")
# 使用預處理語句創建表
sql = """CREATE TABLE myuser (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1) )"""
try:
# 執行SQL語句
cursor.execute(sql)
# 提交到數據庫執行
db.commit()
except:
# 如果發生錯誤則回滾
db.rollback()
# 增
sql = "INSERT INTO myuser(FIRST_NAME,LAST_NAME, AGE, SEX) VALUES (%s, %s, %s, %s)"
data = (('Xin', 'Lin', 23, 'M'),('Yun', 'Ma', 50, 'M'))
try:
# 執行多條sql語句
cursor.executemany(sql, data)
# 提交到數據庫執行
db.commit()
except:
# 如果發生錯誤則回滾
db.rollback()
#查
sql = "SELECT * FROM myuser"
try:
# 執行SQL語句
cursor.execute(sql)
# 獲取所有記錄列表
results = cursor.fetchall()
print("插入數據:")
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
# 打印結果
print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
print ("Error: unable to fetch data")
#改
sql = "UPDATE myuser SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 執行SQL語句
cursor.execute(sql)
# 提交到數據庫執行
db.commit()
except:
# 發生錯誤時回滾
db.rollback()
#查
sql = "SELECT * FROM myuser"
try:
# 執行SQL語句
cursor.execute(sql)
# 獲取所有記錄列表
results = cursor.fetchall()
print("修改年齡:")
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
# 打印結果
print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
print ("Error: unable to fetch data")
#查
sql = "SELECT * FROM myuser WHERE AGE = 24"
try:
# 執行SQL語句
cursor.execute(sql)
# 獲取所有記錄列表
results = cursor.fetchall()
print("刪除記錄:")
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
# 打印結果
print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
print ("Error: unable to fetch data")
#刪
sql = "DELETE FROM myuser WHERE AGE = 24"
try:
# 執行SQL語句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 發生錯誤時回滾
db.rollback()
#查
sql = "SELECT * FROM myuser"
try:
# 執行SQL語句
cursor.execute(sql)
# 獲取所有記錄列表
results = cursor.fetchall()
print("最后結果:")
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
# 打印結果
print ("fname=%s,lname=%s,age=%s,sex=%s" % (fname, lname, age, sex))
except:
print ("Error: unable to fetch data")
# 關閉數據庫連接
db.close()
④. 簡單圖像操作程序poenvc.py
import cv2
import numpy as np
img=cv2.imread('test.jpg')
print(img.shape) #返回圖像屬性:行數,列數,通道數的元組
print(img.size, img.dtype) # 返回的是圖像的數據類型.
block=img[70:120,80:120]
img[0:50,0:40]=block
img=cv2.imshow('test', img)
cv2.waitKey(0)
參考opencv圖像的基本操作中的9.2 獲取圖像屬性、9.3 圖像 ROI。
ps:mysql的構建使用的是上一篇博客中構建的mysql(也可以使用mysql官方鏡像)
⑤. 文件結構
├── Calander.py
├── HelloWorld.py
├── MySql.py
├── opencv.py
├── python3_dockerfile
├── requirements.txt
└── test.jpg
二.Python3鏡像構建
使用命令:docker build -t python3 -f ./python3_dockerfile .
,構建過程如下:
三.運行測試
1️⃣ 運行HelloWorld.py
命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python HelloWorld.py
結果:
2️⃣ 運行Calander.py
命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python Calander.py
結果:
3️⃣ 運行MySql.py
命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3 python MySql.py
運行時出錯:
錯誤原因:mysql版本身份驗證出現問題引起
解決方法:進入pyhton3容器中安裝cryptography,然后commit成鏡像(或者在dockerfile中添加cryptography的安裝),再運行新的鏡像。
具體過程:
①. 使用命令docker run --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp -it python3 bash
,交互式啟動python3,進入容器:
②. 在容器中安裝cryptography:pip install cryptography -i https://pypi.tuna.tsinghua.edu.cn/simple
:
在這里可以直接運行:
③. commit成鏡像,commit命令:docker commit python3_container python3_lxc
④. 再次運行,運行命令:docker run -it --rm --name python3_container -v "$PWD":/usr/src/myapp -w /usr/src/myapp python3_lxc python MySql.py
4️⃣ 運行opencv.py
由於docker中顯示圖像比較繁瑣,這里的圖像是在本機跑出來的,運行的時候可以把有關圖像顯示的內容注釋掉或者去掉:
import cv2
import numpy as np
img=cv2.imread('test.jpg')
print(img.shape) #返回圖像屬性:行數,列數,通道數的元組
print(img.size, img.dtype) # 返回的是圖像的數據類型.
#block=img[70:120,80:120]
#img[0:50,0:40]=block
#img=cv2.imshow('test', img)
#cv2.waitKey(0)
結果:
在本機windows系統上運行有關圖片顯示部分的結果,效果為截取表情包中熊貓人的嘴型放到圖片左上角:
四.小結
這次實踐+編寫博客花費了大概有5個小時的時間。實踐難度不大,主要是圍繞python鏡像進行簡單的環境配置和運行測試。根據教程按部就班,過程很順暢。做完這次實踐,第一是學到了Python requirement文件的創建和使用,體會到了requirement作用:requirement作用是記錄python程序依賴包,在鏡像構建時通過pip安裝requirement中記錄的依賴,從而節省了手動下載依賴的繁瑣步驟。其次是初步了解了python的opencv,通過一些簡單的圖片操作體會了opencv的作用。總的來說,一路通暢,收獲滿滿!😀😀