容器中的 Python
在本教程中,您将学习如何:
先决条件
-
在您的机器上安装 Docker 并将其添加到系统路径。
-
在 Linux 上,您还应该 为将用于运行 VS Code 的非 root 用户帐户启用 Docker CLI。
-
Docker 扩展。要安装扩展,请打开扩展视图 (⇧⌘X (Windows、Linux Ctrl+Shift+X)),搜索
docker
以筛选结果,然后选择 Microsoft 编写的 Docker 扩展。
创建 Python 项目
如果您还没有 Python 项目,请按照教程 Python 入门 操作。
注意:如果您想容器化一个完整的 Django 或 Flask Web 应用,您可以从以下示例之一开始
注意:对于本教程,请务必使用示例仓库的 tutorial 分支。
验证您的应用正常运行后,您现在可以容器化您的应用程序。
将 Docker 文件添加到项目
-
在 VS Code 中打开项目文件夹。
-
打开 命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并选择 Docker: 添加 Docker 文件到工作区...
-
当提示应用类型时,选择 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 文件,请选择 否。如果您选择 是,您将需要验证
Dockerfile
中wsgi.py
文件的路径,才能成功运行 Compose Up 命令。Compose 通常在一次运行多个容器时使用。 -
有了所有这些信息,Docker 扩展将创建以下文件:
-
一个
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
文件。 -
(可选)向映像添加环境变量
此步骤不是必需的,但包含此步骤是为了帮助您了解如何添加需要在容器环境中设置的环境变量。
Docker 扩展通过使用 IntelliSense 提供自动完成和上下文帮助来帮助您编写 Dockerfile。要查看此功能的实际效果:
-
打开
Dockerfile
。 -
在
EXPOSE
语句下,键入 ⌃Space (Windows、Linux Ctrl+Space) 以触发 IntelliSense 并滚动到ENV
。 -
按 Tab 或 Enter 完成语句,然后将
key
设置为变量的名称,并将value
设置为值。
有关在 Dockerfile 中设置和使用环境变量的更多信息,请参阅 ENV 指令和 Docker 文档中的 环境变量替换 部分。
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: 添加 Docker 文件到工作区... 命令期间,您配置了 Flask 实例的路径,但是,Docker 扩展假设您的 Flask 实例变量名为
app
。如果不是这种情况,您必须更改 Dockerfile 中的变量名。如果您的主模块在根文件夹中,作为一个名为
main.py
的文件,并且 Flask 实例变量名为myapp
,则上面命令中的最后一个参数将是"main:myapp"
。在子文件夹中,参数将是"subfolder1_name.subfolder2_name.main:myapp"
。
构建、运行和调试容器
Docker: 添加 Docker 文件到工作区... 命令会自动创建一个 Docker 启动配置,以在调试模式下构建和运行您的容器。要调试您的 Python 应用容器:
-
导航到包含应用启动代码的文件,并设置断点。
-
导航到 运行和调试,并根据需要选择 Docker: Python - General、Docker: Python - Django 或 Docker: Python - Flask。
-
使用 F5 键开始调试。
- Docker 映像正在构建。
- Docker 容器正在运行。
- python 调试器在断点处停止。
-
单步执行此行一次。
-
准备就绪后,按继续。
Docker 扩展将启动您的浏览器,并随机映射到一个端口。
提示:要修改您的 Docker 构建设置,例如更改映像标记,请导航到
.vscode -> tasks.json
中的dockerBuild
属性下的docker-build
任务。使用文件中的 IntelliSense (⌃Space (Windows、Linux Ctrl+Space)) 以显示所有其他有效指令。
使用 Docker 资源管理器
Docker 资源管理器提供了一个交互式体验,用于检查和管理 Docker 资产,例如容器、映像等。要查看示例:
-
导航到 Docker 资源管理器。
-
在 容器 选项卡中,右键单击您的容器,然后选择 查看日志。
-
输出将显示在终端中。
在 Azure 中构建映像
您可以使用命令 Azure Container Registry: 在 Azure 中构建映像 构建一个映像,然后您可以将其部署到 Azure 应用服务或 Azure 容器应用。
-
安装 Azure Resources 扩展。打开 命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并搜索命令 Azure: 登录。如果您没有 Azure 帐户,您可以注册 免费试用。
-
有两种方法可以调用在 Azure 中构建命令。您可以右键单击 Dockerfile,然后选择 在 Azure 中构建映像。您也可以使用 命令面板 (⇧⌘P (Windows、Linux Ctrl+Shift+P)) 并搜索命令 Azure Container Registry: 在 Azure 中构建映像。
-
选择构建的映像的名称和标记。您将使用它在容器注册表中标识它。
-
选择您要使用的 Azure 订阅。
-
选择现有的 Azure Container Registry,或创建一个新的。当您创建一个新的时,系统会要求您提供名称、资源组、位置以及定价选项(如基本、标准或高级)。您可以在 定价 - Container Registry 中了解这些选项的成本。
-
指定基本操作系统,Linux 或 Windows。此选择必须与 Dockerfile 一致。
构建映像的过程可能需要几分钟。您可以在终端中跟踪进度。如果您遇到错误 (Error: failed to download context.
),请尝试对容器注册表使用 刷新 选项,然后请求另一次构建。在重建之前,手动删除旧映像。
部署到 Azure 应用服务或 Azure 容器应用
容器映像构建完成后,它应该会以您指定的标记出现在容器注册表中。现在它已经构建完成,您可以将其部署到 Azure 应用服务或 Azure 容器应用。Azure 应用服务 扩展建议用于部署到 Azure 应用服务,而 Azure 容器应用 扩展是部署到 Azure 容器应用所必需的。如果您安装了 Azure Tools 扩展包,您可以同时获得两者,该扩展包包含用于各种 Azure 开发场景的工具包。
-
右键单击映像标记,然后选择 部署映像到 Azure 应用服务 或 部署映像到 Azure 容器应用。
-
提供网站的名称。这必须是唯一的名称,对于 Django 应用,它还必须在
settings.py
文件中的ALLOWED_HOSTS
列表中列为有效的主机名。 -
提供资源组、位置和应用服务计划。如果您刚开始使用,可以选择免费计划。
-
映像正在部署;此过程可能需要几分钟。部署完成后,将显示一个带有按钮的通知,您可以使用该按钮访问该站点。您也可以使用站点的地址
{appname}.azurewebsites.net
,其中{appname}
是您在创建时给定的名称。如果一开始不起作用,请在几分钟后重试。最初几次尝试超时或返回错误并不罕见。这只是意味着应用服务尚未准备好接收请求。 -
在应用程序代码中进行一个小的更改,该更改在一个页面上可见,然后保存该文件。
-
使用 Azure 图标打开 资源 视图,然后展开您的订阅节点以查找您在上一步中部署的应用服务。
-
右键单击应用服务节点,然后查看可用的选项。选择 部署到 Web 应用,然后指定您的应用文件夹以进行部署。
当警告这将覆盖之前的部署时,选择 部署 以确认。
这可能需要几分钟;您可以在终端窗口中监视进度。完成后,将提供一个带有站点访问权限的按钮。
使用该按钮并验证您的更改是否反映在站点上。
恭喜您,您已在 VS Code 中使用 Python 创建并部署了一个托管在云端并在 Internet 上运行的网站!
释放资源
在 Azure 门户 中,删除资源组以释放您在本练习中创建的所有资源。
后续步骤
您已完成!现在您的容器已准备就绪,您可能需要: