容器中的 Python

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

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

前提条件

  • 在你的机器上安装Docker,并将其添加到系统路径中。

  • 在Linux上,你还应该为非root用户账户启用Docker CLI,用于运行VS Code。

  • Container Tools 扩展。要安装扩展,打开扩展视图(⇧⌘X(Windows,Linux Ctrl+Shift+X),搜索容器工具筛选结果并选择由 Microsoft 编写的容器工具扩展。

    选择容器工具扩展

创建一个 Python 项目

如果你还没有Python项目,可以跟着教程“入门Python”学习。

注意:如果你想将完整的 Django 或 Flask 网页应用容器化,可以从以下示例之一开始:

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

验证应用正常运行后,你就可以将应用容器化。

向项目添加 Docker 文件

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

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

    将 Dockerfile 添加到 Python 项目中

  3. 当被提示选择应用类型时,选择 Python: DjangoPython: FlaskPython: General 作为应用类型。本教程将重点介绍 Python 通用情况,同时也会包含 Django 和 Flask 的注释。

  4. 输入应用入口的相对路径。这不包括你起始的 workspace 文件夹。如果你创建了一个 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 文件,请选择“否”。如果你选择“是”,你需要验证路径wsgi.py文件Dockerfile成功运行 Compose Up 命令。组合通常用于同时运行多个容器。

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

    • ADockerfile.如需了解本文件中关于IntelliSense的更多信息,请参阅概述

    • A.dockerignore通过排除不必要的文件和文件夹来减少图像大小,比如.git,.vscode, 和__pycache__.

    • 如果你用的是Docker Compose,一个docker-compose.yml以及docker-compose.debug.yml档案。

    • 如果没有一个,则requirements.txt用于捕捉所有应用依赖的文件。

    重要提示:要使用我们的设置,必须包含 Python 框架(Django/Flask)和 Gunicornrequirements.txt档案。如果虚拟环境/主机已经安装了这些前置条件,并且应该与容器环境相同,确保通过运行来移植应用依赖PIP冻结> requirements.txt在终端里。这会覆盖你当前的状态requirements.txt档案。

(可选)给图片添加一个环境变量

这一步并非必需,但包含它是为了帮助你理解如何添加需要在容器环境中设置的环境变量。

容器工具扩展通过使用 IntelliSense 提供自动补全和上下文帮助,帮助你编写 Dockerfile。查看此功能的实际作:

  1. 打开Dockerfile.

  2. 曝光语句,输入 ⌃Space(Windows,Linux Ctrl+Space以触发 IntelliSense 并滚动到环境环境.

    向 Dockerfile 添加环境变量

  3. TabEnter 键完成语句,然后设置说明将变量命名为价值.

有关在 Dockerfile 中设置和使用环境变量的更多信息,请参见 Docker 文档中的 ENV 指令和环境替换部分。

Gunicorn 对 Django 和 Flask 应用的修改

为了给 Python 网页开发者一个良好的起点,我们选择使用 Gunicorn 作为默认的 Web 服务器。由于它被引用在默认的 Dockerfile 中,因此作为依赖包含在requirements.txt档案。如果你没看到requirements.txt,快跑PIP 安装 Gunicorn然后跑PIP冻结> requirements.txt以重生成requirements.txt档案。

  • Django:要使用 Gunicorn,它必须绑定一个应用程序调用(应用服务器用来与你的代码通信的代码)作为入口。该可调用的声明为wsgi.pyDjango 应用程序的文件。为了实现这种绑定,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他们包裹的归档方式如下:

    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 实例变量已被命名应用. 如果不是这样,你必须在 Dockerfile 中更改变量名。

    如果你的主模块在根目录里,作为一个名为的文件main.py并且有一个Flask实例变量被命名MyApp,上述命令的最后一个参数为“main:myapp”. 在子文件夹中,参数为“subfolder1_name.subfolder2_name.main:myapp”.

构建、运行并调试容器

容器:将 Docker 文件添加到工作区......命令会自动创建一个 Docker 启动配置,以构建并运行你的容器进行调试模式。调试你的 Python 应用容器:

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

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

    选定容器调试配置

  3. 开始用F5键调试。

    • 容器的画面逐渐显现。
    • 集装箱运转。
    • Python 调试器会在断点处停止。
  4. 跨过这条线一次。

  5. 准备好后,按继续。

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

Django 网站上线

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

使用容器浏览器

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

  1. 导航到容器浏览器。

  2. 在“容器”标签中,右键点击你的容器,选择“查看日志”。

    查看集装箱日志

  3. 输出会显示在终端里。

在Azure中构建镜像

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

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

  2. 调用 build in Azure 命令有两种方式。你可以右键点击 Docker 文件,选择 Build Image in Azure。你也可以使用命令面板⇧⌘P(Windows,Linux Ctrl+Shift+P)搜索命令 Azure Container Registry: Build Image in Azure

    调用命令 Build Image in Azure

  3. 选择构建镜像的名称和标签。你可以用这个来在容器注册表中识别它。

    选择构建镜像的名称和标签。

  4. 选择你想使用的Azure订阅。

  5. 选择一个现有的 Azure 容器注册表,或创建一个新的。当你创建新账户时,会被要求提供名称、资源组、地点,以及一个定价选项,比如基础、标准或高级。您可以在“定价 - 集装箱登记处”中了解这些选项的费用。

  6. 请指定基础作系统,Linux还是Windows。这个选择必须与 Dockerfile 保持一致。

    选择构建镜像的基础作系统

构建图像的过程可能需要几分钟。你可以在终端里追踪进度。如果你遇到错误(错误:未能下载上下文。尝试使用容器注册表上的刷新选项,然后请求再构建一个。重建前,手动删除旧镜像。

Deploy to Azure App Service or Azure Container Apps

一旦容器镜像构建完成,它应该会以你指定的标签出现在容器注册表中。既然它已经建成,你可以部署到Azure App Service或Azure容器应用中。Azure App Service 扩展推荐用于部署到 Azure App Service,而 Azure Container Apps 扩展则是部署 Azure Container Apps 的必需。如果你安装了 Azure Tools 扩展包,可以同时获得这两者,该扩展包包含了适用于各种 Azure 开发场景的工具包。

  1. 右键点击image标签,选择“将映像部署到Azure App Service”或“部署到Azure容器应用”。

    Deploy image to Azure App Service

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

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

  4. 映像已部署;这个过程可能需要几分钟。部署后,会弹出通知,并配有按钮,你可以访问该网站。你也可以使用该网站的地址,{appname}.azurewebsites.net其中{appname}是你创建时给出的名字。如果一开始不行,几分钟后再试一次。前几次尝试超时或返回错误的情况并不罕见。这只是说明应用服务还没准备好接收请求。

  5. 对其中一页可见的应用代码做小修改,然后保存文件。

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

  7. 右键点击应用服务节点,查看可用的选项。选择部署到网页应用,然后指定你的应用文件夹来部署它。

    部署到网页应用

    当警告此举会覆盖之前的部署时,选择部署以确认。

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

    浏览网站按钮

    点击按钮确认您的更改已反映在网站上。

恭喜你,你已经用Python在VS Code中创建并部署了一个托管在云端、在线的网站!

释放资源

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

下一步

你完了!现在你的容器已经准备好了,你可能想: