实验要求

1,实现python容器的部署,并完成以下python程序所需环境的配置以及运行

2,在python容器中运行简单的helloworld程序

3,在python容器中实现简单的数据库操作

4,在pathon容器中实现简单openCV程序

实验环境

ubuntu18.04

Docker Engine - Community19.03.8

python3.7

mysql5.7

实验步骤

一,构建python容器

工程挂载目录

dockerfile

FROM python:3.7
WORKDIR /usr/local/pathon/
COPY requirements.txt ./
COPY opencv_python-4.2.0.34-cp37-cp37m-manylinux1_x86_64.whl ./
COPY numpy-1.18.4-cp37-cp37m-manylinux1_x86_64.whl ./
RUN python -m pip install --upgrade pip -i https://pypi.douban.com/simple
RUN pip install --default-timeout=100  -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt && pip install numpy-1.18.4-cp37-cp37m-manylinux1_x86_64.whl opencv_python-4.2.0.34-cp37-cp37m-manylinux1_x86_64.whl
COPY hello.py ./
COPY data.py ./
COPY db.py ./
ENTRYPOINT ["python"]
EXPOSE 80

requirement.txt
(因为使用pip下载依赖包实在是太慢了,经常出现timeout,于是我从网上事先下载好numpy和openCV的依赖,进行离线安装(虽然网上下载的速度依旧感人,但好歹不会timeout不是....))

PyMySql

创建python镜像

docker build -t python:test .


接下来创建mysql镜像,不过由于之前的实验有制作过mysql的镜像,这里就不再重复,直接使用以前的镜像创建mysql容器并开启服务

查看mysql容器的网络,待会将python容器也加进去

docker inspect mysql

这里mysql容器运行在名为“bridge"的网络中,且ip地址为172.17.0.2

查看本地搭建的网络,这里我选了“bridge”作为此次实验容器运行的网络

创建容器,并进入镜像

进入了python的解释器界面,我不是很懂这个,于是我退出该容器,然后又重启该容器,并使用exec命令试图进入命令行界面,成功

docker exec -it python1 /bin/bash

二,运行python程序

1,hello.py

print('hello world')


2,data.py(日历)

import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))


3,db.py

import pymysql

# 打开数据库连接
#数据库地址使用mysql的容器名
#使用实验二时候创建的用户,密码,数据库
db = pymysql.connect(
	host='172.17.0.2',
	user='root',
	password='123456', 
	database="Database",
	charset="utf8") 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

# 使用 execute()  方法执行 SQL 查询
cursor.execute("SELECT VERSION()")

# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()

print("Database version : %s " % data)

# SQL 插入语句
sql = """INSERT INTO S(id,name,class,score)
         VALUES ('3', 'wcx','03','60')"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # 如果发生错误则回滚
   db.rollback()

# SQL 查询语句
sql = """SELECT * FROM S"""

try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      S_id = row[0]
      name = row[1]
      S_class = row[2]
      score = row[3]
       # 打印结果
      print ("id=%s,name=%s S_class=%s score =%s" %(S_id, name,S_class, score ))
except:
   print ("Error: unable to fetch data")

# 关闭数据库连接
db.close()


数据库中验证一下

4,CVtest.py

#coding:utf-8

import cv2
img = cv2.imread(r"image.jpg")
# print(img.shape)
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,img_threshold = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
cv2.imwrite(r"changed_image.jpg",img_threshold)

image.jpg

执行CVtest.py

执行后查看当前目录,发现多了一张changed_image.jpg

实验中遇到的困难

1,构建镜像时总是timeout

解决方法:本地从官网下载相应的依赖包,采用离线安装的方式

2,python容器没有访问mysql容器的权限

(pymysql.err.InternalError: (1130, "Host 'xxxx' is not allowed to connect to this MySQL server"))
解决方法:进入mysql容器,修改mysql.user表,修改如下

 update user set Host='%',authentication_string='123456' where User='root'; #允许其他容器使用root用户登陆
 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;#授予所有root用户对所有数据库的操作权限
 flush privileges;#更新权限表