CentOS 7 上通过 Docker 部署 Flask + crawl4ai 项目

338 阅读4分钟

CentOS 7 上通过 Docker 部署 Flask + crawl4ai 项目

1. 问题背景与环境说明

  • 操作系统:CentOS 7(GLIBC 2.17,仅支持较老依赖)
  • 项目需求:用 Python + Flask + crawl4ai(底层依赖 Playwright/Node/浏览器)抽取网页内容,接口以 HTTP 提供
  • 遇到的问题
    • GLIBCXX_3.4.21 not found
    • GLIBC_2.27 not found
    • 导致 Playwright 及相关依赖无法启动

2. Playwright/FastAPI/Python项目依赖GLIBC老化报错问题

  • 主要原因
    Playwright 浏览器驱动程序依赖新版 glibc / libstdc++,而 CentOS 7 自带版本太(2.17),系统包管理难以直接升级。
  • 报错典型
    /lib64/libstdc++.so.6: version 'GLIBCXX_3.4.21' not found
    /lib64/libc.so.6: version 'GLIBC_2.27' not found
    
  • 排查结论
    这种 Python/conda 新环境无法消除的库老化问题,本质是宿主机依赖过老,必须替换为新版系统或用隔离的现代运行环境(容器/Docker)。

3. Docker 解决系统依赖老化的根本问题

  • Docker 提供了与宿主机无关的“沙箱”,镜像内置高版本 glibc 等底层依赖。
  • 不管你的主机多老,用 Docker 都能拉起最新版 Playwright/Python/Flask 环境

4. CentOS 7 换源及安装 Docker 详细步骤

4.1 更换 YUM 源为国内阿里云源

sudo mkdir /etc/yum.repos.d/backup
sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum clean all
sudo yum makecache

建议:先确认 mirrors.aliyun.com 能正常 ping 通,服务器需直连公网。

4.2 安装 Docker 依赖

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 epel-release
sudo yum install -y fuse-overlayfs slirp4netns

4.3 安装 Docker CE

sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

4.4 验证 Docker 安装

sudo docker run hello-world

输出 Hello from Docker! 即标志环境全部OK!


5. 用 Docker 部署 Flask + crawl4ai 服务

5.1 requirements.txt 文件内容

flask
crawl4ai
marshmallow
gunicorn
gevent

5.2 Dockerfile 示例模板

FROM python:3.10-slim

WORKDIR /app
COPY app.py /app/
COPY requirements.txt /app/

RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-cache-dir -r requirements.txt
RUN python -m playwright install --with-deps

EXPOSE 8000

CMD ["gunicorn", "-k", "gevent", "-w", "2", "-b", "0.0.0.0:8000", "app:app"]

5.3 构建并运行容器

docker build -t flask-crawl4ai-app .
docker run -d --name flask-crawl4ai-prod -p 8000:8000 flask-crawl4ai-app

6. 通过 HTTP 接口替换异步本地调用

原本本地异步调用代码
crawl_data = asyncio.run(
    crawl(init_records["url_mapping"], init_records["task_id_map"])
)
新的HTTP调用替换方式
import requests

post_data = {
    "urls_with_ids": init_records["url_mapping"],
    "task_id_map": init_records["task_id_map"],
}
url = "http://172.31.0.7:8000/extract/website"
response = requests.post(url, json=post_data, timeout=60)
if response.status_code == 200:
    crawl_data = response.json()
    if crawl_data:
        _update_records(crawl_data)
else:
    logger.error(
        f"website_task: http接口返回状态异常 {response.status_code},内容: {response.text}"
    )
    update_task_status_to_failed(init_records["task_ids"])

7. Flask 服务生产环境部署 Gunicorn 实践

  • 生产环境务必使用 gunicorn/gevent 或 uvicorn等专用WSGI/ASGI服务器,不要用 Flask 自带开发服务器!
  • Dockerfile 示例里的 CMD 即采用了 gunicorn 方式,适用于高并发、CPU多核环境
  • 支持 docker-compose、Nginx 反代、SSL、环境变量等企业级部署

8. 常用 Docker 运维指令

docker ps                   # 查看正在运行的容器
docker ps -a                # 包括已停止的
docker logs <容器名/ID>     # 查看日志
docker stop <容器名/ID>     # 停止容器
docker exec -it <容器名/ID> bash    # 进入容器shell
docker images               # 查看镜像
docker rm <容器名/ID>       # 删除容器
docker rmi <镜像名/ID>      # 删除镜像

9. 遇到问题的实用排查建议

  • YUM装包失败,优先全量换官方或阿里/清华YUM源(彻底 mv 旧repo再新下repo)。
  • Flask "members"菜单丢失/不可见?
    • 可能是GitLab版本、菜单被收起、语言不同、权限不够,优先手动补全 /-/project_members 的URL直达。
  • Flask服务部署建议始终用gunicorn,不用默认开发服务器。
  • 如遇端口、权限等问题,查容器/主机的防火墙设置、端口是否被监听。

10. 附录:完整 Dockerfile/requirements.txt 模板

Dockerfile

FROM python:3.10-slim

WORKDIR /app
COPY app.py /app/
COPY requirements.txt /app/

RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ --no-cache-dir -r requirements.txt
RUN python -m playwright install --with-deps
EXPOSE 8000

CMD ["gunicorn", "-k", "gevent", "-w", "2", "-b", "0.0.0.0:8000", "app:app"]

requirements.txt

flask
crawl4ai
marshmallow
gunicorn
gevent
requests

总结

本实操指南全面梳理了在老旧 CentOS 7 上科学部署现代 Python/Playwright/Flask 服务的典型流程:问题判断、yum换源、Docker安装、应用打包、服务生产化部署等核心环节,适用于大多数提升旧平台兼容性的企业/团队生产环境。
遇到奇葩依赖问题,上Docker永远是性价比最高、最通用的解法!