使用Docker分布式部署爬蟲(chóng)系統(tǒng)Pyspider

閱讀準(zhǔn)備

  1. docker基礎(chǔ)命令,docker-compose基礎(chǔ)
  2. pyspider基礎(chǔ)

如果您不熟悉上面的內(nèi)容酝惧,可以先網(wǎng)上查閱有關(guān)資料瞎饲。

1. 創(chuàng)建網(wǎng)絡(luò)接口

首先,創(chuàng)建一個(gè)Driver為bridge的網(wǎng)絡(luò)接口乡数,命名為pyspider
docker network create --driver bridge pyspider

  • 說(shuō)明1: 需要?jiǎng)?chuàng)建該網(wǎng)絡(luò)接口的原因是:在下面創(chuàng)建Docker容器的過(guò)程中帖蔓,我們使用了dockerdocker-compose分別創(chuàng)建了不同的服務(wù)。按正常來(lái)說(shuō)瞳脓,如果都使用docker-compose來(lái)創(chuàng)建服務(wù)會(huì)更好塑娇;但是這里有些特殊需求,所有就混合使用dockerdocker-compose來(lái)創(chuàng)建服務(wù)了劫侧。

  • 說(shuō)明2:直接使用docker命令創(chuàng)建容器時(shí)埋酬,容器的默認(rèn)網(wǎng)絡(luò)接口使用的是NAMEbridge的接口;而使用docker-compose時(shí)烧栋,默認(rèn)的網(wǎng)絡(luò)接口使用的不是NAMEbridge的接口写妥,而是根據(jù)docker-compose.yml文件所在目錄命名的網(wǎng)絡(luò)接口。如审姓,我的docker-compose.yml文件在目錄Pyspider下珍特,則使用docker-compose時(shí)的默認(rèn)網(wǎng)絡(luò)接口就是pyspider_default。所以魔吐,如果我們使用dockerdocker-compose時(shí)扎筒,默認(rèn)的情況下它們屬于不同的子網(wǎng),網(wǎng)絡(luò)不互通酬姆,這不是我們想要的嗜桌。dokcerdocker-compose的網(wǎng)絡(luò)接口都可以通過(guò)參數(shù)自定義,從而實(shí)現(xiàn)它們的服務(wù)的網(wǎng)絡(luò)互通辞色,所有我們才自己創(chuàng)建一個(gè)網(wǎng)絡(luò)接口骨宠。

  • 說(shuō)明3:

    • 可以通過(guò)命令docker network ls查看已有的網(wǎng)絡(luò)接口,如下圖:
      docker網(wǎng)絡(luò)接口
    • 可以通過(guò)docker network inspect bridge命令查看網(wǎng)絡(luò)接口的詳細(xì)信息相满。如NAMEbridge的詳細(xì)信息如下圖:
      查看網(wǎng)絡(luò)接口信息

資料: https://docs.docker.com/engine/userguide/networking/

2. 創(chuàng)建Redis服務(wù)

運(yùn)行命令:docker run --network=pyspider --name redis -d -p 6379:6379 redis 創(chuàng)建Redis服務(wù)层亿。

  • 說(shuō)明1:其中,參數(shù)--network=pyspider指定使用pyspider網(wǎng)絡(luò)接口立美。我們可以使用docker inspect redis | grep IPA查看該容器的ip地址匿又,如下圖:
    查看容器ip地址

    我們還可以通過(guò)docker logs reids查看容器redis的日志輸出,來(lái)觀察redis服務(wù)是否正常運(yùn)行悯辙。

3. 創(chuàng)建mysql服務(wù)

運(yùn)行:docker run --network pyspider -p 3306:3306 --name pymysql -v /Users/andy/Pyspider/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /Users/andy/Pyspider/mysql/logs:/logs -v /Users/andy/Pyspider/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root123 -d mysql以創(chuàng)建mysql服務(wù)琳省。

  • 說(shuō)明:
    • 指定網(wǎng)絡(luò)接口--network=pyspider
    • -p 3306:3306指定端口號(hào)
    • -v /Users/andy/Pyspider/mysql/conf/my.cnf:/etc/mysql/my.cnf指定mysql配置文件
    • -v /Users/andy/Pyspider/mysql/logs:/logs指定日志目錄
    • -v /Users/andy/Pyspider/mysql/data:/var/lib/mysql指定mysql的數(shù)據(jù)文件存儲(chǔ)目錄
    • -e MYSQL_ROOT_PASSWORD=root123指定root賬戶的密碼為root123

docker inspect pymysql | grep IPA查看mysql容器的ip地址迎吵。

mysql容器ip地址

4. 創(chuàng)建pyspider的scheduler服務(wù)

運(yùn)行:docker run --network=pyspider --name scheduler -d -p 23333:23333 --restart=always binux/pyspider --taskdb "mysql+taskdb://root:root123@172.20.0.2:3306/taskdb" --resultdb "mysql+projectdb://root:root123@172.20.0.2:3306/resultdb" --projectdb "mysql+projectdb://root:root123@172.20.0.2:3306/projectdb" --message-queue "redis://172.20.0.3:6379/0" scheduler --inqueue-limit 10000 --delete-time 3600

  • 參數(shù)說(shuō)明

    • --network=pyspider指定網(wǎng)絡(luò)接口
    • -p 23333:23333指定端口
    • root:root123@172.20.0.2:3306為mysql服務(wù)的ip地址,端口针贬,用戶名和密碼
    • redis://172.20.0.3:6379/0為redis服務(wù)的配置击费。
    • 命令運(yùn)行成功后,可以通過(guò)docker logs scheduler查看scheduler服務(wù)的運(yùn)行情況桦他。
  • 查看scheduler的ip地址為:172.20.0.4蔫巩,方便后邊使用。

  • pyspider分布式部署中快压,scheduer服務(wù)只能創(chuàng)建一個(gè)圆仔。

5. 使用docker-compose創(chuàng)建pyspider的其它組件

配置文件docker-compose.yml的內(nèi)容如下:

version: '2'
services:
  phantomjs:
    image: 'binux/pyspider:latest'
    command: phantomjs
    cpu_shares: 256
    environment:
      - 'EXCLUDE_PORTS=5000,23333,24444'
    expose:
      - '25555' # 暴露端口25555給link到此service的容器
    mem_limit: 256m
    restart: always

  phantomjs-lb:
    image: 'dockercloud/haproxy:latest' # 使用haproxy使用負(fù)載均衡
    links:
      - phantomjs
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # docker-compose v2版本中haproxy需要指定docker socket(MAC系統(tǒng)中)
    restart: always

  fetcher:
    image: 'binux/pyspider:latest'
    command: '--message-queue "redis://172.20.0.3:6379/0" --phantomjs-proxy "phantomjs:80" fetcher --xmlrpc' # fetcher以rpc的方式啟動(dòng)
    cpu_shares: 256
    environment:
      - 'EXCLUDE_PORTS=5000,25555,23333'
    links:
      - 'phantomjs-lb:phantomjs'
    mem_limit: 256m
    restart: always

  fetcher-lb:
    image: 'dockercloud/haproxy:latest' # 使用haproxy使用負(fù)載均衡
    links:
      - fetcher
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # docker-compose v2版本中haproxy需要指定docker socket(MAC系統(tǒng)中)
    restart: always
    
  processor:
    image: 'binux/pyspider:latest'
    command: '--projectdb "mysql+projectdb://root:root123@172.20.0.2:3306/projectdb" --message-queue "redis://172.20.0.3:6379/0" processor'
    cpu_shares: 256
    mem_limit: 256m
    restart: always
 
  result-worker:
    image: 'binux/pyspider:latest'
    command: '--taskdb "mysql+taskdb://root:root123@172.20.0.2:3306/taskdb"  --projectdb "mysql+projectdb://root:root123@172.20.0.2:3306/projectdb" --resultdb "mysql+resultdb://root:root123@172.20.0.2:3306/resultdb" --message-queue "redis://172.20.0.3:6379/0" result_worker'
    cpu_shares: 256
    mem_limit: 256m
    restart: always
    
  webui:
    image: 'binux/pyspider:latest'
    command: '--taskdb "mysql+taskdb://root:root123@172.20.0.2:3306/taskdb"  --projectdb "mysql+projectdb://root:root123@172.20.0.2:3306/projectdb" --resultdb "mysql+resultdb://root:root123@172.20.0.2:3306/resultdb" --message-queue "redis://172.20.0.3:6379/0" webui --max-rate 0.3 --max-burst 3 --scheduler-rpc "http://172.20.0.4:23333/" --fetcher-rpc "http://fetcher/"'
    cpu_shares: 256
    environment:
      - 'EXCLUDE_PORTS=24444,25555,23333'
    ports:
      - '5000:5000' # webui的對(duì)外的端口為5000,可以通過(guò)http://localhost:5000訪問(wèn)webui服務(wù)蔫劣。
    links:
      - 'fetcher-lb:fetcher' # link到其它負(fù)載均衡haproxy的服務(wù)坪郭。
    mem_limit: 256m
    restart: always

networks:
  default:
    external:
      name: pyspider #指定docker-compose的網(wǎng)絡(luò)接口為:pyspider;實(shí)現(xiàn)和docker run方式創(chuàng)建容器的互通脉幢。
  • webui服務(wù)說(shuō)明
    • --fetcher-rpc "http://fetcher/"是以服務(wù)名的方式指定webui鏈接到的fetcher服務(wù)歪沃,因?yàn)閒etcher實(shí)例可以有很多個(gè),我們?nèi)绻胕p指定就不能起到負(fù)載均衡的目的了嫌松。
    • --scheduler-rpc "http://172.20.0.4:23333/"是webui直接用ip和port的方式鏈接到scheduler服務(wù)沪曙,因?yàn)閟cheduler只有一個(gè)。
    • command的其它參數(shù)可以參考pyspider的文檔:http://docs.pyspider.org/en/latest/
  • haproxy的文檔:https://github.com/docker/dockercloud-haproxy
  • docker-compose的文檔:https://docs.docker.com/compose/

docker-compose.yml文件寫(xiě)好后萎羔,運(yùn)行docker-compose up(要在docker-compose.yml所在目錄)命令液走,docker-compose開(kāi)始創(chuàng)建容器服務(wù),如下圖:

docker-compose up

所有組件服務(wù)創(chuàng)建完成后贾陷,訪問(wèn):http://localhost:5000缘眶,即可看到webui界面。

如果想創(chuàng)建更多的fetcher, result_work, phantomjs容器實(shí)例昵宇,可以使用:docker-compose scale phantomjs=2 processor=4 result-worker=2磅崭。docker-compose會(huì)自動(dòng)幫你創(chuàng)建2個(gè)phantomjs服務(wù),4個(gè)processor服務(wù)瓦哎,2個(gè)result-worker服務(wù);haproxy會(huì)自動(dòng)實(shí)現(xiàn)負(fù)載均衡柔逼,如下圖:

docker-compose scale

最后說(shuō)明

  1. redis, mysql, scheudler服務(wù)的ip地址需要根據(jù)您的容器的ip具體而定蒋譬。
  2. 我所使用的系統(tǒng)為MAC,dokcer版本為:Version 17.06.0-ce-mac19 (18663)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愉适,一起剝皮案震驚了整個(gè)濱河市犯助,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌维咸,老刑警劉巖剂买,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠爽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡瞬哼,警方通過(guò)查閱死者的電腦和手機(jī)婚肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)坐慰,“玉大人较性,你說(shuō)我怎么就攤上這事〗嵴停” “怎么了赞咙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)糟港。 經(jīng)常有香客問(wèn)我攀操,道長(zhǎng),這世上最難降的妖魔是什么秸抚? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任速和,我火速辦了婚禮,結(jié)果婚禮上耸别,老公的妹妹穿的比我還像新娘健芭。我一直安慰自己,他們只是感情好秀姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布慈迈。 她就那樣靜靜地躺著,像睡著了一般省有。 火紅的嫁衣襯著肌膚如雪痒留。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天蠢沿,我揣著相機(jī)與錄音伸头,去河邊找鬼。 笑死舷蟀,一個(gè)胖子當(dāng)著我的面吹牛恤磷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野宜,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扫步,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了匈子?” 一聲冷哼從身側(cè)響起河胎,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虎敦,沒(méi)想到半個(gè)月后游岳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體政敢,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年胚迫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喷户。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晌区,死狀恐怖摩骨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朗若,我是刑警寧澤恼五,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站哭懈,受9級(jí)特大地震影響灾馒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遣总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一睬罗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旭斥,春花似錦容达、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至菇爪,卻和暖如春算芯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凳宙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工熙揍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氏涩。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓届囚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親是尖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖亚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 目錄 起點(diǎn) 搭建swarm 編寫(xiě)docker-compose.yml 部署服務(wù) 感想 1. 起點(diǎn) 學(xué)習(xí)爬蟲(chóng)有一段時(shí)...
    彭金虎閱讀 787評(píng)論 0 1
  • 引言 在上篇使用Scrapy爬取知乎用戶信息我們編寫(xiě)了一個(gè)單機(jī)的爬蟲(chóng),這篇記錄了使用Scrapy-Redis將其重...
    朱曉飛閱讀 6,674評(píng)論 1 24
  • 看看這太陽(yáng)的勢(shì)頭 心里也跟著暖暖的 今天是爸媽鄭州探親旅游回來(lái)的第一天 居然起了個(gè)大早就要去玩 比我更朝氣蓬勃 我...
    chrisgd閱讀 212評(píng)論 0 0
  • 上何鲈遥回英國(guó)后熬了兩個(gè)多月,到了3月底爆袍,迎來(lái)了我第一個(gè)英國(guó)Easter復(fù)活節(jié)假期首繁,這又是國(guó)內(nèi)學(xué)生會(huì)羨慕的地方作郭,感謝耶...
    尤子緣閱讀 451評(píng)論 0 1
  • 最近和妹紙們聊天夹攒,說(shuō)到領(lǐng)導(dǎo)不好伺候,工作上心理壓力太大胁塞,每天都睡不好覺(jué)咏尝。于是大家總結(jié)了幾個(gè)成為好舌頭的不二法則,尤...
    李飯兒飯兒閱讀 402評(píng)論 0 2