还不使用Docker管理数据,你是从1985年穿越来的吗?

本文转载自公众号“读芯术”(ID:AI_Discovery)。python

小白程序员面临的最大困难之一就是理解环境的概念。环境是指程序员进行编码的系统,这听起来貌似很容易,但随着程序员职业生涯的推荐,程序员会逐渐体会到维护“环境”是一件多么困难的事情。linux

这主要是由于库、IDE(集成开发环境),甚至Python代码都须要通过更新和版本升级。有时更新一个库,某段代码就会出错,须要从新修改代码。若是同时开发多个项目,就会引发依赖冲突,当某段代码致使另外一段代码错误时,事情就会变得很棘手了。程序员

另外,若是想将项目共享给一个在不一样操做系统上的工做伙伴,或者将在Mac上构建的项目交付到另外一个操做系统的生产服务器上,就不得不从新配置代码了。docker

为了解决这些问题,将项目和项目所处的环境分离的方法被称为“容器”。容器是支持环境运行的地方,与系统上的其余内容东西相分离。一旦定义了容器中的内容,重建环境就很容易了,甚至能够实现与同事共享项目。flask

要求windows

  • 启动Docker,须要安装软件:服务器

  • windows或macOS:安装Docker Desktopapp

  • linux:安装Docker,而后编写Dockeride

Python服务包ui

假设正在建立一个名为server.py的Flask服务,并设置该文件的内容,以下:

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

如上述,需保留代码依赖关系的记录。所以建立一个关于需求的txt文件,包含如下内容:

Flask==1.1.1

所以,服务包有如下结构:

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

该结构十分符合逻辑(源文件保存在独立目录中)。若执行Python程序,咱们须要安装并运行Python解释器。接下来能够在本地运行这个程序,若是有15个项目同时运行,在一个容器中运行能够避免与其余项目发生冲突。

Dockerfile

运行Python代码,须要将容器打包为Docker镜像,而后运行。操做以下:

  • 建立一个包含构建镜像所需指令的Dockerfile

  • 而后经过Docker生成器建立镜像

  • 简单的docker run 命令就能够建立一个正在运行应用程序的容器

Dockerfile分析

Dockerfile是一个包含合成Docker镜像说明的文件(命名为myimage):

# set base image (host OS) 
FROM python:3.8# set the working directory in the container 
WORKDIR /code# copy the dependencies file to the working directory 
COPY requirements.txt .# install dependencies 
RUN pip install -r requirements.txt# copy the content of the local srcdirectory to the working directory 
COPY src/ .# command to run on container start 
CMD [ "python", "./server.py" ]

Dockerfile是逐行编译的,所以生成器会生成一个图层,并将其叠加在以前的图像上。在build命令的输出中,能够看到做为步骤执行的Dockerfile指令。

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

而后能够发现镜像存储在本地图像中:

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

在开发过程当中,可能须要屡次为Python服务从新构建镜像,因此但愿花费尽量少的时间。

Docker和virtualenv很是类似,但又有所不一样。Virtualenv容许你在Python依赖关系中切换,但必须使用主机操做系统。然而,使用Docker就能够在任何操做系统上安装和运行Python(包括Ubuntu、Debian、Alpine以及Windows Server Core)。

所以,若是你在一个团队中工做,但愿能够在之后证实你的技术,就要使用Docker。若是不用docker,venv也是不错的,但它不是通向将来的凭证。

还不使用Docker管理数据,你是从1985年穿越来的吗?

图源:unsplash

本文展现了如何建立Python服务包,并但愿简化过程,使程序员的项目维持更长时间。由于当依赖关系发生变化时,它不太可能出现代码错误。

【责任编辑:赵宁宁 TEL:(010)68476606】

相关文章
相关标签/搜索