閱讀準(zhǔn)備
- docker基礎(chǔ)命令,docker-compose基礎(chǔ)
- 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ò)程中帖蔓,我們使用了
docker
和docker-compose
分別創(chuàng)建了不同的服務(wù)。按正常來(lái)說(shuō)瞳脓,如果都使用docker-compose
來(lái)創(chuàng)建服務(wù)會(huì)更好塑娇;但是這里有些特殊需求,所有就混合使用docker
和docker-compose
來(lái)創(chuàng)建服務(wù)了劫侧。說(shuō)明2:直接使用
docker
命令創(chuàng)建容器時(shí)埋酬,容器的默認(rèn)網(wǎng)絡(luò)接口使用的是NAME
為bridge
的接口;而使用docker-compose
時(shí)烧栋,默認(rèn)的網(wǎng)絡(luò)接口使用的不是NAME
為bridge
的接口写妥,而是根據(jù)docker-compose.yml
文件所在目錄命名的網(wǎng)絡(luò)接口。如审姓,我的docker-compose.yml
文件在目錄Pyspider
下珍特,則使用docker-compose
時(shí)的默認(rèn)網(wǎng)絡(luò)接口就是pyspider_default
。所以魔吐,如果我們使用docker
和docker-compose
時(shí)扎筒,默認(rèn)的情況下它們屬于不同的子網(wǎng),網(wǎng)絡(luò)不互通酬姆,這不是我們想要的嗜桌。dokcer
和docker-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ò)接口,如下圖:
- 可以通過(guò)
docker network inspect bridge
命令查看網(wǎng)絡(luò)接口的詳細(xì)信息相满。如NAME
為bridge
的詳細(xì)信息如下圖:
- 可以通過(guò)命令
資料: 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地址匿又,如下圖:
我們還可以通過(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
- 指定網(wǎng)絡(luò)接口
用docker inspect pymysql | grep IPA
查看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ù),如下圖:
所有組件服務(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ù)載均衡柔逼,如下圖:
最后說(shuō)明
- redis, mysql, scheudler服務(wù)的ip地址需要根據(jù)您的容器的ip具體而定蒋譬。
- 我所使用的系統(tǒng)為MAC,dokcer版本為:Version 17.06.0-ce-mac19 (18663)