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拉取镜像慢、超时、失败问题,后续所有镜像拉取自动走加速通道。

# 创建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

验证加速是否生效

docker info | grep Mirrors

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

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

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

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

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

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

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

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、安全策略参数正常生效

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

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

六、进入容器

docker exec -it py311_web bash

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

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

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、安装所有依赖

pip install --upgrade pip
pip install -r requirements.txt

八、启动项目

python3 run_web.py

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

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

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

ulimit -n
ulimit -u

正常输出:65535

2. 校验Python SSL正常

python3 -c "import ssl;print(ssl.OPENSSL_VERSION)"

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

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

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

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拉取镜像均自动加速,无需重复配置。

十二、常用运维命令汇总

# 查看容器运行状态
docker ps

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

# 重启容器
docker restart py311_web

# 停止容器
docker stop py311_web

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

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

firewall-cmd --add-port=5080/tcp --permanent
firewall-cmd --reload

更多推荐