一、Python环境搭建

1.拉取镜像

sudo docker pull python:3.7  #拉取dockerhub上的python镜像

image.png

2.创建文件

  • Dockerfile文件
FROM python:3.7
# 设置工作目录
WORKDIR /usr/src/app 
# 添加依赖声明文件
COPY requirements.txt ./ 
RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY apps/hello.py /usr/src/app/
# 实现命令行式调用容器
VOLUME /usr/src/app
# 实现命令行式调用容器
ENTRYPOINT ["python"]   
# ENTRYPOINT默认参数
CMD ["hello.py"]   
  • requirements.txt
PyMySQL
opencv-python
  • hello.py
#hello.py
print('hello world')
  • date.py
#date.py日历输出

import calendar
yy = int(input("输入年份: "))
mm = int(input("输入月份: "))
print(calendar.month(yy,mm))
  • db.py
#db.py 向已有的数据库和表格中添加一条数据(031702500,zz)
import pymysql

# 打开数据库连接
#数据库地址使用mysql的容器名
#使用实验二时候创建的用户,密码,数据库
db = pymysql.connect("mysql1", "hh", "123456", "docker_mysql") 
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()

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

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

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

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

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

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

# 关闭数据库连接
db.close()
  • cv.py
# cv.py将图片旋转90度并保存
import cv2

# flags传入0表示灰度图像, 1表示彩色图像
img=cv2.imread('test.jpg',flags=1)

# 获取图片尺寸
rows,cols=img.shape[:2]

# 这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子
# 可以通过设置旋转中心,缩放因子,以及窗口大小来防止旋转后超出边界的问题
M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1)

# 第三个参数是输出图像的尺寸中心
dst=cv2.warpAffine(img,M,(cols,rows))

# 写入文件
cv2.imwrite("test-rotated.jpg", dst, [int(cv2.IMWRITE_JPEG_QUALITY), 100])
print('rotated and saved.')
  • 文件结构
    image.png

3.构建自定义镜像

sudo docker build -t python:v1 .  #构建自定义镜像

image.png

二、测试

2.1helloworld

#无交互式输入:
sudo docker run -v /home/tao/5th/apps:/usr/src/app --rm python:v1

image.png

2.2日历输出

#有交互式输入:
sudo docker run -it -v /home/tao/5th/apps:/usr/src/app --rm python:v1 date.py

image.png

2.3mysql数据库操作

  • 创建一个新的网络连接
sudo docker network create --subnet=172.1.0.0/16 py_mysql #创建名为py_mysql的网络

image.png

  • 在创建的网络中运行python和mysql容器
sudo docker run --network py_mysql --name mysql1 -d mymysql:test  
sudo docker exec -it mysql1 /bin/bash
  • 运行代码
sudo docker run -it --network py_mysql -v /home/tao/5th/apps:/usr/src/app --rm python:v1 db.py

2.4opencv程序的部署运行

sudo docker run -v /home/tao/5th/apps:/usr/src/app --rm python:v1 cv.py

image.png

三、总结

  • 困难

构建自定义镜像时,出现COPY failed: stat /var/lib/docker/tmp/docker-builder455335933/opt: no such file or directory

  • 原因

Dockerfile以#开头的行视为注释,如果在有效指令后面使用#号注释,会将其作为参数处理,导致报错**

  • 解决

将注释去掉即可,或者把注释单独放一行`

  • 耗时

5小时。