跳到主要内容

Python 快速开始

本文档介绍从零开始手动将一个 Python 应用容器化,并部署到 CloudBase 云托管的过程。该项目使用 flask 作为应用运行框架,并使用 gunicorn 作为生产环境的 WSGI 服务器。

代码示例:

https://github.com/TencentCloudBase/cloudbase-examples/tree/master/cloudbaserun/python

项目结构

项目根目录下必须包含以下文件:

├── .dockerignore
├── Dockerfile
├── README.md
├── main.py
└── requirements.txt
  • .dockerignore: 用于指定在构建 Docker 镜像时需要排除的文件和目录,通过使用 .dockerignore 文件,可以减少镜像的大小和构建时间。
  • Dockerfile: 是一个文本文件,包含了一系列指令,用于定义如何构建一个 Docker 镜像。通过编写 Dockerfile,可以自动化地创建包含应用程序及其运行环境的镜像,实现环境一致性和快速部署。
  • main.py: 应用服务的启动文件,业务逻辑实现。
  • requirements.txt: 列出了应用所需的 Python 包和版本信息,用于在构建 Docker 镜像时安装依赖。

第 1 步:编写基础应用

创建名为 helloworld-python 的新目录,并进入此目录中:

mkdir helloworld-python
cd helloworld-python

创建名为 main.py 的文件,并将以下代码粘贴到其中:

import os

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
return 'Hello World!'

if __name__ == "__main__":
app.run(debug=True, host='0.0.0.0', port=80)

以上代码会创建一个基本的 Web 服务器,并监听 80 端口。

第 2 步:管理项目依赖

在项目根目录下,创建一个名为 requirements.txt 的文件,并添加以下内容:

Flask==3.1.1
gunicorn==23.0.0

如果您需要其他依赖,请在 requirements.txt 中添加相应的包和版本。

另外你也可以使用 Python 虚拟环境来管理项目依赖,确保项目的依赖不会与系统的其他 Python 包冲突:

  • 创建虚拟环境

    python -m venv env
    source env/bin/activate # 激活虚拟环境
  • 安装依赖并生成 requirements.txt

    pip install Flask gunicorn
    pip freeze > requirements.txt
提示

使用 pip freeze 生成 requirements.txt 文件必须在 python 虚拟环境下进行,否则生成的 requirements.txt 中会包含机器下的所有依赖,可能会导致部署失败。

第 3 步:将应用容器化

在项目根目录下,创建一个名为 Dockerfile 的文件,内容如下:

# 使用官方 Python 轻量级镜像
# https://hub.docker.com/_/python
FROM python:3-alpine

# 容器默认时区为UTC,如需使用上海时间请启用以下时区设置命令
# 设置时区,容器默认时区为UTC
RUN apk add tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo Asia/Shanghai > /etc/timezone

ENV APP_HOME /app
WORKDIR $APP_HOME

# 将本地代码拷贝到容器内
COPY . .

# 设置环境变量
ENV PYTHONUNBUFFERED=1
ENV GUNICORN_WORKERS=1
ENV GUNICORN_THREADS=4
ENV GUNICORN_TIMEOUT=60

# 安装依赖到指定的/install文件夹
# 选用国内镜像源以提高下载速度
RUN pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple && \
pip config set global.trusted-host mirrors.cloud.tencent.com && \
pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt

EXPOSE 80

# 启动 Web 服务
# 如果您的容器实例拥有多个 CPU 核心,我们推荐您把线程数设置为与 CPU 核心数一致
CMD exec gunicorn --bind :80 --workers ${GUNICORN_WORKERS} --threads ${GUNICORN_THREADS} --timeout ${GUNICORN_TIMEOUT} main:app

添加一个 .dockerignore 文件,以从容器映像中排除文件:

Dockerfile
README.md
*.pyc
*.pyo
*.pyd
__pycache__
.pytest_cache
env/

第 4 步(可选):本地构建和运行

如果您本地已经安装了 Docker,可以运行以下命令,在本地构建 Docker 镜像:

docker build -t helloworld-python .

构建成功后,运行 docker images,可以看到构建出的镜像:

REPOSITORY          TAG       IMAGE ID         CREATED            SIZE
helloworld-python latest df1440c18b5c 8 seconds ago 75.9 MB

随后您可以将此镜像上传至您的镜像仓库。

执行以下命令来运行容器:

docker run -p 80:80  helloworld-python

访问 http://localhost,您应该能看到 "Hello World!" 的输出。

第 5 步:部署到 CloudBase 云托管

如果您已经安装了 CloudBase CLI,可以在项目目录下使用以下命令将应用部署到 CloudBase 云托管:

tcb cloudrun deploy

输入环境和服务名称后,CLI 会自动打包应用像并部署到云托管。更多部署方式请参考 部署服务

配置规范

  • 配置一般放到项目目录中,或者使用环境变量配置
  • 服务部署时,在云托管上指定服务的启动端口即可
  • 建议使用环境变量来管理不同环境的配置

最佳实践

  1. 使用虚拟环境管理依赖
  2. 使用国内镜像源加速依赖安装
  3. 合理设置容器时区
  4. 使用 .dockerignore 排除不必要的文件
  5. 使用 gunicorn 作为生产环境的 WSGI 服务器

Python 框架项目示例可以参考: