在 CentOS 上容器化 Python 应用的可执行方案
一 环境准备
- 安装 Docker 引擎(以 CentOS 7/8 为例):
- 安装依赖与仓库:
- 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
- 验证安装:
- sudo docker run --rm hello-world
- 准备应用骨架(示例):
- 应用代码:app.py
- from flask import Flask; app = Flask(name); @app.route(“/”); def h(): return “Hello, CentOS Python”; if name == “main”: app.run(host=“0.0.0.0”, port=5000)
- 依赖清单:requirements.txt
- 说明:也可直接使用官方 python:3.x-slim 镜像构建,体积更小、构建更快;下文提供基于 CentOS 与基于 python 官方镜像 的两种 Dockerfile 示例。
二 构建镜像
- 方式 A 基于 CentOS 官方镜像(系统级可控,体积较大)
- Dockerfile
- FROM centos:7
- ENV PYTHONUNBUFFERED=1
- RUN 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 .
- 方式 B 基于官方 python 镜像(推荐,镜像小、依赖新)
- Dockerfile
- FROM python:3.11-slim
- WORKDIR /app
- COPY requirements.txt .
- RUN pip install --no-cache-dir -r requirements.txt
- COPY . .
- EXPOSE 5000
- CMD [“python”, “app.py”]
- 构建命令:docker build -t my-python-app:slim .
- 构建要点:
- 使用 .dockerignore 忽略 pycache、.pyc、.git、venv、node_modules 等无关文件
- 多阶段构建可用于分离构建依赖与运行环境(进阶)
三 运行与验证
- 运行容器(示例映射 5000 端口):
- 基于 CentOS 镜像:docker run -d --name py-centos -p 5000:5000 my-python-app:centos
- 基于 python 镜像:docker run -d --name py-slim -p 5000:5000 my-python-app:slim
- 验证:
- 本地:curl http://localhost:5000
- 远程:curl http://<服务器IP>:5000
- 常用运维:
- 查看日志:docker logs -f <容器名>
- 进入容器:docker exec -it <容器名> bash
- 停止/启动:docker stop/start <容器名>
- 多服务编排(可选,使用 Docker Compose):
- docker-compose.yml
- version: “3.8”
- services:
- web:
- build: .
- ports: [“5000:5000”]
- db:
- image: postgres:15
- environment:
- POSTGRES_PASSWORD=example
- 启动:docker-compose up -d;验证:curl http://localhost:5000
四 生产级优化与安全建议
- 基础镜像与依赖
- 优先选择 python:3.x-slim 或 alpine;如需系统工具再按需安装,减少攻击面
- 使用可信基础镜像与固定版本号(如 3.11.10-slim),避免浮动版本导致不可预期
- 镜像与运行时安全
- 非 root 运行:在 Dockerfile 中创建非特权用户并切换
- RUN adduser -m -u 1001 app && chown -R 1001:1001 /app
- USER 1001
- 最小权限:仅暴露必要端口;使用 read-only 根文件系统(如可行);禁用调试接口
- 构建与运行优化
- 依赖分层缓存:先复制并安装 requirements.txt,再复制源码,提升构建命中率
- 使用 .dockerignore;多阶段构建减小最终镜像体积
- 资源限制:docker run 加入 --cpus、–memory 限制
- 数据与配置
- 配置与密钥通过 ConfigMap/Secret 或挂载卷注入,避免硬编码
- 日志输出到 stdout/stderr,便于采集与轮转
- 网络与合规
- 仅开放必要端口;如需固定 IP 或自定义网段,使用 Docker 网络(生产谨慎评估)
- 不建议直接在生产禁用 SELinux;如必须调整,遵循最小变更与回滚方案