需求
- 编写了一个scrapy-redis爬虫想要封装在docker中
- 云服务器上架设redis服务,爬虫可以使用redis来调度(服务器同时作为master和slave)
具体实施
云服务器环境准备
操作场景:云服务器
安装redis
-
安装redis服务端并启动(redis-server)
sudo apt-get update sudo apt-get install redis-server nohup redis-server &
-
检测redis是否启动成功(redis-cli)
ps -ef |grep redis
-
redis conf配置修改,bind本地ip和内网段IP
vi /etc/redis/redis.conf
bind 127.0.0.1 10.11.1.100
-
重启redis服务
sudo service redis-server restart
-
使用redis-cli本地连接运行
redis-cli keys *
本地docker镜像安装
操作场景:本地服务器
在爬虫目录下创建Dockerfile
vi Dockerfile
FROM python:2.7-onbuild
RUN pip install -r requirements.txt
ENTRYPOINT ["scrapy"]
CMD ["crawl", "spider1"]
在该目录下创建docker镜像
docker build -t spiderdocker:1 .
docker images查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spiderdocker 1 00d299391ce 2 hours ago 781MB
镜像保存为1.tar,上传到云服务器上
docker save -o 1.tar
scp 1.tar root@云服务器ip:/docker
爬虫镜像导入并启动
操作场景:云服务器
-
镜像导入
docker load < 1.tar
-
正常启动不带参数(默认的为运行spider1爬虫)
docker run spiderdocker:1
-
正常启动带参数(这里表示运行spider2爬虫)
docker run spiderdocker crawl spider2
-
后台启动(默认的为运行spider1爬虫)
docker run -d spiderdocker:1
-
后台启动带参数(这里表示运行spider2爬虫)
docker run -d spiderdocker:1 crawl spider2
-
查看运行的容器
docker ps -a
爬虫镜像启动后,爬虫就会去redis队列消费任务了,此时需要做的就是将爬虫任务投放给redis了
知识点(坑)
- redis配置文件中bind,在云服务器上必须设置为云服务器的内网ip或者0.0.0.0,否则docker中的爬虫无法连接到,至于安全问题,可以通过设置redis用户名密码或者防火墙规则去规避
- 已经生成的docker镜像文件不要随便删除,以方便之后修改完代码重新生成镜像时可以从本地直接拉取