Docker 部署 Python3\.11 Flask爬虫项目 终极稳定教程(解决线程报错/挂载失效/pip报错)

Docker 部署 Python3.11 Flask爬虫项目 终极稳定教程(1ms加速+解决线程报错/挂载失效/pip报错)

一、教程适用场景

  • 系统:CentOS7/8 / Rocky Linux

  • 项目:Python3.11 + Flask + 爬虫 + Matplotlib 绘图

  • 镜像加速:全程使用 1ms.run 国内极速镜像源,解决Docker Hub拉取超时、慢速问题

  • 解决所有历史坑:

    • ✅ 解决 OpenSSL 版本过低、Python编译SSL缺失

    • ✅ 解决 pip 升级 RuntimeError: can't start new thread

    • ✅ 解决 Matplotlib 容器线程报错

    • ✅ 解决 Docker 挂载目录删除重建失效问题

    • ✅ 解决容器线程数、文件句柄上限不足

二、配置 Docker 1ms.run 全局镜像加速(必做)

配置国内极速镜像源,永久解决Docker拉取镜像慢、超时、失败问题,后续所有镜像拉取自动走加速通道。

bash 复制代码
# 创建docker配置目录
mkdir -p /etc/docker

# 写入1ms.run加速源配置
tee /etc/docker/daemon.json <<EOF
{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}
EOF

# 重载配置、重启docker生效
systemctl daemon-reload
systemctl restart docker

验证加速是否生效

bash 复制代码
docker info | grep Mirrors

输出包含 https://docker.1ms.run 即为配置成功。

三、拉取加速版 Python3.11 镜像

通过1ms.run加速拉取官方 python:3.11-slim 镜像,自带完整 SSL,无需手动编译 OpenSSL,彻底避开 CentOS7 编译大坑。

bash 复制代码
# 方式1:全局加速生效后,直接原生拉取(自动走1ms加速)
docker pull python:3.11-slim

# 方式2:临时强制加速拉取(备用,适配特殊网络环境)
docker pull docker.1ms.run/python:3.11-slim

四、彻底删除旧容器(必须执行)

防止旧挂载、旧参数、旧配置残留导致异常

bash 复制代码
docker stop py311_web
docker rm py311_web

五、最终版启动命令(全网最稳配置)

核心优化点:

  • --security-opt seccomp:unconfined:解除Docker线程创建拦截,根治 can't start new thread

  • ulimit 65535:拉高文件句柄、线程进程上限,适配爬虫高并发

  • 内置 Matplotlib 无GUI线程限制,适配Docker无桌面环境,杜绝绘图线程报错

  • 端口 5080 映射,不占用宿主网络,ulimit、安全策略参数正常生效

  • 目录挂载持久化代码,容器删除不丢项目代码与配置

bash 复制代码
docker run -d \
  --name py311_web \
  -p 5080:5080 \
  --security-opt seccomp:unconfined \
  --ulimit nofile=65535:65535 \
  --ulimit nproc=65535:65535 \
  -e MATPLOTLIB_NUM_THREADS=1 \
  -e MPLBACKEND=Agg \
  -v /cnkidow/webcnkidow:/app \
  -w /app \
  python:3.11-slim \
  tail -f /dev/null

六、进入容器

bash 复制代码
docker exec -it py311_web bash

七、容器内初始化环境(一次性配置)

1. 配置国内pip源 + 永久关闭pip进度条(彻底根治pip线程报错)

bash 复制代码
mkdir -p ~/.pip
cat > ~/.pip/pip.conf <<EOF
[global]
progress-bar = off
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

2. 升级pip、安装所有依赖

bash 复制代码
pip install --upgrade pip
pip install -r requirements.txt

八、启动项目

bash 复制代码
python3 run_web.py

访问地址:http://你的服务器IP:5080

九、关键校验命令(确认环境完全正常)

1. 查看线程、文件上限是否生效

bash 复制代码
ulimit -n
ulimit -u

正常输出:65535

2. 校验Python SSL正常

bash 复制代码
python3 -c "import ssl;print(ssl.OPENSSL_VERSION)"

正常输出:新版 OpenSSL(非1.0.2,彻底规避SSL缺失报错)

十、生产稳定启动方式(替换flask自带启动)

开发调试用 python run_web.py,生产环境推荐 gunicorn 稳定运行,适配多线程爬虫业务

bash 复制代码
pip install gunicorn
gunicorn --workers 1 --threads 4 -b 0.0.0.0:5080 run_web:app

十一、重要避坑规范(必看)

1. 挂载目录绝对不要删目录本体

❌ 错误:rm -rf /cnkidow/webcnkidow && mkdir xxx 会导致目录inode变更,容器挂载失效、文件看不见

✅ 正确清空代码:rm -rf /cnkidow/webcnkidow/*(仅清空文件,保留目录本体,挂载不失效)

2. 宿主机修改代码,容器实时生效

挂载模式下,宿主机改代码、改配置、更新静态文件,容器无需重启直接生效。

3. 容器退出、重启不丢数据

只要不执行 docker rm 删除容器,项目代码、Python依赖、配置全部永久保留。

4. 镜像加速永久生效

配置1ms.run全局加速后,后续所有docker pull拉取镜像均自动加速,无需重复配置。

十二、常用运维命令汇总

bash 复制代码
# 查看容器运行状态
docker ps

# 进入容器交互终端
docker exec -it py311_web bash

# 重启容器
docker restart py311_web

# 停止容器
docker stop py311_web

# 查看docker镜像加速配置
docker info | grep Mirrors

十三、防火墙放行端口(必做)

bash 复制代码
firewall-cmd --add-port=5080/tcp --permanent
firewall-cmd --reload
相关推荐
xhaxy2 小时前
docker
docker·容器·eureka
一技安身5 小时前
【信创】Docker‑Compose V2 两种离线部署(独立模式、插件模式)简易教程
java·docker·eureka
千里码aicood7 小时前
Flask-基于图神经网络的谣言检测研究
人工智能·神经网络·flask
鸿观工坊9 小时前
Docker 多阶段构建实践指南
docker
Yan-英杰10 小时前
从“投屏“到“办公“,ToDesk鸿蒙版4.8.0.0补齐远控“进入→处理→离开“全流程
服务器·人工智能·爬虫·机器学习·ai开发工具
深蓝电商API11 小时前
Redis 在分布式爬虫中的作用
redis·分布式·爬虫
大牧师11 小时前
MySQL 学习教程
数据库·sql·mysql·docker·node·全栈·后端数据
天外天-亮12 小时前
docker + window 安装
运维·docker·容器
进击的小菜鸡dd13 小时前
docker 容器的挂载映射关系查看
运维·docker·容器
烂蜻蜓13 小时前
Flask入门教程(三十一):实用函数与类API——全局工具函数速查
后端·python·flask