目錄
- 起點
- 搭建swarm
- 編寫docker-compose.yml
- 部署服務
- 感想
1. 起點
學習爬蟲有一段時間了,使用過Scrapy, 就想試試其它的爬蟲框架,選擇pyspider也是因為想通過pyspider了解一下分布式爬蟲,由于docker技術的成熟,也就順理成章的選擇docker來完成這件事。
2. 搭建swarm
創建節點
創建三個docker machine:
$ docker-machine create --driver virtualbox manager1
$ docker-machine create --driver virtualbox worker1
$ docker-machine create --driver virtualbox worker2
執行如下命令可查看新創建的docker machine, 以及docker machine對用的IP地址
$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
default * virtualbox Running tcp://192.168.99.100:2376 v17.05.0-ce
manager1 - virtualbox Running tcp://192.168.99.101:2376 v17.05.0-ce
worker1 - virtualbox Running tcp://192.168.99.102:2376 v17.05.0-ce
worker2 - virtualbox Running tcp://192.168.99.103:2376 v17.05.0-ce
創建swarm
登陸 manager1:
$ docker-machine ssh manager1
執行如下命令,創建一個新的swarm
docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.101
Swarm initialized: current node (wpf2jcvhhvfosv3c9ac6c50dh) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
192.168.99.101:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
將節點加入swarm
登陸worker1, 將worker1加入swarm:
docker@worker1:~$ docker swarm join \
> --token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
> 192.168.99.101:2377
This node joined a swarm as a worker.
登陸worker2, 將worker2加入swarm:
docker@worker2:~$ docker swarm join \
> --token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
> 192.168.99.101:2377
This node joined a swarm as a worker.
查看當前swarm狀態
docker@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
k926754fhudg5tu51rnlp2fdj worker2 Ready Active
q1seyrwugtdceqd515tmp8ph3 worker1 Ready Active
wpf2jcvhhvfosv3c9ac6c50dh * manager1 Ready Active Leader
至此,三個節點的swarm已經創建完成。
3. 編寫docker-compose.yml
docker-compose.yml請參考
注意事項
- compose file使用version: 3
- 部署多replicas時,不需要使用HAproxy的Load Balance,swarm服務本身自帶VIP,如:
-
command中需要連接其它服務時,配置參數不可寫在文件中,如scheduler需要連接mysql, redis等,不能使用config.json文件
command: -c config.json scheduler
在使用stack deploy時,docker-compose file中 link, depends_on等命令被忽略,具體信息請參考compose file版本3
所有服務使用同一網絡段,如cars
-
如果需要連接遠端mysql, redis修改連接地址即可,如
command: '--taskdb "mysql+taskdb://root:root@10.208.20.94:3306/taskdb" --resultdb "mysql+resultdb://root:root@10.208.20.94:3306/resultdb" --projectdb "mysql+projectdb://root:root@10.208.20.94:3306/projectdb" --message-queue "redis://10.208.20.94:6379/db" webui --max-rate 10 --max-burst 3 --scheduler-rpc "http://scheduler:23333/" --fetcher-rpc "http://fetcher/"'
4. 部署服務
部署
登陸manager1, 執行如下命令:
docker@manager1:~$ docker stack deploy -c docker-compose.yml myspider
注意事項
swarm服務部署沒有嚴格的順序,所以會出現mysql, redis服務啟動較晚,在service部署要設置restart_policy, 如
docker@manager1:~$ docker stack deploy -c docker-compose.yml myspider
Creating network myspider_cars
Creating service myspider_fetcher
Creating service myspider_processor
Creating service myspider_result-worker
Creating service myspider_webui
Creating service myspider_redis
Creating service myspider_mysql
Creating service myspider_scheduler
Creating service myspider_phantomjs
5. 感想
由于本身對swarm stack缺乏經驗,中途一度想放棄swarm, 轉而采用k8s,還好堅持下來,所以也就有了這篇記錄,列出了當前踩的一些坑。