本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

容器中的Python

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

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

先决条件

创建一个Python项目

如果你还没有一个Python项目,跟随教程开始使用Python.

注意:如果您想将完整的Django或Flask web应用容器化,可以从前述示例之一开始:

注意:对于这个教程,请确保使用示例仓库的教程分支。

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

将Docker文件添加到项目中

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

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

    将Dockerfile添加到Python项目中

  3. 当被提示选择应用类型时,请选择Python: DjangoPython: FlaskPython: 通用作为应用类型。对于本教程,我们将重点讨论Python: 通用的情况,但也包括Django和Flask的注意事项。

  4. 输入应用程序的相对路径入口点。这不包括您开始的的工作区文件夹。如果您创建了一个Python应用程序,你好.py 根据 Python 入门 教程,选择那个。

    Django:选择 管理.py(根文件夹) 或子文件夹名称/管理.py。请参阅官方Django文档

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

    提示:您也可以输入文件夹的路径,只要这个文件夹包含一个__main__.py文件。

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

    Django:默认端口8000。

    Flask:默认端口是5000。

  6. 当提示包含Docker Compose时,选择如果您不希望使用Docker Compose文件。如果您选择,您需要验证您的wsgi.py文件在Dockerfile 运行 Compose Up 命令。Compose 通常在一次运行多个容器时使用。

  7. 有了所有这些信息,Container Tools 扩展将创建以下文件:

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

    • 一个.dockerignore文件以通过排除不需要的文件和文件夹来减少图像大小,例如.git.vscode,和__pycache__输入:.

    • 如果你在使用Docker Compose,一个docker-compose.ymldocker-compose.debug.yml文件。

    • 如果不存在,则创建一个要求.txt用于捕获所有应用依赖项的文件。

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

(可选)在图像中添加环境变量

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

Container Tools 扩展通过使用IntelliSense来帮助您编写Dockerfiles。要查看此功能的演示:

  1. 打开Dockerfile输入:.

  2. 在下面暴露 语句,按 ⌃Space (Windows, Linux Ctrl+Space 触发IntelliSense并滚动到 环境输入:.

    将环境变量添加到Dockerfile

  3. TabEnter 完成语句,然后设置 到变量的名称,并设置输入:.

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

为Django和Flask应用的Gunicorn修改

为了给Python网络开发者一个良好的起点,我们选择使用Gunicorn作为默认的网络服务器。由于它在默认的Dockerfile中被引用,因此作为依赖项包含在要求.txt文件。如果您没有在要求.txt运行使用pip安装gunicorn:pip install gunicorn然后运行pip freeze > requirements.txt重新生成要求.txt文件。

  • Django:要使用Gunicorn,必须将其绑定到一个可调用的应用程序(应用程序服务器用来与您的代码通信的入口点)。这个可调用的函数在wsgi.pyDjango 应用程序的文件。为了实现这种绑定,Dockerfile 的最后一行是:

    命令 ["gunicorn", "--bind", "0.0.0.0:8000", "{workspace_folder_name}.wsgi"]
    

    如果您的项目不遵循Django的默认项目结构(即一个工作区文件夹和一个位于与工作区同名的子文件夹内的wsgi.py文件),您必须在Dockerfile中覆盖Gunicorn入口点以找到正确的wsgi.py文件。

    如果你wsgi.py文件在根文件夹中,上面命令的最后一个参数将是"WSGI"在子文件夹中,参数将是"子文件夹1名称.子文件夹2名称.wsgi"输入:.

  • Flask:要使用 Gunicorn,必须将其绑定到一个可调用的应用程序(应用程序服务器用来与您的代码通信的入口点)。这个可调用的对应于您的创建的Flask实例的文件位置变量名。根据官方Flask文档,用户通常在主模块中或在__init__.py以这种方式将他们的包文件保存:

     flask 导入 Flask
    app = Flask(__name__) # Flask 实例名为 app
    

    为了完成这个绑定,Dockerfile的最后一行是:

    命令 ["gunicorn", "--bind", "0.0.0.0:5000", "{子文件夹}.{模块文件}:app"]
    

    容器:将Docker文件添加到工作区...命令中,您配置了Flask实例的路径,但是,容器工具扩展假定您的Flask实例变量名为应用程序如果不是这种情况,你必须在Dockerfile中更改变量名称。

    如果你的主要模块在根文件夹中作为一个名为的文件main.py有一个名为的Flask实例变量我的应用, 上述命令中的最后一个参数将是"main:myapp"在子文件夹中,参数将是"子文件夹1名称.子文件夹2名称.主程序:myapp"输入:.

构建、运行和调试容器

容器:将Docker文件添加到工作区...命令会自动生成一个Docker启动配置,以在调试模式下构建和运行您的容器。要调试您的Python应用容器:

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

  2. 导航到 运行和调试 并选择 容器:Python - 通用容器:Python - Django容器:Python - Flask,如适用。

    选择的容器调试配置

  3. 开始调试,使用F5键。

    • 容器镜像构建。
    • 容器在运行。
    • Python 调试器在断点处停止。
  4. 跨越这条线一次。

  5. 准备好了,按继续。

Container Tools 扩展将启动您的浏览器到一个随机映射的端口:

Django 网站发布

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

使用容器浏览器

容器探索者提供了一个互动体验,用于检查和管理容器资产,如容器、镜像等。例如:

  1. 导航到容器浏览器。

  2. 在容器标签页中,右键单击您的容器并选择查看日志

    查看容器的日志

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

在 Azure 中构建镜像

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

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

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

    在 Azure 中执行命令构建镜像

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

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

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

  5. 选择一个现有的 Azure 容器注册表,或者创建一个新的。当您创建一个新的时,会被要求提供名称、资源组、位置和定价选项,例如 Basic、Standard 或 Premium。您可以在 定价 - 容器注册表 阅读这些选项的费用。

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

    选择构建映像的基础操作系统

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

部署到 Azure App Service 或 Azure Container Apps

容器镜像构建完成后,它应带有您指定的标签出现在容器注册表中。现在构建完成了,您可以将其部署到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。

    将图像部署到Azure应用服务

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

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

  4. 图像已部署;过程可能需要几分钟。部署完成后,会出现一个通知,其中有一个按钮,您可以用来访问该网站。您也可以使用网站的地址,{appname}.azurewebsites.net哪里{应用名称}是您创建时给它起的名字。如果第一次不成功,请几分钟后再试。前几次尝试超时或返回错误并不罕见。这仅仅意味着应用程序服务尚未准备好接收请求。

  5. 在其中一个页面上更改应用代码中的一个小部分,并保存文件。

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

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

    部署到网页应用

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

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

    浏览网站按钮

    使用按钮并验证您的更改是否在网站上反映出来。

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

释放资源

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

下一步

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