CentOS 7 上通过 Docker 部署 Flask + crawl4ai 项目
1. 问题背景与环境说明
- 操作系统:CentOS 7(GLIBC 2.17,仅支持较老依赖)
- 项目需求:用 Python + Flask + crawl4ai(底层依赖 Playwright/Node/浏览器)抽取网页内容,接口以 HTTP 提供
- 遇到的问题:
GLIBCXX_3.4.21 not foundGLIBC_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直达。
- 可能是GitLab版本、菜单被收起、语言不同、权限不够,优先手动补全
- 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永远是性价比最高、最通用的解法!