容器中的 Python
在本教程中,您将学习如何
先决条件
-
在您的计算机上安装 Docker 并将其添加到系统路径。
-
在 Linux 上,您还应该为将用于运行 VS Code 的非 root 用户帐户启用 Docker CLI。
-
Docker 扩展。要安装此扩展,请打开“扩展”视图 (⇧⌘X (Windows, Linux Ctrl+Shift+X)),搜索
docker
以筛选结果并选择 Microsoft 创作的 Docker 扩展。
创建 Python 项目
如果您还没有 Python 项目,请按照教程Python 入门进行操作。
注意:如果您想将一个完整的 Django 或 Flask Web 应用容器化,可以从以下示例之一开始
python-sample-vscode-django-tutorial,这是按照Django 教程进行操作的结果
python-sample-vscode-flask-tutorial,这是按照Flask 教程进行操作的结果
注意:对于本教程,请务必使用示例仓库的 tutorial 分支。
验证您的应用正常运行后,您现在可以对应用进行容器化。
向项目添加 Docker 文件
-
在 VS Code 中打开项目文件夹。
-
打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)),然后选择 Docker: Add Docker Files to Workspace...
-
当提示选择应用类型时,选择 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 文件,请选择 No。如果选择 Yes,则需要在
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 中设置和使用环境变量的详细信息,请参阅 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 应用容器
-
导航到包含应用启动代码的文件,并设置一个断点。
-
导航到运行和调试,然后选择相应的 Docker: Python - General、Docker: Python - Django 或 Docker: Python - Flask。
-
使用 F5 键开始调试。
- Docker 镜像正在构建。
- Docker 容器正在运行。
- Python 调试器在断点处停止。
-
单步跳过此行一次。
-
准备好后,按继续。
Docker 扩展将打开您的浏览器,指向一个随机映射的端口
提示:要修改 Docker 构建设置,例如更改镜像标签,请导航到
.vscode -> tasks.json
,查看docker-build
任务中的dockerBuild
属性。使用文件中的 IntelliSense (⌃Space (Windows, Linux Ctrl+Space)) 显示所有其他有效指令。
使用 Docker Explorer
Docker Explorer 提供交互式体验,用于检查和管理 Docker 资产,例如容器、镜像等。要查看示例
-
导航到 Docker Explorer。
-
在容器选项卡中,右键单击您的容器,然后选择查看日志。
-
输出将显示在终端中。
在 Azure 中构建镜像
您可以使用命令 Azure Container Registry: Build Image in Azure 在 Azure 中构建镜像,然后将其部署到 Azure App Service 或 Azure Container Apps。
-
安装Azure Resources 扩展。打开命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)),然后搜索命令 Azure: Sign In。如果您没有 Azure 帐户,可以注册免费试用版。
-
有两种方法可以调用“在 Azure 中构建”命令。您可以右键单击 Dockerfile,然后选择Build Image in Azure。您也可以使用命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 并搜索命令 Azure Container Registry: Build Image in Azure。
-
选择构建镜像的名称和标签。您将使用此信息在容器注册表中识别它。
-
选择要使用的 Azure 订阅。
-
选择现有的 Azure Container Registry,或创建一个新的。创建新的注册表时,您需要提供名称、资源组、位置以及定价选项,例如 Basic、Standard 或 Premium。您可以在定价 - Container Registry 了解这些选项的成本。
-
指定基础 OS,Linux 或 Windows。此选择必须与 Dockerfile 一致。
构建镜像的过程可能需要几分钟。您可以在终端中跟踪进度。如果遇到错误(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 开发场景的一系列工具,则可以获取这两个扩展。
-
右键单击镜像标签,然后选择部署镜像到 Azure App Service 或部署镜像到 Azure Container Apps。
-
提供网站名称。这必须是一个唯一的名称,对于 Django 应用,它还必须在
settings.py
文件中的ALLOWED_HOSTS
列表中作为有效的主机名列出。 -
提供资源组、位置和 App Service 计划。如果您刚开始使用,可以选择免费计划。
-
镜像正在部署;过程可能需要几分钟。部署完成后,会出现一个通知,其中有一个按钮可用于访问该网站。您也可以使用网站地址
{appname}.azurewebsites.net
,其中{appname}
是您创建时提供的名称。如果一开始无法访问,请几分钟后再试。前几次尝试超时或返回错误是很常见的,这只是意味着 App Service 尚未准备好接收请求。 -
对应用代码进行一个在页面上可见的小更改,并保存文件。
-
使用 Azure 图标打开资源视图,然后展开您的订阅节点以找到上一步部署的 App Service。
-
右键单击 App Service 节点,查看可用选项。选择部署到 Web 应用,然后指定您的应用文件夹进行部署。
当收到此操作将覆盖之前部署的警告时,选择部署以确认。
这可能需要几分钟;您可以在终端窗口中监控进度。完成后,会提供一个访问网站的按钮。
使用该按钮并验证您的更改已反映在网站上。
恭喜您,您已在 VS Code 中使用 Python 创建并部署了一个托管在云端并在互联网上实时运行的网站!
释放资源
在Azure 门户中,删除资源组以释放您在此练习期间创建的所有资源。
后续步骤
您已完成!现在您的容器已准备就绪,您可能想要