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

云计算 后端
本文展示了如何创建Python服务包,并希望简化过程,使程序员的项目维持更长时间。因为当依赖关系发生变化时,它不太可能出现代码错误。

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

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

这主要是因为库、IDE(集成开发环境),甚至Python代码都需要经过更新和版本升级。有时更新一个库,某段代码就会出错,需要重新修改代码。如果同时开发多个项目,就会引起依赖冲突,当某段代码导致另一段代码错误时,事情就会变得很棘手了。

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

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

要求

  • 启动Docker,需要安装软件:
  • windows或macOS:安装Docker Desktop
  • linux:安装Docker,然后编写Docker

Python服务包

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

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

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

  1. Flask==1.1.1 

因此,服务包有以下结构:

  1. app 
  2. ├─── requirements.txt 
  3. └─── src 
  4.      └─── server.py 

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

Dockerfile

运行Python代码,需要将容器打包为Docker镜像,然后运行。操作如下:

  • 创建一个包含构建镜像所需指令的Dockerfile
  • 然后通过Docker生成器创建镜像
  • 简单的docker run 命令就可以创建一个正在运行应用程序的容器

Dockerfile分析

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

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

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

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

然后可以发现镜像存储在本地图像中:

  1. $ docker images 
  2. 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也是不错的,但它不是通向未来的凭证。

[[341481]]

图源:unsplash

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

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2013-05-02 09:36:44

代码项目

2020-03-07 15:25:38

TypeScript代码开发

2022-01-03 18:07:56

泛型场景demo

2024-02-19 00:00:00

Docker轻量级容器

2023-01-02 10:08:42

StampedLocAQS框架

2023-11-06 07:23:06

API开发生态系统

2019-09-26 11:29:37

70年国庆成就

2015-02-28 13:32:01

搜索大数据营销

2018-10-08 14:42:55

2009-05-26 16:59:34

IT技术IT管理

2016-06-02 13:22:12

LinuxWeb浏览器

2021-10-22 09:41:26

桥接模式设计

2019-11-11 08:45:52

HTTPTCP数据

2018-12-29 14:14:32

2019-06-14 15:10:54

密码管理存储密码攻击

2017-10-18 17:52:50

2016-12-09 13:42:14

2010-05-13 11:45:56

MySQL数据库

2019-03-08 16:12:05

Docker容器开源

2013-08-21 10:08:16

点赞
收藏

51CTO技术栈公众号