参加你附近的 ,了解 VS Code 中的 AI 辅助开发。

容器中的 Python

在本教程中,您将学习如何:

  • 创建一个描述简单 Python 容器的 Dockerfile 文件。
  • 构建、运行和验证 DjangoFlask 或通用 Python 应用程序的功能。
  • 调试在容器中运行的应用程序。

先决条件

创建一个 Python 项目

如果您还没有 Python 项目,请按照教程Python 入门进行操作。

注意:如果您想将一个完整的 Django 或 Flask Web 应用程序容器化,您可以从以下示例之一开始:

注意:对于本教程,请务必使用示例存储库的 tutorial 分支。

在验证您的应用程序运行正常后,您现在可以容器化您的应用程序。

向项目添加 Docker 文件

  1. 在 VS Code 中打开项目文件夹。

  2. 打开命令面板⇧⌘P (Windows, Linux Ctrl+Shift+P))并选择容器:向工作区添加 Docker 文件...

    Add Dockerfile to a Python project

  3. 当提示您选择应用程序类型时,选择 Python: DjangoPython: FlaskPython: General 作为应用程序类型。对于本教程,我们将重点关注 Python: General 的情况,但也会包括 Django 和 Flask 的注释。

  4. 输入应用程序入口点的相对路径。这不包括您开始的工作区文件夹。如果您按照Python 入门教程创建了一个带有 hello.py 的 Python 应用程序,请选择该应用程序。

    Django:选择 manage.py(根文件夹)或 subfolder_name/manage.py。请参阅官方 Django 文档

    Flask:选择您创建 Flask 实例的路径。请参阅官方 Flask 文档

    提示:您也可以输入文件夹名称的路径,只要此文件夹包含 __main__.py 文件即可。

  5. 选择端口号。我们建议选择 1024 或更高的端口,以减轻以 root 用户身份运行的安全问题。任何未使用的端口都可以,但 Django 和 Flask 使用标准默认端口。

    Django:默认端口 8000。

    Flask:默认端口 5000。

  6. 当提示您是否包含 Docker Compose 时,如果您不需要 Docker Compose 文件,请选择。如果您选择,您需要验证 Dockerfilewsgi.py 文件的路径,以便成功运行 Compose Up 命令。Compose 通常用于同时运行多个容器。

  7. 有了所有这些信息,容器工具扩展会创建以下文件:

    • 一个 Dockerfile。要了解有关此文件中 IntelliSense 的更多信息,请参阅概述

    • 一个 .dockerignore 文件,通过排除不需要的文件和文件夹(如 .git.vscode__pycache__)来减小镜像大小。

    • 如果您正在使用 Docker Compose,则会生成一个 docker-compose.ymldocker-compose.debug.yml 文件。

    • 如果尚不存在,则会创建一个 requirements.txt 文件,用于捕获所有应用程序依赖项。

    重要提示:要使用我们的设置,Python 框架(Django/Flask)和 Gunicorn 必须包含requirements.txt 文件中。如果虚拟环境/主机已经安装了这些先决条件,并且应该与容器环境相同,请通过在终端中运行 pip freeze > requirements.txt 来确保应用程序依赖项已移植。这将覆盖您当前的 requirements.txt 文件。

(可选)向镜像添加环境变量

此步骤不是必需的,但其目的是帮助您了解如何添加需要在容器环境中设置的环境变量。

容器工具扩展通过使用 IntelliSense 提供自动完成和上下文帮助来帮助您编写 Dockerfile。要查看此功能的操作:

  1. 打开 Dockerfile

  2. EXPOSE 语句下方,键入 ⌃Space (Windows, Linux Ctrl+Space) 以触发 IntelliSense 并滚动到 ENV

    Adding environment variable to Dockerfile

  3. TabEnter 完成语句,然后将 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 应用程序容器:

  1. 导航到包含应用程序启动代码的文件,并设置一个断点。

  2. 导航到运行和调试并选择容器:Python - 通用容器:Python - Django容器:Python - Flask,视情况而定。

    Selected container debug configuration

  3. 使用 F5 键开始调试。

    • 容器镜像正在构建。
    • 容器正在运行。
    • Python 调试器在断点处停止。
  4. 单步执行此行一次。

  5. 准备就绪后,按继续。

容器工具扩展将您的浏览器启动到一个随机映射的端口

Django website launches

提示:要修改您的 Docker 构建设置,例如更改镜像标签,请在 docker-build 任务的 dockerBuild 属性下导航到 .vscode -> tasks.json。在文件中使用 IntelliSense(⌃Space (Windows, Linux Ctrl+Space))以显示所有其他有效指令。

使用容器浏览器

容器浏览器提供交互式体验来检查和管理容器资产,例如容器、镜像等。要查看示例:

  1. 导航到容器浏览器。

  2. 容器选项卡中,右键单击您的容器并选择查看日志

    Viewing the logs of a container

  3. 输出将显示在终端中。

在 Azure 中构建镜像

您可以使用命令Azure 容器注册表:在 Azure 中构建镜像来构建一个镜像,然后您可以将其部署到 Azure 应用服务或 Azure 容器应用。

  1. 安装 Azure 资源扩展。打开命令面板⇧⌘P (Windows, Linux Ctrl+Shift+P))并搜索命令Azure:登录。如果您没有 Azure 帐户,您可以注册免费试用版

  2. 有两种方法可以调用 Azure 中的构建命令。您可以右键单击 Dockerfile,然后选择在 Azure 中构建镜像。您还可以使用命令面板⇧⌘P (Windows, Linux Ctrl+Shift+P))并搜索命令Azure 容器注册表:在 Azure 中构建镜像

    Invoke the command Build Image in Azure

  3. 为构建的镜像选择名称和标签。您将使用它在容器注册表中识别它。

    Choose the name and tag for the built image.

  4. 选择您要使用的 Azure 订阅。

  5. 选择一个现有的 Azure 容器注册表,或创建一个新的。当您创建一个新的注册表时,系统会要求您提供名称、资源组、位置和定价选项,例如基本、标准或高级。您可以在定价 - 容器注册表中了解这些选项的成本。

  6. 指定基础操作系统,Linux 或 Windows。此选择必须与 Dockerfile 一致。

    Choose the base OS for the built image

构建镜像的过程可能需要几分钟。您可以在终端中跟踪进度。如果遇到错误(Error: failed to download context.),请尝试在容器注册表上使用刷新选项,然后请求另一次构建。在重新构建之前,手动删除旧镜像。

部署到 Azure 应用服务或 Azure 容器应用

容器镜像构建完成后,它应该会出现在容器注册表中,带有您指定的标签。现在它已构建完成,您可以将其部署到 Azure 应用服务或 Azure 容器应用。Azure 应用服务扩展推荐用于部署到 Azure 应用服务,Azure 容器应用扩展是部署到 Azure 容器应用所必需的。如果您安装Azure 工具扩展包,您可以获得这两者,其中包含用于各种 Azure 开发场景的工具包。

  1. 右键单击镜像标签并选择部署镜像到 Azure 应用服务部署镜像到 Azure 容器应用

    Deploy image to Azure App Service

  2. 提供网站的名称。这必须是一个唯一的名称,对于 Django 应用程序,它还必须在 settings.py 文件中的 ALLOWED_HOSTS 列表中列为有效的 hostname。

  3. 提供资源组、位置和应用服务计划。如果您刚开始,可以选择免费计划。

  4. 镜像正在部署;该过程可能需要几分钟。部署完成后,会出现一个通知,其中包含一个按钮,您可以使用它访问该站点。您还可以使用站点的地址 {appname}.azurewebsites.net,其中 {appname} 是您创建时给定的名称。如果一开始不起作用,请在几分钟后重试。前几次尝试超时或返回错误并不少见。这只是意味着应用服务尚未准备好接收请求。

  5. 对应用程序代码进行一个小更改,使其在其中一个页面上可见,然后保存文件。

  6. 使用 Azure 图标打开资源视图,并展开您的订阅节点以找到您在上一步中部署的应用服务。

  7. 右键单击应用服务节点并查看可用选项。选择部署到 Web 应用,然后指定您的应用程序文件夹以进行部署。

    Deploy to Web App

    当警告此操作将覆盖以前的部署时,选择部署以确认。

    这可能需要几分钟;您可以在终端窗口中监控进度。完成后,将提供一个访问该站点的按钮。

    Browse website button

    使用该按钮并验证您的更改是否反映在站点上。

恭喜,您已在 VS Code 中使用 Python 创建并部署了一个托管在云端并在互联网上运行的网站!

释放资源

Azure 门户中,删除资源组以释放您在此练习期间创建的所有资源。

后续步骤

你已完成!现在你的容器已准备就绪,你可能想