容器中的 Python
在本教程中,你将学习如何:
先决条件
-
在你的机器上安装 Docker 并将其添加到系统路径。
-
在 Linux 上,你还应该为将用于运行 VS Code 的非 root 用户账户启用 Docker CLI。
-
Container Tools 扩展。要安装此扩展,请打开“扩展”视图(⇧⌘X (Windows, Linux Ctrl+Shift+X)),搜索
container tools以过滤结果,并选择由 Microsoft 开发的 Container Tools 扩展。
创建 Python 项目
如果你还没有 Python 项目,请按照Python 入门教程进行操作。
注意:如果你想对完整的 Django 或 Flask Web 应用进行容器化,可以从以下示例之一开始:
python-sample-vscode-django-tutorial,这是按照 Django 教程操作的结果。
python-sample-vscode-flask-tutorial,这是按照 Flask 教程操作的结果。
注意:在本教程中,请务必使用示例仓库的 tutorial 分支。
确认应用运行正常后,现在可以对应用程序进行容器化。
向项目添加 Docker 文件
-
在 VS Code 中打开项目文件夹。
-
打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并选择 Containers: Add Docker Files to Workspace...

-
当提示输入应用类型时,选择 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 文件,请选择 No。如果你选择 Yes,则需要验证
Dockerfile中wsgi.py文件的路径,以便成功运行 Compose Up 命令。Compose 通常用于同时运行多个容器的情况。 -
有了这些信息后,Container Tools 扩展会创建以下文件:
-
一个
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文件。 -
(可选)向镜像添加环境变量
此步骤不是必需的,但包含此步骤是为了帮助你理解如何添加需要在容器环境中设置的环境变量。
Container Tools 扩展通过使用 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"]在执行 Containers: Add Docker Files to Workspace... 命令期间,你会配置 Flask 实例的路径,但是,Container Tools 扩展假设你的 Flask 实例变量名为
app。如果不是这种情况,你必须更改 Dockerfile 中的变量名称。如果你的主模块位于根文件夹中,名为
main.py,并且 Flask 实例变量名为myapp,则上述命令中的最后一个参数将为"main:myapp"。在子文件夹中,参数将为"subfolder1_name.subfolder2_name.main:myapp"。
构建、运行和调试容器
Containers: Add Docker Files to Workspace... 命令会自动创建一个 Docker 启动配置,用于在调试模式下构建和运行容器。要调试你的 Python 应用容器:
-
导航到包含应用启动代码的文件,并设置断点。
-
导航到运行和调试,并根据需要选择 Containers: Python - General、Containers: Python - Django 或 Containers: Python - Flask。

-
使用 F5 键开始调试。
- 容器镜像正在构建。
- 容器正在运行。
- Python 调试器在断点处停止。
-
单步跳过该行。
-
准备好后,按“继续”。
Container Tools 扩展会将你的浏览器启动到一个随机映射的端口。

提示:要修改 Docker 构建设置(例如更改镜像标签),请导航到
.vscode -> tasks.json,在docker-build任务下的dockerBuild属性中进行修改。在文件中使用 IntelliSense(⌃Space (Windows, Linux Ctrl+Space))以显示所有其他有效指令。
使用容器资源管理器 (Container Explorer)
容器资源管理器提供了一种交互式体验,用于检查和管理容器资源,如容器、镜像等。查看示例:
-
导航到容器资源管理器。
-
在容器选项卡中,右键单击你的容器并选择 View Logs。

-
输出将显示在终端中。
在 Azure 中构建镜像
你可以使用命令 Azure Container Registry: Build Image in Azure 来构建镜像,然后将其部署到 Azure App Service 或 Azure Container Apps。
-
安装 Azure Resources 扩展。打开命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并搜索命令 Azure: Sign In。如果你没有 Azure 账户,可以注册免费试用。
-
有两种方法可以调用“在 Azure 中构建”命令。你可以右键单击 Dockerfile 并选择 Build Image in Azure。你也可以使用命令面板(⇧⌘P (Windows, Linux Ctrl+Shift+P))并搜索命令 Azure Container Registry: Build Image in Azure。

-
选择构建镜像的名称和标签。你将使用它在容器注册表中进行标识。

-
选择你要使用的 Azure 订阅。
-
选择现有的 Azure 容器注册表,或创建一个新的。创建新的注册表时,系统会要求你提供名称、资源组、位置和定价选项(如基础版、标准版或高级版)。你可以在 定价 - 容器注册表 了解这些选项的费用。
-
指定基础操作系统(Linux 或 Windows)。此选择必须与 Dockerfile 一致。

构建镜像的过程可能需要几分钟。你可以在终端中跟踪进度。如果遇到错误(Error: failed to download context.),请尝试在容器注册表上使用 Refresh 选项,然后请求重新构建。重新构建之前,请手动删除旧镜像。
部署到 Azure App Service 或 Azure Container Apps
容器镜像构建完成后,它应该会出现在带有你指定标签的容器注册表中。构建完成后,你可以将其部署到 Azure App Service 或 Azure Container Apps。建议使用 Azure App Service 扩展进行部署,且部署到 Azure Container Apps 需要 Azure Container Apps 扩展。你可以安装 Azure Tools 扩展包来同时获取这两个扩展,其中包含用于各种 Azure 开发场景的工具包。
-
右键单击镜像标签,选择 Deploy Image to Azure App Service 或 Deploy Image to Azure Container Apps。

-
提供网站名称。这必须是一个唯一的名称,对于 Django 应用,它还必须在
settings.py文件的ALLOWED_HOSTS列表中列为有效主机名。 -
提供资源组、位置和 App Service 计划。如果刚开始,可以选择免费计划。
-
镜像已部署;此过程可能需要几分钟。部署完成后,会出现一个通知,其中包含一个可用于访问该站点的按钮。你也可以使用站点地址
{appname}.azurewebsites.net,其中{appname}是你在创建时指定的名称。如果第一次无法访问,请几分钟后再试。最初几次尝试超时或返回错误并不罕见,这仅意味着 App Service 尚未准备好接收请求。 -
对应用代码中页面可见的部分进行小幅修改,并保存文件。
-
使用 Azure 图标打开资源视图,展开你的订阅节点以找到你在上一步中部署的 App Service。
-
右键单击 App Service 节点并查看可用选项。选择 Deploy to Web App,然后指定要部署的应用文件夹。

当收到警告称这将覆盖之前的部署时,选择 Deploy 以确认。
这可能需要几分钟;你可以在终端窗口中监控进度。完成后,会提供一个访问该站点的按钮。

使用该按钮并验证你的更改是否已反映在站点上。
恭喜!你已经使用 VS Code 中的 Python 创建并部署了一个托管在云端并在线运行的网站!
释放资源
在 Azure 门户中,删除资源组以释放你在本次练习期间创建的所有资源。
后续步骤
你已完成!现在你的容器已准备就绪,你可能想