采用Docker的方式部署python的流程:

  • 1、Docker hub拉取python镜像。
  • 2、创建容器并在容器内增加项目所需第三方库
  • 3、将步骤2的容器制作为镜像
  • 4、将镜像用于内网环境。

1. Docker hub拉取python镜像

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker pull python:3.6

使用docker images查看镜像仓库中是否已经有了我们刚刚拉取的镜像。

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker images

2. 创建容器并在容器内增加项目所需第三方库

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker run -it python:3.6 /bin/bash
root@e2d28fdbcd53:/# python
Python 3.6.15 (default, Oct 13 2021, 09:43:57) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 
  • -i: 交互操作
  • -t: 终端
  • python:3.6 : REPOSITORY:TAG
  • /bin/bash:这里我们希望有个交互式 Shell,因此用的是 /bin/bash

安装相关第三方包:
输入quit()退出Python终端,为了使安装过程更快,我们使用国内镜像安装pandas与opencv-python。

pip install pandas -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

注:
opencv-python的安装

pip install opencv-python -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

出现问题:

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

两种解决方案:
方案一:

root@e2d28fdbcd53:/# apt-get update
root@e2d28fdbcd53:/# apt-get install sudo                 //前两步操作是当容器内没有sudo才需要进行的操作
root@e2d28fdbcd53:/# sudo apt update
root@e2d28fdbcd53:/# sudo apt install libgl1-mesa-glx

方案二:

1.|root@8d349368d9cf:/# pip uninstall opencv-python
2.|root@8d349368d9cf:/# pip install opencv-python-headless -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

由于方案一测试失败,我使用的是第二种方案:
测试:

root@8d349368d9cf:/# python
Python 3.6.15 (default, Oct 13 2021, 09:43:57) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2

其他第三方库下载,如pytorch等。链接

3. 将步骤2的容器制作为镜像

此时我们需要将这个容器进行保存,制作成镜像,方便我们导入内网环境使用。
步骤2的shell不要关闭,重新打开一个shell窗口进行镜像制作。
输入如下命令查看容器ID,依据容器ID进行镜像制作:docker ps -a

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker ps -a
CONTAINER ID   IMAGE        COMMAND       CREATED          STATUS          PORTS     NAMES
fa5bc4eaf4de   python:3.6   "/bin/bash"   54 seconds ago   Up 53 seconds             gifted_brown

commit后面跟的即为刚才安装pandas与opencv容器对应的ID,new_python(不能大写)与3.6分别对应REPOSITORY与TAG,可随意命名。

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker commit fa5bc4eaf4de new_python:3.6
sha256:a87c809c1c3a3fcb2fb655ca6d1f0e1b9ceae63c3036608f5e7f971529c53758

制作镜像成功。输入docker images查看是否已经存在:

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
new_python   3.6       a87c809c1c3a   28 seconds ago   1.01GB
python       3.6       1498723101b5   5 days ago       902MB

此时即可将上文提示不可关闭的shell窗口关闭。
我们依据New_python这个镜像启动容器测试能否正常使用Python以及安装的pandas与opencv。

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker run -it new_python:3.6 /bin/bash
root@be029dd048d2:/# 

为了此镜像能够在内网环境及离线环境使用,将此镜像打包为文件(需要打包为以.tar后缀或者以.tar.gz结尾的文件),移植到具体项目环境中即可使用。
镜像打包命令格式为: docker save REPOSITORY:TAG |gzip > 镜像名

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker save new_python:3.6 |gzip > python_images.tar.gz

在当前路径下生成了python_images.tar.gz,文件大小为370M,到此处镜像文件制作完成,我们仅需要把python_images.tar.gz应用于离线环境或内网环境当中。

4. 将镜像用于内网环境

通过xshell或ftp等方式,将python_images.tar.gz上传至目标服务器。(此处为了演示效果。将原有python相关镜像删除)
删除原有Python镜像后,查看镜像:docker images

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

现在依据制作的python_imges.tar.gz镜像文件导入镜像。命令格式为:docker load < tar 包所在路径,此处即为docker load < /home/xiaoyuanzi/python_images.tar.gz

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker load < /home/xiaoyuanzi/python_images.tar.gz
xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
new_python   3.6       a87c809c1c3a   14 minutes ago   1.01GB

可以看到,镜像已经成功导入,并且REPOSITORY与TAG原来的保持一致,此处我们用该镜像来启动容器,测试Python及pandas第三方包。

测试:

xiaoyuanzi@xiaoyuanzi-virtual-machine:~$ docker run -it new_python:3.6 /bin/bash
root@d10f5d34c765:/# python
Python 3.6.15 (default, Oct 13 2021, 09:43:57) 
[GCC 10.2.1 20210110] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas
>>> 

测试成功!

5. 问题总结

问题1:docker 无法删除镜像

Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container 2588f7bc4a2b is using its referenced image 6fae60ef3446

解决1:

https://blog.csdn.net/yyj108317/article/details/105875836?

问题2: 容器内libGL.so.1问题

ImportError: libGL.so.1: cannot open shared object file: No such file or directory

解决2.1:

root@e2d28fdbcd53:/# apt-get update
root@e2d28fdbcd53:/# apt-get install sudo                 //前两步操作是当容器内没有sudo才需要进行的操作
root@e2d28fdbcd53:/# sudo apt update
root@e2d28fdbcd53:/# sudo apt install libgl1-mesa-glx

解决2.2:

1.|root@8d349368d9cf:/# pip uninstall opencv-python
2.|root@8d349368d9cf:/# pip install opencv-python-headless -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

参考:

1. https://blog.csdn.net/gf19960103/article/details/109489632

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐