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