使用Docker分布式部署爬蟲系統(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)建一個Driver為bridge的網(wǎng)絡(luò)接口,命名為pyspider
docker network create --driver bridge pyspider

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

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

  • 說明3:

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

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

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

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

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

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

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

運行: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ù)。

  • 說明:
    • 指定網(wǎng)絡(luò)接口--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的數(shù)據(jù)文件存儲目錄
    • -e MYSQL_ROOT_PASSWORD=root123指定root賬戶的密碼為root123

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

mysql容器ip地址

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

運行: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ù)說明

    • --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ù)的配置。
    • 命令運行成功后,可以通過docker logs scheduler查看scheduler服務(wù)的運行情況。
  • 查看scheduler的ip地址為:172.20.0.4,方便后邊使用。

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

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使用負載均衡
    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的方式啟動
    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系統(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的對外的端口為5000,可以通過http://localhost:5000訪問webui服務(wù)。
    links:
      - 'fetcher-lb:fetcher' # link到其它負載均衡haproxy的服務(wù)。
    mem_limit: 256m
    restart: always

networks:
  default:
    external:
      name: pyspider #指定docker-compose的網(wǎng)絡(luò)接口為:pyspider;實現(xiàn)和docker run方式創(chuàng)建容器的互通。
  • webui服務(wù)說明
    • --fetcher-rpc "http://fetcher/"是以服務(wù)名的方式指定webui鏈接到的fetcher服務(wù),因為fetcher實例可以有很多個,我們?nèi)绻胕p指定就不能起到負載均衡的目的了。
    • --scheduler-rpc "http://172.20.0.4:23333/"是webui直接用ip和port的方式鏈接到scheduler服務(wù),因為scheduler只有一個。
    • 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文件寫好后,運行docker-compose up(要在docker-compose.yml所在目錄)命令,docker-compose開始創(chuàng)建容器服務(wù),如下圖:

docker-compose up

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

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

docker-compose scale

最后說明

  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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容