本文将告诉大家什么是 Docker 以及如何在 Python 中使用 Docker。

新手程序员面临的最困难的问题之一是理解“环境”的概念。环境就是你编写代码的系统,听起来很容易,但很快你就会明白维护系统有多困难。

很大原因是库和 IDE,甚至 Python 代码本身都会经历更新和版本更改,有时候,我们对一个库进行更新,就会导致另一段代码报错。正因如此,我们经常需要修复各种来源不明的 BUG。

此外,如果我们同时开发多个项目,可能会出现依赖性冲突。如果一段代码因为另一段代码而出现 BUG 时,情况会更糟糕。

另外,如果你想将一个项目共享给一个在不同操作系统上工作的团队成员,或者将你在 Mac 上构建的项目发送到另一个操作系统上的服务器,你是否需要重新配置代码?很明显是一定需要的。

因此,为了减少这些问题的出现,人们提出使用容器来分离项目和它们所在的环境。容器基本上是一个环境可以运行的地方,与系统中的所有其他东西分开。一旦定义了容器中的内容,就可以轻松地重新创建环境,甚至与同事共享项目。

要求

首先,我们需要安装一些设置:

Windows或macOS:安装Docker Desktop(https://www.docker.com/get-started)

Linux:先安装Docker,再安装 Docker Compose(https://docs.docker.com/compose/install/)

对Python服务进行容器化

假设我们正在创建一个名为 server.py 的 Flask 服务,并假设文件内容如下:

from flask import Flaskserver = Flask(__name__)@server.route("/") def hello():    return "Hello World!"if __name__ == "__main__":   server.run(host='0.0.0.0')

如上所述,我们需要记录代码的依赖关系,因此,我们可以创建一个 requirements.txt 文件,其中可以包含以下要求:

Flask==1.1.1

因此,我们的软件包需要具有以下结构:

app├─── requirements.txt└─── src     └─── server.py

该结构非常合理(源代码保存在单独的目录中)。要执行我们的 Python 程序,只需安装一个Python 解释器并运行即可。

我们可以在本地运行该程序,但是假设我们正在处理 15 个项目:在容器中运行是有意义的,这样可以避免与其他项目发生冲突。

让我们进入容器化。

Dockerfile

要运行 Python 代码,我们将容器打包为 Docker 映像,然后基于它运行一个容器。如下所示:

  • 创建一个 Dockerfile,其中包含构建图像所需的说明;
  • 然后由 Docker builder 创建映像;
  • 简单的 docker run image 命令然后创建一个运行应用程序的容器。

分析 Dockerfile

Dockerfile 是一个文件,其中包含有关组装 Docker 映像(保存为 myimage )的说明:

# 设置基本映像(主机操作系统)FROM python:3.8# 在容器中设置工作目录WORKDIR /code# 将依赖项文件复制到工作目录中COPY requirements.txt .# 安装依赖项RUN pip install -r requirements.txt# 将本地src目录的内容复制到工作目录COPY src/ .# 在容器启动时运行的命令CMD [ "python", "./server.py" ]

Dockerfile 是逐行编译的,因此构建器会生成图像层并将其堆叠在先前的图像上。

我们还可以在 build 命令的输出中观察到作为步骤执行的 Dockerfile 指令。

$ docker build -t myimage .Sending build context to Docker daemon 6.144kBStep 1/6 : FROM python:3.83.8.3-alpine: Pulling from library/python…Status: Downloaded newer image for python:3.8.3-alpine---> 8ecf5a48c789Step 2/6 : WORKDIR /code---> Running in 9313cd5d834dRemoving intermediate container 9313cd5d834d---> c852f099c2f9Step 3/6 : COPY requirements.txt .---> 2c375052ccd6Step 4/6 : RUN pip install -r requirements.txt---> Running in 3ee13f767d05…Removing intermediate container 3ee13f767d05---> 8dd7f46dddf0Step 5/6 : COPY ./src .---> 6ab2d97e4aa1Step 6/6 : CMD python server.py---> Running in fbbbb21349beRemoving intermediate container fbbbb21349be---> 27084556702bSuccessfully built 70a92e92f3b5Successfully tagged myimage:latest

然后,我们可以看到映像位于本地映像存储目录中:

$ docker imagesREPOSITORY    TAG       IMAGE ID        CREATED          SIZEmyimage       latest    70a92e92f3b5    8 seconds ago    991MB

在开发过程中,我们希望花费尽可能少的时间,为 Python 服务重建映像。

注意:Docker 和 virtualenv 非常相似但又有所不同。Virtualenv 只允许我们在 Python 的依赖关系之间切换,无法使用主机操作系统。但是,使用Docker,你可以在任何操作系统上交换整个操作系统:安装并运行Python(例如 UBTUN,Debian,Alpine,甚至Windows Server Core)。因此,如果你的团队工作需要验证你的技术,请使用Docker。如果不需要,可以使用 venv。

总结

在上文中,我们展示了如何把 Python 服务容器化。 希望此过程将变得更容易,并且能够为你的项目提供更长的保质期。同时,因为依赖关系的变化,也能降低你的代码错误的可能性。

喜欢本文的同学记得收藏+点赞~

更多内容,欢迎大家关注我们的公众号:为AI呐喊(weainahan)

项目创建venv、_都2020年了,居然还有人没有在数据科学项目中使用Docker?相关推荐

  1. 安卓源代码_都2020年了,还有人以为安卓系统是谷歌的?

    阅读本文前,请您先点击上面的蓝色字体"杨观世界",再点击"关注",这样您就可以免费收到最新内容了.每天都有分享,完全是免费订阅,请放心关注. 4月8日晚,华为结 ...

  2. cdialog创建后马上隐藏_都2020了,你还没用上这些Windows的“隐藏神技能”?

    如今,电脑系统 的天下都被Windows和macOS给占领了,那么它们之间的较量自然是不少.关于它们谁更好用的话题从来就没断过,也从来没有什么标准答案,只能说是萝卜青菜各有所爱吧.可每次看到那些说Wi ...

  3. 后端开发需要学什么_都2020年了,还在纠结学什么语言?| 后端篇

    几个礼拜前,一个学弟问我: "Ray,我打算之后要找工作了,不过现在自己没有特别深入的语言,最近想找一门好好学一下,你觉得学什么语言好呀?" 我表示:"这个要看你求职方向 ...

  4. winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...

    电脑硬盘,到底该不该分区? 很多人买了新电脑或者在电脑中安装了SSD硬盘之后,第一个步骤就是:开机-给硬盘分区. 但是,大家有没有考虑过,硬盘是否真的需要分区呢?这不最近有人就在程序员社区V2EX上提 ...

  5. 分度值1g是什么意思_都什么年代了,还有人在 MySQL 索引上碰一鼻子灰?

    推荐阅读: 阿里技术大牛的Spring秘籍:Spring+SpringBoot+源码解析+SpringCloud​zhuanlan.zhihu.com 不愧是阿里架构师,一份文档就把 Docker 讲 ...

  6. python学什么版本2020年_2020年了居然还有人在学Python?学python有什么用?

    都2020年了居然还有人在学python?学python有什么用? 真是气抖冷啊! 想学习python的小伙伴,可以加裙595227871 领取免费的学习资料 为什么选择python? 1.行业人才的 ...

  7. 都2020年了,还在迷信啤酒与尿布!数据分析的真相是……

    一提人工智能大数据,必有人提啤酒与尿布,有意思的是,都2020年了,还有人信这个老掉牙的都市传说.今天我们系统讲解一下.  1  站在背后的关联规则 支持啤酒与尿布故事的,是关联规则算法.注意:关联规 ...

  8. 分步式数据库_创建真实数据科学项目的分步指南

    分步式数据库 As an inspiring data scientist, building interesting portfolio projects is key to showcase yo ...

  9. 护理方面关于人工智能的构想_如何提出惊人的AI,ML或数据科学项目构想。

    护理方面关于人工智能的构想 No Matter What People Tell You, Words And Ideas Can Change The World. - Robin Williams ...

最新文章

  1. 多目标跟踪(MOT)入门
  2. TensorFlow基础9-多层神经网络
  3. CSS定位网页中的元素
  4. local sandbox getBootstrapScriptPath
  5. 【.NET Core项目实战-统一认证平台】第一章 功能及架构分析
  6. martingale与Markov Process的关系
  7. 数据结构与算法--Tree(二叉树、B±树、红黑树)
  8. C# LINQ 对象克隆
  9. 停掉一台服务器,Nginx响应慢(转载)
  10. 基于邮件推拉技术的数据库远程数据同步解决方案
  11. 批处理一键创建局域网共享文件夹或文件共享轻松访问Win系统其他电脑的共享文件命令行(纯bat代码)实用便携~
  12. linux-LNMP一键安装Error: MySQL install failed. Error: PHP install failed
  13. BLENDER快捷键(个人防止忘记的几个快捷键)
  14. MFC PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口问题
  15. MFC Rect 的详解
  16. JAVA语言 - Android拷贝assets文件(资源文件)
  17. 如何将nb公式转换成matlab公式
  18. QQ中强制和他人聊天的代码
  19. 工程施工监理平台app开发 开创工程监理服务新理念
  20. Unity多分辨率适配

热门文章

  1. postgresql 数据库 客户端认证
  2. linux nm工具 查看静动态库导出函数
  3. linux 网络状态表 /proc/net/tcp 各项参数说明
  4. Shell中的数据重定向--输入/输出重定向
  5. 九、Swift对象存储服务(双节点搭建)
  6. mysql不支持addbatch_【MySql】Java 批量插入数据库addBatch
  7. java 变量分配_Java中成员变量分配在哪个空间?
  8. 如何在php中插入map热点,PHP中使用BigMap实例
  9. java连连看源代码在哪_连连看java源代码
  10. linux7安装pgsql数据库,在CentOS7系统上安装和配置PostgreSQL