from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int("5000"), debug=True)
在极客世界里,部署一次,处处运行,这个问题其实有点老掉牙了。别犹豫,答案就是docker。如果你对docker有所了解,你就会知道,以容器的形式发布应用程序已经变得非常流行。本文将教你如何将一个Python应用容器化。一旦容器化,你的应用就可以轻松迁移到其他支持Docker的服务器上,即使这些服务器不联网,只需将一个Docker镜像拷贝到内网即可完成部署。假设有一个用flask编写的Python web应用index.py,展示了一个简单的Hello World:
运行python index.py后,在浏览器上访问:5000,会看到浏览器显示’Hello World!’,说明程序正常运行。如果我们将这个文件发送给别人,他需要执行以下3个步骤才能启动这个web应用:
Flask==1.1.2
安装Python解释器、安装flask库、执行python index.py。实际情况下,第二步可能涉及很多依赖项,我们可以将所有依赖库放在requirements.txt文件中:
FROM python:alpine3.8
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
EXPOSE 5000
CMD python ./index.py
然后,在应用程序的根目录(即index.py所在的目录)中创建一个名为Dockerfile的文本文件,并粘贴以下代码。请注意,FROM指令指向python:alpine3.7,告诉Docker容器要使用的基本映像和Python版本(这里是3.8)。Docker Hub提供几乎所有Python版本的基本映像。这个示例使用的是安装在Alpine Linux上的Python,有助于使Docker镜像更小。RUN指令调用pip从requirements.txt文件安装依赖项。Dockerfile中的其他指令非常简单。CMD指令告诉容器要执行的启动应用程序,这里是告诉Python运行index.py。COPY指令简单地将应用程序移动到容器镜像中,WORKDIR设置工作目录,EXPOSE绑定Flask使用的端口。
docker build --tag somenzz-app ./
$ docker images | grep somenzz
somenzz-app latest b7e2359056bb 3 hours ago 89.1MB
somenzz/my-kali latest 975cbe3a4619 2 weeks ago 1.83GB
$ docker run --name python-app -p 5000:5000 somenzz-app
* Serving Flask app "index" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 201-219-912
172.17.0.1 - - [14/Oct/2020 22:32:05] "GET / HTTP/1.1" 200 -
要构建镜像,在Dockerfile目录下,运行docker build命令。等待基本镜像下载并构建完成,将得到一个名为somenzz-app的镜像。这个镜像只有89.1MB大小。接下来就像使用其他镜像一样:
此时容器已成功启动,本地的5000端口映射到容器的5000端口,因此访问127.0.0.0:5000相当于访问容器的5000端口。如果要在后台运行容器,可以加入-d参数:
$ docker run -d --name python-app -p 5000:5000 somenzz-app
259d09fbbf77a6fd680cd7527600d055cb76fe3d6792063846103b47360210f9
$ docker container list | grep somenzz-app
259d09fbbf77 somenzz-app "/bin/sh -c 'python …" 20 minutes ago Up 20 minutes 0.0.0.0:5000->5000/tcp python-app
结合前文的步骤,带你进入Docker的第7步:发布镜像,你可以将容器发布到网络上供他人使用。如果你不熟悉Dockerfile,制作并发布Docker镜像还有一个更简单的方法,即下载一个镜像,启动,登录到容器内部进行修改、安装依赖,然后保存为新镜像,最后发布。当然,这种方法效率较低,建议还是学习Dockerfile,官方教程在此:docs.docker.com/engine/reference/builder/。本文只是一个简单的HelloWorld web应用,更复杂的场景需要更多关注细节,但大多数Python应用程序的容器化流程都是相似的。希望本文对你有所帮助。