在 VS Code 中试试

容器中的 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 Docker Files to Workspace...

    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 文件,请选择 No。如果选择 Yes,则需要在 Dockerfile 中验证 wsgi.py 文件的路径,才能成功运行 Compose Up 命令。Compose 通常用于同时运行多个容器。

  7. 根据所有这些信息,Docker 扩展会创建以下文件

    • 一个 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 文件。

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

此步骤不是必需的,但为了帮助您了解如何在容器环境中设置所需的环境变量,故包含此步骤。

Docker 扩展通过使用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: Add Docker Files to Workspace... 命令期间,您配置了 Flask 实例的路径,但是,Docker 扩展假定您的 Flask 实例变量名为 app。如果不是这种情况,则必须更改 Dockerfile 中的变量名。

    如果您的主模块位于根文件夹中,文件名为 main.py,并且 Flask 实例变量名为 myapp,则上述命令中的最后一个参数将是 "main:myapp"。在子文件夹中,参数将是 "subfolder1_name.subfolder2_name.main:myapp"

构建、运行和调试容器

Docker: Add Docker Files to Workspace... 命令会自动创建 Docker 启动配置,以在调试模式下构建并运行容器。要调试您的 Python 应用容器

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

  2. 导航到运行和调试,然后选择相应的 Docker: Python - GeneralDocker: Python - DjangoDocker: Python - Flask

    Selected Docker debug configuration

  3. 使用 F5 键开始调试。

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

  5. 准备好后,按继续。

Docker 扩展将打开您的浏览器,指向一个随机映射的端口

Django website launches

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

使用 Docker Explorer

Docker Explorer 提供交互式体验,用于检查和管理 Docker 资产,例如容器、镜像等。要查看示例

  1. 导航到 Docker Explorer。

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

    Viewing the logs of a container

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

在 Azure 中构建镜像

您可以使用命令 Azure Container Registry: Build Image in Azure 在 Azure 中构建镜像,然后将其部署到 Azure App Service 或 Azure Container Apps。

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

  2. 有两种方法可以调用“在 Azure 中构建”命令。您可以右键单击 Dockerfile,然后选择Build Image in Azure。您也可以使用命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并搜索命令 Azure Container Registry: Build Image in Azure

    Invoke the command Build Image in Azure

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

    Choose the name and tag for the built image.

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

  5. 选择现有的 Azure Container Registry,或创建一个新的。创建新的注册表时,您需要提供名称、资源组、位置以及定价选项,例如 Basic、Standard 或 Premium。您可以在定价 - Container Registry 了解这些选项的成本。

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

    Choose the base OS for the built image

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

部署到 Azure App Service 或 Azure Container Apps

容器镜像构建完成后,应带有您指定的标签出现在 Container Registry 中。构建完成后,您可以将其部署到 Azure App Service 或 Azure Container Apps。Azure App Service 扩展建议用于部署到 Azure App Service,而Azure Container Apps 扩展是部署到 Azure Container Apps 所必需的。如果您安装Azure Tools 扩展包,其中包含用于各种 Azure 开发场景的一系列工具,则可以获取这两个扩展。

  1. 右键单击镜像标签,然后选择部署镜像到 Azure App Service部署镜像到 Azure Container Apps

    Deploy image to Azure App Service

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

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

  4. 镜像正在部署;过程可能需要几分钟。部署完成后,会出现一个通知,其中有一个按钮可用于访问该网站。您也可以使用网站地址 {appname}.azurewebsites.net,其中 {appname} 是您创建时提供的名称。如果一开始无法访问,请几分钟后再试。前几次尝试超时或返回错误是很常见的,这只是意味着 App Service 尚未准备好接收请求。

  5. 对应用代码进行一个在页面上可见的小更改,并保存文件。

  6. 使用 Azure 图标打开资源视图,然后展开您的订阅节点以找到上一步部署的 App Service。

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

    Deploy to Web App

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

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

    Browse website button

    使用该按钮并验证您的更改已反映在网站上。

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

释放资源

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

后续步骤

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