分布式爬蟲往往都需要多個環(huán)境及老,多個進程抽莱,如果手動去管理這些環(huán)境是很費事的,使用Docker集群就能很好地幫你解決這些問題骄恶,讓你的爬蟲管理變得簡單食铐。
- 主節(jié)點安裝Docker
這里主節(jié)點建議大家使用Ubuntu,從節(jié)點隨意僧鲁。
- Ubuntu
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt-get update
apt-get install -y docker-ce
- Centos
yum update -y
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
- 啟動Docker
所用ip為本機公網ip
systemctl start docker --advertise-addr 33.22.11.123
- 新建Manager節(jié)點
docker swarm init
運行后會產生如下結果 docker swarm init.png
從返回結果中保存以下命令
每個Salve節(jié)點都需要使用此命令加入集群
docker swarm join --token SWMTKN-1-u4959x22226d0588888888ep3rnnnnnnnnnccepdmmmmmdu-3d4444444444444444pm68ow 2.3.4.5:2377
如果忘了這條命令可以使用以下命令重置
docker swarm join-token manager
- 查看集群狀態(tài)
你可以看到有一個主節(jié)點在運行
docker node ls
- 創(chuàng)建私有源
- 使用Docker自帶的私有源
# 拉取私有源鏡像
docker pull registry:latest
# 啟動私有源
docker run -d -p 8181:5000 --name registry -v /tmp/registry:/tmp/registry docker.io/registry:latest
# 為此http私有源添加信任
echo '{ "insecure-registries":["33.22.11.123:8181"] }' >> /etc/docker/daemon.json
# 重啟Docker
systemctl restart docker
- 搭建Redis進行測試
參考以下文章進行安裝配置
centos7安裝redis - 知乎 - 編寫腳本往Redis里放入測試數據
import redis
client = redis.Redis(host='33.22.11.123', port=6379)
for i in range(100):
client.lpush('test', '測試數據 {}'.format(i))
- 編寫Dockerfile
from python:3.6
label mantainer='test-spider'
user root
ENV PYTHONUNBUFFERED=0
ENV PYTHONIOENCODING=utf-8
run python3 -m pip install redis
copy spider.py spider.py
cmd python3 spider.py
- 編寫測試爬蟲
import time
import redis
client = redis.Redis(host='33.22.11.123', port=6379)
while True:
data = client.lpop('test')
if data:
print('spider ' + data)
time.sleep(10)
-
構建Docker鏡像
將Dockerfile跟測試爬蟲都放在同一目錄
image.png
docker build -t localhost:8003/spider:0.01 .
- 上傳鏡像到私有云
這里需要特別注意虐呻,由于我們要把這個鏡像上傳到私有源供Slave服務器上面的從節(jié)點下載,所以鏡像的命名方式需要滿足localhost:8003/自定義名字:版本號這樣的格式寞秃。其中的自定義名字和版本號可以根據實際情況進行修改斟叼。在本文的例子中,我由于要模擬一個爬蟲的程序春寿,所以給它取名為spider朗涩,由于是第1次構建,所以版本號用的是0.01绑改。
docker push localhost:8181/spider:0.01
- 新建Salve節(jié)點
yum update -y
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
echo '{ "insecure-registries":["33.22.11.123:8181"] }' >> /etc/docker/daemon.json
systemctl start docker
docker swarm join --token SWMTKN-1-23fg5ptocob5u2oeyh0984444444229990o2fp8ga4sl-5qwkvghtnzbqjnvk5dxqdqym7 33.22.11.123:2377
- 使用3個容器創(chuàng)建spider的服務
--replicas 用來指定開啟的容器數量
但是一般一開始的代碼可能會有不少bug谢床,所以建議先使用1個容器來運行,觀察日志厘线,發(fā)現沒有問題以后再進行擴展识腿。
docker service create --name spider --replicas 3 --network host 45.77.138.242:8003/spider:0.01
14.查看容器的運行狀況
docker service ps spider
- 查看容器運行日志
# 查看指定ID的服務日志
docker service logs -f 容器ID
# 查看所有spider服務的日志
docker service ps spider | grep Running | awk '{print $1}' | xargs -i docker service logs --tail 20 {}
- 橫向擴展
如果你的機器數量小于你開啟的服務數量,將會在1臺機器上開啟多個鏡像
docker service scale spider=10
- 更新爬蟲
- 提交新的鏡像到私有源
docker build -t 33.22.11.123:8003/spider:0.02 .
docker push 33.22.11.123:8181/spider:0.02
- 更新Salve中的鏡像
如果不關閉現有服務直接更新就會依次次更新
# 關閉服務再更新
docker service scale spider=0
docker service update --image 33.22.11.123:8181/spider:0.02 spider
docker service scale spider=10
是不是覺得如果在100臺服務器上安裝Docker造壮,還是很麻煩渡讼?下一章 我們使用Fabric就可以自動化配置Docker集群,讓你解放雙手耳璧。