在爬虫开发与运维中,环境不一致、依赖冲突、迁移繁琐是常见痛点。Docker 通过容器化实现一次打包、随处运行,完美解决这些问题。本文从环境准备到上线运行,带你走完爬虫项目 Docker 化部署全流程。
一、核心概念与准备工作
1. 为什么用 Docker 部署爬虫
- 环境隔离:Python 版本、依赖库、浏览器驱动互不干扰
- 一致性:开发 / 测试 / 生产环境完全一致,避免 "在我电脑能跑"
- 轻量化:比虚拟机更省资源,启动秒级
- 易迁移:打包成镜像,任意服务器一键部署
- 可复用:镜像可版本管理、共享分发
2. 环境准备
- 安装 Docker 与 Docker Compose
- 准备爬虫项目(以 Python+requests/selenium 为例)
- 基础 Linux 命令与 Docker 常用命令
二、爬虫项目结构规范
推荐清晰的项目结构,便于 Dockerfile 构建:
plaintext
spider-project/
├── app/ # 爬虫主代码
│ ├── __init__.py
│ ├── main.py # 入口文件
│ └── utils.py # 工具函数
├── requirements.txt # Python依赖
├── Dockerfile # 构建镜像脚本
├── docker-compose.yml # 多容器编排(可选)
└── .dockerignore # 忽略不必要文件
三、编写 Dockerfile(核心步骤)
1. 基础镜像选择
- 轻量型:
python:3.10-slim(适合 requests、scrapy) - 带浏览器:
python:3.10-bookworm或selenium/standalone-chrome(适合 Selenium)
2. 典型 Dockerfile 示例(Python 通用爬虫)
dockerfile
# 基础镜像
FROM python:3.10-slim
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖(阿里源加速)
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
# 复制项目代码
COPY ./app /app
# 时区设置(避免时间不一致)
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 启动命令
CMD ["python", "main.py"]
3. Selenium 爬虫 Dockerfile(带 Chrome)
dockerfile
FROM python:3.10-slim
# 安装Chrome与驱动
RUN apt-get update && apt-get install -y \
chromium chromium-driver \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY ./app /app
ENV TZ=Asia/Shanghai
CMD ["python", "main.py"]
四、编写依赖文件 requirements.txt
示例:
plaintext
requests>=2.31.0
beautifulsoup4>=4.12.2
lxml>=4.9.3
selenium>=4.15.0 # 如用Selenium则添加
scrapy>=2.11.0 # 如用Scrapy则添加
五、.dockerignore 文件(减少镜像体积)
plaintext
__pycache__
*.pyc
*.pyo
*.pyd
.venv
.git
.gitignore
*.log
.DS_Store
六、构建与运行 Docker 镜像
1. 构建镜像
bash
运行
docker build -t my-spider:v1 .
-t:给镜像打标签(名称:版本).:Dockerfile 所在目录
2. 运行容器
bash
运行
# 前台运行(查看日志)
docker run --rm my-spider:v1
# 后台运行(生产环境)
docker run -d --name spider-container my-spider:v1
3. 常用 Docker 命令
bash
运行
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs -f spider-container
# 停止容器
docker stop spider-container
# 删除容器
docker rm spider-container
# 删除镜像
docker rmi my-spider:v1
七、Docker Compose 编排(推荐)
当爬虫需要配合 Redis、MongoDB、定时任务时,用docker-compose.yml统一管理:
yaml
version: '3'
services:
spider:
build: .
container_name: my-spider
restart: always # 崩溃自动重启
volumes:
- ./app:/app # 本地代码挂载到容器(开发热更新)
environment:
- TZ=Asia/Shanghai
command: python main.py
启动与停止
bash
运行
# 启动
docker-compose up -d
# 停止
docker-compose down
# 查看日志
docker-compose logs -f spider
八、数据持久化与日志
- 数据持久化 :使用
volumes挂载本地目录,避免容器删除数据丢失 - 日志输出 :爬虫日志打印到控制台,通过
docker logs查看 - 存储建议:数据存入 MongoDB/MySQL/Redis,不要存在容器内
九、常见问题与优化
- 网络问题 :容器内无法访问目标网站,检查 DNS 或添加
--network host - 镜像过大 :使用
slim版本、多阶段构建、清理缓存 - 定时爬虫 :配合
cron或 APScheduler,容器后台运行 - IP 封禁:结合代理池,在 Docker 中部署代理服务
- 权限问题:避免用 root 用户运行,降低风险
十、上线部署流程
- 服务器安装 Docker
- 上传项目代码
- 构建镜像 / 拉取私有镜像
- 后台启动容器
- 配置日志与监控
- 设置开机自启