在 CentOS 服务器上落地 Python 容器化,说起来不算复杂,但真要踩准每个节点、避开常见的坑,还是有不少门道。下面从方案选型到生产优化,把关键环节逐一拆开聊。

一 适用场景与方案选型
- CentOS 服务器上给 Python 应用套上容器,目前有两套主流走法:
- 直接拿官方 Python 镜像(比如
python:3.9-slim)——镜像小、构建快、维护省心,适用于绝大多数 Web/API 和数据处理任务。 - 基于
centos:7/8自己装 Python 3 和系统依赖——好处是能用上系统自带库或特定 glibc 版本,适合对底层环境有硬性要求的场景。
- 直接拿官方 Python 镜像(比如
- 这样做的收益很明显:环境一致性、可移植性、弹性扩缩、快速回滚,在 CI/CD 里也能标准化交付,省去“在我机器上明明能跑”的扯皮。
二 在 CentOS 上安装与验证 Docker
- 安装 Docker(以 CentOS 7/8 为例,走 Docker CE 官方仓库):
- 装依赖和仓库
sudo yum update sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 安装引擎和容器运行时
sudo yum install -y docker-ce docker-ce-cli containerd.io - 启动与开机自启
sudo systemctl start docker sudo systemctl enable docker
- 装依赖和仓库
- 验证
如果看到欢迎信息,说明 Docker 已经就绪。sudo docker run hello-world
三 构建与运行 Python 镜像
方案 A 官方 Python 镜像(推荐)
- 目录结构
app.py requirements.txt Dockerfile - Dockerfile 示例
FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . ENV PYTHONUNBUFFERED=1 EXPOSE 5000 CMD ["python", "app.py"] - 构建与运行
docker build -t my-python-app . docker run -d --name my-running-app -p 5000:5000 my-python-app
方案 B 基于 CentOS 镜像
- Dockerfile 示例
FROM centos:7 ENV PYTHONUNBUFFERED=1 RUN yum install -y epel-release && yum install -y python3 python3-pip && yum clean all WORKDIR /app COPY requirements.txt . RUN pip3 install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD ["python3", "app.py"] - 构建与运行
docker build -t my-python-app-centos . docker run -d --name my-running-app-centos -p 5000:5000 my-python-app-centos
要点说明
- 记得加个
.dockerignore文件,把__pycache__、.pyc、.git、虚拟环境等扔进去,既减少镜像层体积,也避免泄露不该带的东西。 - 环境变量
PYTHONUNBUFFERED=1一定要设,否则日志会被缓冲区卡住,排错时非常痛苦。
四 多服务编排与数据库示例
一旦应用依赖数据库或其他服务,手动起容器就有点折腾了。这时候 docker-compose 是最顺手的工具。下面是一个典型的 docker-compose.yml:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
environment:
DATABASE_URL=postgresql://postgres:example@db:5432/mydb
db:
image: postgres
environment:
POSTGRES_PASSWORD=example
volumes:
pg-data:/var/lib/postgresql/data
- 启动、查看日志、关闭:
docker-compose up -d docker-compose logs -f web docker-compose down - 需要注意两点:
- 把数据库这类有状态的服务和 Web 解耦,用服务名(比如
db)做容器间通信,别写死 IP。 - 数据库数据必须挂载卷(
volumes),否则容器一重建数据全丢,这个坑很多人踩过。
- 把数据库这类有状态的服务和 Web 解耦,用服务名(比如
五 生产级优化与安全建议
- 镜像与层优化:多用多阶段构建,把构建依赖和运行环境分开;基础镜像优先选
python:3.x-slim或alpine;把 RUN 指令合并,顺手清理缓存,镜像体积能小不少。 - 运行与弹性:别用 root 跑进程,Dockerfile 里建个普通用户切过去;设置
restart=unless-stopped让容器自己恢复;端口只暴露必要的,别图省事全开。 - 配置与密钥:敏感信息通过环境变量或 Docker Secrets 注入,绝对不要写死在镜像里;开发、预发、生产用不同配置,避免误操作。
- 数据与日志:应用日志一律输出到
stdout/stderr,让容器运行时去收集;有状态数据用卷或外部存储,别往容器可写层里塞。 - 网络与合规:限制容器的网络访问策略,只开放必要端口;定期更新 Python 和系统依赖,及时修补漏洞;CI/CD 里加个镜像扫描门槛,别让有问题的镜像上线。