使用Docker分布式部署爬蟲系統Pyspider

閱讀準備

  1. docker基礎命令,docker-compose基礎
  2. pyspider基礎

如果您不熟悉上面的內容,可以先網上查閱有關資料。

1. 創建網絡接口

首先,創建一個Driver為bridge的網絡接口,命名為pyspider
docker network create --driver bridge pyspider

  • 說明1: 需要創建該網絡接口的原因是:在下面創建Docker容器的過程中,我們使用了dockerdocker-compose分別創建了不同的服務。按正常來說,如果都使用docker-compose來創建服務會更好;但是這里有些特殊需求,所有就混合使用dockerdocker-compose來創建服務了。

  • 說明2:直接使用docker命令創建容器時,容器的默認網絡接口使用的是NAMEbridge的接口;而使用docker-compose時,默認的網絡接口使用的不是NAMEbridge的接口,而是根據docker-compose.yml文件所在目錄命名的網絡接口。如,我的docker-compose.yml文件在目錄Pyspider下,則使用docker-compose時的默認網絡接口就是pyspider_default。所以,如果我們使用dockerdocker-compose時,默認的情況下它們屬于不同的子網,網絡不互通,這不是我們想要的。dokcerdocker-compose的網絡接口都可以通過參數自定義,從而實現它們的服務的網絡互通,所有我們才自己創建一個網絡接口。

  • 說明3:

    • 可以通過命令docker network ls查看已有的網絡接口,如下圖:
      docker網絡接口
    • 可以通過docker network inspect bridge命令查看網絡接口的詳細信息。如NAMEbridge的詳細信息如下圖:
      查看網絡接口信息

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

2. 創建Redis服務

運行命令:docker run --network=pyspider --name redis -d -p 6379:6379 redis 創建Redis服務。

  • 說明1:其中,參數--network=pyspider指定使用pyspider網絡接口。我們可以使用docker inspect redis | grep IPA查看該容器的ip地址,如下圖:
    查看容器ip地址

    我們還可以通過docker logs reids查看容器redis的日志輸出,來觀察redis服務是否正常運行。

3. 創建mysql服務

運行: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以創建mysql服務。

  • 說明:
    • 指定網絡接口--network=pyspider
    • -p 3306:3306指定端口號
    • -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的數據文件存儲目錄
    • -e MYSQL_ROOT_PASSWORD=root123指定root賬戶的密碼為root123

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

mysql容器ip地址

4. 創建pyspider的scheduler服務

運行: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

  • 參數說明

    • --network=pyspider指定網絡接口
    • -p 23333:23333指定端口
    • root:root123@172.20.0.2:3306為mysql服務的ip地址,端口,用戶名和密碼
    • redis://172.20.0.3:6379/0為redis服務的配置。
    • 命令運行成功后,可以通過docker logs scheduler查看scheduler服務的運行情況。
  • 查看scheduler的ip地址為:172.20.0.4,方便后邊使用。

  • pyspider分布式部署中,scheduer服務只能創建一個。

5. 使用docker-compose創建pyspider的其它組件

配置文件docker-compose.yml的內容如下:

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使用負載均衡
    links:
      - phantomjs
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # docker-compose v2版本中haproxy需要指定docker socket(MAC系統中)
    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的方式啟動
    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使用負載均衡
    links:
      - fetcher
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock # docker-compose v2版本中haproxy需要指定docker socket(MAC系統中)
    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的對外的端口為5000,可以通過http://localhost:5000訪問webui服務。
    links:
      - 'fetcher-lb:fetcher' # link到其它負載均衡haproxy的服務。
    mem_limit: 256m
    restart: always

networks:
  default:
    external:
      name: pyspider #指定docker-compose的網絡接口為:pyspider;實現和docker run方式創建容器的互通。
  • webui服務說明
    • --fetcher-rpc "http://fetcher/"是以服務名的方式指定webui鏈接到的fetcher服務,因為fetcher實例可以有很多個,我們如果用ip指定就不能起到負載均衡的目的了。
    • --scheduler-rpc "http://172.20.0.4:23333/"是webui直接用ip和port的方式鏈接到scheduler服務,因為scheduler只有一個。
    • command的其它參數可以參考pyspider的文檔:http://docs.pyspider.org/en/latest/
  • haproxy的文檔:https://github.com/docker/dockercloud-haproxy
  • docker-compose的文檔:https://docs.docker.com/compose/

docker-compose.yml文件寫好后,運行docker-compose up(要在docker-compose.yml所在目錄)命令,docker-compose開始創建容器服務,如下圖:

docker-compose up

所有組件服務創建完成后,訪問:http://localhost:5000,即可看到webui界面。

如果想創建更多的fetcher, result_work, phantomjs容器實例,可以使用:docker-compose scale phantomjs=2 processor=4 result-worker=2docker-compose會自動幫你創建2個phantomjs服務,4個processor服務,2個result-worker服務;haproxy會自動實現負載均衡,如下圖:

docker-compose scale

最后說明

  1. redis, mysql, scheudler服務的ip地址需要根據您的容器的ip具體而定。
  2. 我所使用的系統為MAC,dokcer版本為:Version 17.06.0-ce-mac19 (18663)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容