容器中的 Python
在本教程中,你将学习如何
先决条件
-
在你的计算机上安装 Docker 并将其添加到系统路径中。
-
在 Linux 上,你还应该为将用于运行 VS Code 的非 root 用户帐户启用 Docker CLI。
-
容器工具扩展。要安装该扩展,请打开“扩展”视图 (⇧⌘X (Windows、Linux Ctrl+Shift+X)),搜索
container tools
以筛选结果,然后选择由 Microsoft 创作的“容器工具”扩展。
创建 Python 项目
如果你还没有 Python 项目,请按照“Python 入门”教程进行操作。
注意:如果要将完整的 Django 或 Flask Web 应用容器化,可以从以下示例之一开始:
python-sample-vscode-flask-tutorial,这是按照 Flask 教程操作的结果
注意:在本教程中,请务必使用示例存储库的 tutorial 分支。
在验证应用正常运行后,你现在可以将应用程序容器化。
向项目添加 Docker 文件
-
在 VS Code 中打开项目文件夹。
-
打开**命令面板** (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并选择**容器: 将 Docker 文件添加到工作区...**
-
当系统提示你选择应用类型时,请选择 **Python: Django**、**Python: Flask** 或 **Python: General** 作为应用类型。在本教程中,我们将重点介绍 **Python: General** 的情况,但也会包括 Django 和 Flask 的说明。
-
输入应用程序入口点的相对路径。这不包括你开始时所在的工作区文件夹。如果你按照Python 入门教程创建了一个带有
hello.py
的 Python 应用,请选择它。Django:选择
manage.py
(根文件夹)或subfolder_name/manage.py
。请参阅官方 Django 文档。Flask:选择你创建 Flask 实例的路径。请参阅官方 Flask 文档。
提示:你也可以输入文件夹名称的路径,只要该文件夹包含一个
__main__.py
文件。 -
选择端口号。我们建议选择端口 1024 或更高,以减轻以 root 用户身份运行带来的安全问题。任何未使用的端口都可以,但 Django 和 Flask 使用标准的默认端口。
Django:默认端口为 8000。
Flask:默认端口为 5000。
-
当系统提示是否包含 Docker Compose 时,如果你不想要 Docker Compose 文件,请选择**否**。如果你选择**是**,则需要验证
Dockerfile
中wsgi.py
文件的路径,才能成功运行 Compose Up 命令。Compose 通常在同时运行多个容器时使用。 -
有了所有这些信息,容器工具扩展会创建以下文件:
-
一个
Dockerfile
。要了解有关此文件中 IntelliSense 的更多信息,请参阅概述。 -
一个
.dockerignore
文件,通过排除不需要的文件和文件夹(如.git
、.vscode
和__pycache__
)来减小镜像大小。 -
如果你正在使用 Docker Compose,则会有一个
docker-compose.yml
和一个docker-compose.debug.yml
文件。 -
如果尚不存在,则会有一个
requirements.txt
文件,用于捕获所有应用程序依赖项。
重要提示:要使用我们的设置,Python 框架 (Django/Flask) 和 Gunicorn 必须包含在
requirements.txt
文件中。如果虚拟环境/主机上已安装这些必备组件,并且应与容器环境相同,请确保通过在终端中运行pip freeze > requirements.txt
来移植应用程序依赖项。**这将覆盖你当前的requirements.txt
文件。** -
(可选)向镜像添加环境变量
此步骤不是必需的,但包含此步骤是为了帮助你了解如何添加需要在容器环境中设置的环境变量。
容器工具扩展通过使用 IntelliSense 提供自动补全和上下文帮助,帮助你编写 Dockerfile。要查看此功能的实际效果:
-
打开
Dockerfile
。 -
在
EXPOSE
语句下方,键入 ⌃Space (Windows、Linux Ctrl+Space) 来触发 IntelliSense,然后滚动到ENV
。 -
按 Tab 或 Enter 键完成语句,然后将
key
设置为变量名,并设置value
。
有关在 Dockerfile 中设置和使用环境变量的更多信息,请参阅 Docker 文档中的 ENV 指令和环境变量替换部分。
对 Django 和 Flask 应用的 Gunicorn 修改
为了给 Python Web 开发人员一个很好的起点,我们选择使用 Gunicorn 作为默认的 Web 服务器。由于它在默认的 Dockerfile 中被引用,因此它作为依赖项包含在 requirements.txt
文件中。如果你在 requirements.txt
中没有看到它,请运行 pip install gunicorn
,然后运行 pip freeze > requirements.txt
来重新生成 requirements.txt
文件。
-
Django:要使用 Gunicorn,它必须绑定到一个应用程序可调用对象(应用服务器用来与你的代码通信的对象)作为入口点。这个可调用对象在 Django 应用程序的
wsgi.py
文件中声明。为了实现这个绑定,Dockerfile 中的最后一行是:CMD ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
如果你的项目不遵循 Django 的默认项目结构(即一个工作区文件夹和一个位于与工作区同名的子文件夹内的 wsgi.py 文件),你必须在 Dockerfile 中覆盖 Gunicorn 入口点以定位正确的
wsgi.py
文件。如果你的
wsgi.py
文件位于根文件夹中,上述命令中的最后一个参数将是"wsgi"
。在子文件夹中,参数将是"subfolder1_name.subfolder2_name.wsgi"
。 -
Flask:要使用 Gunicorn,它必须绑定到一个应用程序可调用对象(应用服务器用来与你的代码通信的对象)作为入口点。这个可调用对象对应于你创建的 Flask 实例的**文件位置**和**变量名**。根据官方 Flask 文档,用户通常以这种方式在主模块或其包的
__init__.py
文件中创建 Flask 实例:from flask import Flask app = Flask(__name__) # Flask instance named app
为了实现这个绑定,Dockerfile 中的最后一行是:
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "{subfolder}.{module_file}:app"]
在执行 容器: 将 Docker 文件添加到工作区... 命令期间,你配置了 Flask 实例的路径,但是,容器工具扩展假定你的 Flask 实例变量名为
app
。如果不是这种情况,你必须在 Dockerfile 中更改变量名。如果你的主模块在根文件夹中,文件名为
main.py
,并且 Flask 实例变量名为myapp
,则上述命令中的最后一个参数将是"main:myapp"
。在子文件夹中,参数将是"subfolder1_name.subfolder2_name.main:myapp"
。
构建、运行和调试容器
容器: 将 Docker 文件添加到工作区... 命令会自动创建一个 Docker 启动配置,以在调试模式下构建和运行你的容器。要调试你的 Python 应用容器:
-
导航到包含应用启动代码的文件,并设置一个断点。
-
导航到**运行和调试**,并根据情况选择**容器: Python - General**、**容器: Python - Django** 或 **容器: Python - Flask**。
-
使用 F5 键开始调试。
- 容器镜像构建。
- 容器运行。
- Python 调试器在断点处停止。
-
单步跳过此行一次。
-
准备好后,按继续。
容器工具扩展将在浏览器中打开一个随机映射的端口:
提示:要修改你的 Docker 构建设置,例如更改镜像标签,请导航到
.vscode -> tasks.json
下的docker-build
任务中的dockerBuild
属性。在文件中使用 IntelliSense (⌃Space (Windows, Linux Ctrl+Space)) 以显示所有其他有效的指令。
使用容器资源管理器
容器资源管理器提供了一种交互式体验,用于检查和管理容器资产,如容器、镜像等。要查看示例:
-
导航到容器资源管理器。
-
在**容器**选项卡中,右键单击你的容器并选择**查看日志**。
-
输出将显示在终端中。
在 Azure 中构建镜像
你可以使用 **Azure 容器注册表: 在 Azure 中构建镜像** 命令来构建一个镜像,然后可以将其部署到 Azure 应用服务或 Azure 容器应用。
-
安装 Azure 资源扩展。打开**命令面板** (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并搜索命令 **Azure: 登录**。如果你没有 Azure 帐户,可以注册一个免费试用版。
-
有两种方法可以调用在 Azure 中构建的命令。你可以右键单击 Dockerfile,然后选择**在 Azure 中构建镜像**。你也可以使用**命令面板** (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并搜索命令 **Azure 容器注册表: 在 Azure 中构建镜像**。
-
为构建的镜像选择名称和标签。你将使用它来在容器注册表中识别它。
-
选择你要使用的 Azure 订阅。
-
选择一个现有的 Azure 容器注册表,或创建一个新的。创建新的时,系统会要求你提供名称、资源组、位置以及定价选项,如“基本”、“标准”或“高级”。你可以在定价 - 容器注册表中了解这些选项的费用。
-
指定基础操作系统,Linux 或 Windows。此选择必须与 Dockerfile 一致。
构建镜像的过程可能需要几分钟。你可以在终端中跟踪进度。如果遇到错误(Error: failed to download context.
),请尝试在容器注册表上使用**刷新**选项,然后请求另一次构建。在重新构建之前,请手动删除旧镜像。
部署到 Azure 应用服务或 Azure 容器应用
容器镜像构建完成后,它应该会以你指定的标签出现在容器注册表中。现在它已经构建好了,你可以将它部署到 Azure 应用服务或 Azure 容器应用。Azure 应用服务扩展推荐用于部署到 Azure 应用服务,而Azure 容器应用扩展则需要用于部署到 Azure 容器应用。如果你安装了Azure 工具扩展包,你可以同时获得这两个扩展,该扩展包包含了一系列适用于各种 Azure 开发场景的工具。
-
右键单击镜像标签,然后选择**将镜像部署到 Azure 应用服务**或**将镜像部署到 Azure 容器应用**。
-
提供网站的名称。这必须是一个唯一的名称,对于 Django 应用,它还必须在
settings.py
文件的ALLOWED_HOSTS
列表中列为有效的主机名。 -
提供资源组、位置和应用服务计划。如果你刚刚开始,可以选择免费计划。
-
镜像已部署;此过程可能需要几分钟。部署完成后,会出现一个通知,其中有一个按钮可用于访问该网站。你也可以使用该网站的地址
{appname}.azurewebsites.net
,其中{appname}
是你创建时指定的名称。如果一开始不起作用,请几分钟后再试一次。前几次尝试超时或返回错误并不罕见。这只是意味着应用服务尚未准备好接收请求。 -
在应用程序代码中做一个在某个页面上可见的小更改,然后保存文件。
-
使用 Azure 图标打开**资源**视图,并展开订阅节点以找到你在上一步中部署的应用服务。
-
右键单击应用服务节点并查看可用选项。选择**部署到 Web 应用**,然后指定要部署的应用文件夹。
当警告这将覆盖以前的部署时,选择**部署**以确认。
这可能需要几分钟;你可以在终端窗口中监控进度。完成后,会提供一个带有访问站点链接的按钮。
使用该按钮并验证你的更改已反映在网站上。
恭喜,你已经使用 VS Code 中的 Python 创建并部署了一个托管在云端并在互联网上运行的网站!
释放资源
在 Azure 门户中,删除资源组以释放你在本次练习中创建的所有资源。
后续步骤
你已完成!现在你的容器已准备就绪,你可能想