新手程序员面临的难题之一是理解“环境”的概念。环境是一个系统,你在其中编写代码,听起来很容易,但很快你就会明白维护这个系统有多么困难。很大的原因是库和IDE,甚至Python代码本身都会发生更新和版本变化。有时候,当我们更新一个库的时候,会导致另外一段代码报错。因此,我们经常需要修复各种未知来源的错误。还有,如果我们同时开发多个项目,可能会出现依赖冲突。当一段代码因为另一段代码而出现错误时,情况会更糟。另外,如果你想与在不同操作系统上工作的团队成员共享一个项目,或者将你在Mac上构建的项目发送到另一个操作系统上的服务器,你是否需要重新配置代码?显然是肯定需要它。因此,为了减少这些问题的发生,有人提出用容器来隔离项目和它们所处的环境。容器基本上是一个环境可以运行的地方,与系统中的其他所有东西分开。一旦定义了容器中的内容,您就可以轻松地重新创建环境,甚至可以与同事共享项目。要求首先,我们需要安装一些设置:Windows或macOS:安装DockerDesktop(https://www.docker.com/get-started)Linux:先安装Docker,然后安装DockerCompose(https://docs.docker.com/compose/install/)容器化一个Python服务假设我们正在创建一个名为server.py的Flask服务,并假设文件内容如下:fromflaskimportFlaskserver=Flask(__name__)@server.route("/")defhello():返回“你好世界!”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构建器创建图像;一个简单的dockerrunimage命令然后创建一个运行应用程序的容器。分析DockerfileDockerfile是一个包含组装Docker镜像(保存为myimage)的说明的文件:#Setbaseimage(hostOS)FROMpython:3.8#SetworkingdirectoryincontainerWORKDIR/code#CopydependencyfilestoworkCOPYrequirements。txt在目录下。#安装依赖RUNpipinstall-rrequirements.txt#将本地src目录的内容复制到工作目录COPYsrc/。#容器启动时运行的命令CMD["python","./server.py"]Dockerfiles是逐行编译的,因此构建器生成图像层并将它们堆叠在以前的图像之上。我们还可以在构建命令的输出中观察作为步骤执行的Dockerfile指令。$dockerbuild-tmyimage.SendingbuildcontexttoDockerdaemon6.144kBStep1/6:FROMpython:3.83.8.3-alpine:Pullingfromlibrary/python…Status:Downloadednewerimageforpython:3.8.3-alpine--->8ecf5a48c789Step2/6:WORKDIR/code--->Runningin9313cd5d834dRemovingintermediatecontainer9313cd5d834d--->c852f099c2f9Step3/6:COPYrequirements.txt.--->2c375052ccd6Step4/6:RUNpipinstall-rrequirements.txt--->Runningin3ee13f767d05…Removingintermediatecontainer3ee13f767d05--->8dd7f46dddf0Step5/6:COPY./src.--->6ab2d97e4aa1Step6/6:CMDpythonserver.py--->Runninginfbbbb21349beRemovingintermediatecontainerfbbbb21349be--->27084556702bSuccessfullybuilt70a92e92f3b5Successfullytaggedmyimage:latest然后,我们可以看到映像位于本地映像存储目录中:$dockerimagesREPOSITORYTAGIMAGEIDCREATEDSIZEmyimagelatest70a92e92f3b58secondsago991MB在开发过程中,我们希望花费尽可能少的时间,为Python服务重建image.Note:Dockerandvirtualenvareverysimilarbutdifferent.VirtualenvonlyallowsustoswitchbetweenPython'sdependencies,notthehostOS.但是,使用Docker,您可以在任何操作系统上更换整个操作系统:安装并运行Python(例如UBTUN、Debian、Alpine,甚至是WindowsServerCore)。因此,如果您的团队工作需要验证您的技术,请使用Docker。如果不需要,可以使用venv。总结上面,我们展示了如何容器化Python服务。希望这个过程会更容易,并为您的项目提供更长的保质期。同时,因为依赖关系的变化,也可以减少你的代码出错的可能性。
