閱讀準備
- docker基礎命令,docker-compose基礎
- pyspider基礎
如果您不熟悉上面的內容,可以先網上查閱有關資料。
1. 創建網絡接口
首先,創建一個Driver為bridge
的網絡接口,命名為pyspider
:
docker network create --driver bridge pyspider
說明1: 需要創建該網絡接口的原因是:在下面創建Docker容器的過程中,我們使用了
docker
和docker-compose
分別創建了不同的服務。按正常來說,如果都使用docker-compose
來創建服務會更好;但是這里有些特殊需求,所有就混合使用docker
和docker-compose
來創建服務了。說明2:直接使用
docker
命令創建容器時,容器的默認網絡接口使用的是NAME
為bridge
的接口;而使用docker-compose
時,默認的網絡接口使用的不是NAME
為bridge
的接口,而是根據docker-compose.yml
文件所在目錄命名的網絡接口。如,我的docker-compose.yml
文件在目錄Pyspider
下,則使用docker-compose
時的默認網絡接口就是pyspider_default
。所以,如果我們使用docker
和docker-compose
時,默認的情況下它們屬于不同的子網,網絡不互通,這不是我們想要的。dokcer
和docker-compose
的網絡接口都可以通過參數自定義,從而實現它們的服務的網絡互通,所有我們才自己創建一個網絡接口。-
說明3:
- 可以通過命令
docker network ls
查看已有的網絡接口,如下圖:
docker網絡接口 - 可以通過
docker network inspect bridge
命令查看網絡接口的詳細信息。如NAME
為bridge
的詳細信息如下圖:
查看網絡接口信息
- 可以通過命令
資料: 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地址。
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
開始創建容器服務,如下圖:
所有組件服務創建完成后,訪問:http://localhost:5000,即可看到webui界面。
如果想創建更多的fetcher, result_work, phantomjs容器實例,可以使用:docker-compose scale phantomjs=2 processor=4 result-worker=2
。docker-compose
會自動幫你創建2個phantomjs服務,4個processor服務,2個result-worker服務;haproxy會自動實現負載均衡,如下圖:
最后說明
- redis, mysql, scheudler服務的ip地址需要根據您的容器的ip具體而定。
- 我所使用的系統為MAC,dokcer版本為:Version 17.06.0-ce-mac19 (18663)