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