1.项目结构
├── app
│ ├── cvv.py
│ ├── date.py
│ ├── hello.py
│ ├── mysql1.py
│ ├── mysql2.py
│ ├── mysql3.py
│ ├── mysql4.py
│ ├── mysql5.py
│ ├── mysql6.py
│ └── test.jpg
├── Dockerfile
└── requirements.txt
2.搭建python镜像
- (1)requirements.txt
PyMySQL
opencv-python
- (2)Dockerfile
FROM python
MAINTAINER y00
WORKDIR /app #工作目录
COPY ./requirements.txt /requirements.txt #添加依赖文件
RUN pip install -r /requirements.txt -i https://pypi.douban.com/simple #修改源并安装依赖
ENTRYPOINT [ "python" ] # 实现命令行式调用容器
CMD [ "hello.py" ] #设置ENTRYPOINT默认参数
- (3)搭建镜像
sudo docker build -t docker-python .
3.简单程序的部署运行
- (1)helloworld
# hello.py
print('hello world')
sudo docker run --rm -v /home/y00/docker-python/app:/app docker-python hello.py
- (2)日历输出
# date.py
import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
sudo docker run -it --rm -v /home/y00/docker-python/app:/app docker-python date.py
- (3)mysql数据库操作
先开启一个数据库容器,可以用之前搭建好的
①测试数据库连接
#mysql1.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL 查询
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql1.py
②新建表
#mysql2.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute() 方法执行 SQL,如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")
# 使用预处理语句创建表
sql = """CREATE TABLE EMPLOYEE (
FIRST_NAME CHAR(20) NOT NULL,
LAST_NAME CHAR(20),
AGE INT,
SEX CHAR(1),
INCOME FLOAT )"""
cursor.execute(sql)
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql2.py
③表中插入数据
#mysql3.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
LAST_NAME, AGE, SEX, INCOME)
VALUES ('y00', '000', 20, 'F', 2000)"""
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 如果发生错误则回滚
db.rollback()
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql3.py
④获取数据库某个表的记录
#mysql4.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE
WHERE INCOME > %s" % (1000)
try:
# 执行SQL语句
cursor.execute(sql)
# 获取所有记录列表
results = cursor.fetchall()
for row in results:
fname = row[0]
lname = row[1]
age = row[2]
sex = row[3]
income = row[4]
# 打印结果
print ("fname=%s,lname=%s,age=%s,sex=%s,income=%s" %
(fname, lname, age, sex, income ))
except:
print ("Error: unable to fetch data")
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql4.py
⑤将 表中 SEX 为 'M' 的 AGE 字段递增 1
#mysql5.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 更新语句
sql = "UPDATE EMPLOYEE SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M')
try:
# 执行SQL语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭数据库连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql5.py
⑥删除数据表 EMPLOYEE 中 AGE 大于 20 的所有数据
#mysql6.py
#!/usr/bin/python3
import pymysql
# 打开数据库连接
db = pymysql.connect(host="192.168.0.110",user="docker",password="123456",database="docker_mysql" )
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 删除语句
sql = "DELETE FROM EMPLOYEE WHERE AGE > %s" % (20)
try:
# 执行SQL语句
cursor.execute(sql)
# 提交修改
db.commit()
except:
# 发生错误时回滚
db.rollback()
# 关闭连接
db.close()
sudo docker run --rm -v /home/y00/docker-python/app:/app --link=mysql1:mysql1 docker-python mysql6.py
- (4)opencv程序
函数 cv2.moments() 会将计算得到的矩以一个字典的形式返回
#cvv.py
import cv2
import numpy as np
img = cv2.imread('test.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv2.moments(cnt)
print (M)
4.出现的错误及解决方法
- (1)部署日历输出程序出错
docker run 后面应加-it,表示声明需要交互式终端,然后才可以输入
- (2)部署opencv程序出错
把程序命名成了cv2.py,这和python库中的程序命名相同,编译的时候会报错,把cv2.py改成cvv.py就可以了
5.时间花费
项目 | 时间(估算) |
---|---|
搭建镜像 | 30min |
各个程序部署运行 | 3h |
写博客 | 30min |