如何将一个Python应用程序容器化
Docker是目前最流行的容器化技术之一。它允许你将一个应用程序和它的所有依赖关系打包成一个单一的、紧凑的、隔离的容器。这个过程被称为容器化。
为什么容器化应用程序很重要
一个外部库版本的微小差异就可以改变你的应用程序的功能,从而导致其行为的不同。因此,容器化的应用程序允许它以相同的方式执行,无论它被部署在哪个工作空间或计算机上。
Docker的魅力在于,如果你将你的应用程序容器化,并将镜像传输到你同事的电脑上,你可以确保该应用程序在两个设备上都有相同的性能。这是因为容器中包含了应用程序的所有依赖关系。
镜像和容器
Docker文件,是只读的模板,用来创建容器。因此,图像和容器是密不可分的,两者都是运行Docker软件平台所必需的。
目标
在这篇文章中,你将学习如何使用Flask和Docker Compose构建一个简单的Python应用程序。Docker Compose有助于管理容器和其他相关服务。
前提条件
- 对Python和Flask的基本了解。
- 对命令行的基本了解。
- 一个代码编辑器(IDE),如VS Code或Pycharm。
通过以下链接安装Docker和Docker Compose。
第1步 - 应用程序结构
我们的应用程序最后看起来会是这样的。
|---- docker-compose.yml
|---- app
|---- app.py
|---- requirements.txt
使用我们的命令行,我们将为我们的应用程序建立一个新的文件夹,名为docker 。
进入你的命令提示符,输入下面的行。
你可以使用你的IDE中的集成命令行。
mkdir docker && cd docker
接下来,我们将在上面创建的docker 目录中创建我们的Docker Compose 文件。
touch docker-compose.yml
我们项目的结构现在应该是这样的。
docker
|---- docker-compose.yml
在我们进一步讨论之前,让我们开发我们的Flask 应用程序。
第2步 - 建立我们的Flask应用程序
Flask是一个轻量级的Python框架,用于构建Web应用程序。在本教程中,我们将创建一个Flask网络应用,在浏览器上显示 "Flask Dockerized "信息。
创建一个名为flask 的新文件夹,并运行下面的命令来打开它。
cd flask
在flask 目录内,创建一个新的文件夹,并将其称为app 。在app 目录内,创建一个app.py 文件。我们将在这个文件中为我们的Flask应用程序编写代码。
下面是我们简单的Flask应用程序的代码。
app.py
from flask import Flask # importing the flask class
app = Flask(__name__) # creating an instance of the Flask class
@app.route('/') # The primary url for our application
def hello_world(): # This method returns 'Flask Dockerized', which is displayed in our browser.
return 'Flask Dockerized'
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0') # This statement starts the server on your local machine.
第3步 - 勾勒关键需求
在这一步,我们需要创建一个requirements.txt 文件。它包含了运行我们的应用程序所需的依赖性或包。
为了创建这个文件,我们将使用下面的命令。
pip freeze > requirements.txt
当你打开requirements.txt 文件时,你应该看到以下几行。
click==8.0.1
colorama==0.4.4
Flask==2.0.1
itsdangerous==2.0.1
Jinja2==3.0.1
MarkupSafe==2.0.1
Werkzeug==2.0.1
第4步 - 创建一个Dockerfile
Dockerfile是用来为我们的应用程序创建一个镜像。这个镜像将在任何安装了Docker 的主机或环境中运行。因此,我们的网络应用可以使用一个镜像在任何地方部署。
请注意,每个镜像都会生成一个Dockerfile。在本教程中,我们将只为我们的Flask应用程序构建一个镜像。
touch Dockerfile
我们需要在生成的Dockerfile中包含以下说明和参数。
Dockerfile
FROM python:3.8
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
上面的Dockerfile ,包含了组装我们的镜像所需的命令。
让我们对我们的Dockerfile 中的内容做一个概述。
-
FROM python:3.8- 一个Dockerfile必须以一个 指令开始,其参数是另一个镜像。 指令拉出了python:3.8镜像。FROMFROM -
WORKDIR /app- 它类似于 。它将我们的工作目录设置为 。这将是我们容器的根目录。它运行Docker文件中紧随其后的任何指令,如 , , , , 或 。cd command/appCOPYRUNADDCMDENTRYPOINT -
COPY . /app- 该命令将文件从本地系统复制到Docker镜像上。在我们的例子中,它将把文件从当前文件夹(用 表示)复制到 目录中。./app -
RUN pip install -r requirements.txt- 该命令会安装我们的 文件中定义的所有依赖或包。requirements.txt -
ENTRYPOINT ["python"]- 当镜像作为一个容器运行时,该命令被执行。 -
CMD ["app.py"]- 这条命令指定了容器初始化时要执行的程序或文件。 -
ENTRYPOINT与CMD指令类似,它允许你定义容器启动后将运行的应用程序。无论你在 ,在我们的例子中是 ,都将被附加到 指令中,也就是 。CMDapp.pyENTRYPOINTpython
这里是容器启动时执行的指令。
docker run python app.py
最后一步是构建我们的docker-compose.yml 文件。
第5步 - Docker Compose
Docker Compose是一种用于开发和运行多容器Docker应用程序的强大技术。你可以用Docker Compose配置你的应用程序的服务,使用YAML 文件。
Docker Compose是设置运行多个服务的复杂应用程序的最佳方式。我们只需要创建一个docker-compose.yaml 文件并指定所需的服务。
然后我们可以运行Docker Compose命令,使用下面的代码构建应用程序栈。
docker compose up
打开我们创建的docker-compose.yml 文件,然后添加以下服务。
docker-compose.yml
version: "3.7"
services:
helloworld:
build:
context: ./
ports:
- 5000:5000
让我们迅速对上述命令有一个概述。
-
每个
docker-compose.yml文件必须以你打算使用的version开始,除非使用version 1。版本必须在文件的顶部指定,在这种情况下,version: "3.7"。我们还需要在services section中概述应用程序的服务,如上所示。 -
build: ./选项指定了包含Docker文件的目录的位置。在我们的例子中,该文件在根文件夹中。 -
ports选项使我们能够通过定义的端口(5000:5000)在浏览器上访问我们的应用程序。
第5步 - 构建和测试
在包含docker-compose.yml的同一文件夹中运行以下命令。
docker-compose up
上述命令显示每个容器的输出。
这也可以用下面的命令来实现。
docker-compose up --build
使用上述命令时不需要指定文件名。Docker Compose应该检查当前工作文件夹内是否有docker-compose.yml文件。
你可以导航到http://localhost:5000/ ,访问你的Flask网络应用。
在你的浏览器中应该会显示一个Flask Dockerized 。
在Windows上,使用Ctrl + c 来停止Docker服务。
第6步 - Docker Compose命令
你可以通过执行下面的命令来查看所有Docker Compose命令和参数。
docker-compose
要列出任何正在运行的镜像,使用docker-compose images 命令。
docker-compose ps 命令将列出任何正在运行的容器。我们可以使用 停止所有服务。docker-compose stop
如果你对应用程序做了任何改动,你需要使用docker-compose up --build 命令重建镜像。
总结
本指南介绍了如何构建一个简单的Flask应用程序,并使用Dockerfile和Docker Compose将其容器化。
现在你可以利用这些知识来构建和容器化更强大的应用程序。