千家信息网

如何使用Docker Swarm搭建分布式爬虫集群

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,今天小编给大家分享一下如何使用Docker Swarm搭建分布式爬虫集群的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有
千家信息网最后更新 2026年11月02日如何使用Docker Swarm搭建分布式爬虫集群

今天小编给大家分享一下如何使用Docker Swarm搭建分布式爬虫集群的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

2分钟内把一个新爬虫部署到50台服务器上:

docker build -t localhost:8003/spider:0.01 .docker push localhost:8002/spider:0.01docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01

30秒内把爬虫从50台服务器扩展到500台服务器:

docker service scale spider=500

30秒内批量关闭所有服务器上的爬虫:

docker service scale spider=0

1分钟内批量更新所有机器上的爬虫:

docker build -t localhost:8003/spider:0.02 .docker push localhost:8003/spider:0.02docker service update --image 45.77.138.242:8003/spider:0.02 spider

这篇文章不会教你怎么使用docker,所以请确定你有一些docker基础再来看本文。

docker swarm是什么

docker swarm是docker自带的一个集群管理模块。他能够实现docker集群的创建和管理。

环境搭建

本文将会使用3台ubuntu 18.04的服务器来进行演示。这三台服务器安排如下:

master:45.77.138.242

slave-1:199.247.30.74

slave-2:95.179.143.21

docker swarm是基于docker的模块,所以首先要在3台服务器上安装docker。安装完成docker以后,所有的操作都在docker中完成。

在master上安装docker

通过依次执行下面的命令,在master服务器上安装docker

apt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-commoncurl -fssl https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"apt-get updateapt-get install -y docker-ce

创建manager节点

一个docker swarm集群需要manager节点。现在初始化master服务器,作为集群的manager节点。运行下面一条命令。

docker swarm init

运行完成以后,可以看到的返回结果下图所示。

这个返回结果中,给出了一条命令:

复制代码 代码如下:

docker swarm join --token swmtkn-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

这条命令需要在每一个从节点(slave)中执行。现在先把这个命令记录下来。

初始化完成以后,得到一个只有1台服务器的docker 集群。执行如下命令:

docker node ls

可以看到当前这个集群的状态,如下图所示。

创建私有源(可选)

创建私有源并不是一个必需的操作。之所以需要私有源,是因为项目的docker镜像可能会涉及到公司机密,不能上传到dockerhub这种公共平台。如果你的镜像可以公开上传dockerhub,或者你已经有一个可以用的私有镜像源,那么你可以直接使用它们,跳过本小节和下一小节。

私有源本身也是一个docker的镜像,先将拉取下来:

docker pull registry:latest

如下图所示。

现在启动私有源:

复制代码 代码如下:

docker run -d -p 8003:5000 --name registry -v /tmp/registry:/tmp/registry docker.io/registry:latest

如下图所示。

在启动命令中,设置了对外开放的端口为8003端口,所以私有源的地址为:45.77.138.242:8003

提示:

这样搭建的私有源是http方式,并且没有权限验证机制,所以如果对公网开放,你需要再使用防火墙做一下ip白名单,从而保证数据的安全。

允许docker使用可信任的http私有源(可选)

如果你使用上面一个小节的命令搭建了自己的私有源,由于docker默认是不允许使用http方式的私有源的,因此你需要配置docker,让docker信任它。

使用下面命令配置docker:

echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json

然后使用下面这个命令重启docker。

systemctl restart docker

如下图所示。

重启完成以后,manager节点就配置好了。

创建子节点初始化脚本

对于slave服务器来说,只需要做三件事情:

  • 安装docker

  • 加入集群

  • 信任源

从此以后,剩下的事情全部交给docker swarm自己管理,你再也不用ssh登录这个服务器了。

为了简化操作,可以写一个shell脚本来批量运行。在slave-1和slave-2服务器下创建一个 init.sh 文件,其内容如下。

apt-get updateapt-get install -y apt-transport-https ca-certificates curl software-properties-commoncurl -fssl https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"apt-get updateapt-get install -y docker-ceecho '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.jsonsystemctl restart docker docker swarm join --token swmtkn-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

把这个文件设置为可自行文件,并运行:

chmod +x init.sh./init.sh

如下图所示。

等待脚本运行完成以后,你就可以从slave-1和slave-2的ssh上面登出了。以后也不需要再进来了。

回到master服务器,执行下面的命令,来确认现在集群已经有3个节点了:

docker node ls

看到现在集群中已经有3个节点了。如下图所示。

到止为止,最复杂最麻烦的过程已经结束了。剩下的就是体验docker swarm带来的便利了。

创建测试程序

搭建测试redis

由于这里需要模拟一个分布式爬虫的运行效果,所以先使用docker搭建一个临时的redis服务:

在master服务器上执行以下命令:

复制代码 代码如下:

docker run -d --name redis -p 7891:6379 redis --requirepass "kingnameishandsome8877"

这个redis对外使用 7891 端口,密码为 kingnameishandsome8877 ,ip就是master服务器的ip地址。

编写测试程序

编写一个简单的python程序:

import timeimport redisclient = redis.redis(host='45.77.138.242', port='7891', password='kingnameishandsome8877')while true:  data = client.lpop('example:swarm:spider')  if not data:    break  print(f'我现在获取的数据为:{data.decode()}')  time.sleep(10)

这个python每10秒钟从redis中读取一个数,并打印出来。

编写dockerfile

编写dockerfile,基于python3.6的镜像创建我们自己的镜像:

from python:3.6label mantainer='[email protected]'user rootenv pythonunbuffered=0env pythonioencoding=utf-8run python3 -m pip install rediscopy spider.py spider.pycmd python3 spider.py

构建镜像

编写完成dockerfile以后,执行下面的命令,开始构建我们自己的镜像:

docker build -t localhost:8003/spider:0.01 .

这里需要特别注意,由于我们要把这个镜像上传到私有源供slave服务器上面的从节点下载,所以镜像的命名方式需要满足 localhost:8003/自定义名字:版本号 这样的格式。其中的 自定义名字 和 版本号 可以根据实际情况进行修改。在本文的例子中,我由于要模拟一个爬虫的程序,所以给它取名为spider,由于是第1次构建,所以版本号用的是0.01。

整个过程如下图所示。

上传镜像到私有源

镜像构建完成以后,需要把它上传到私有源。此时需要执行命令:

docker push localhost:8003/spider:0.01

如下图所示。

大家记住这个构建和上传的命令,以后每一次更新代码,都需要使用这两条命令。

创建服务

docker swarm上面运行的是一个一个的服务,因此需要使用docker service命令创建服务。

复制代码 代码如下:

docker service create --name spider --network host 45.77.138.242:8003/spider:0.01

这个命令创建了一个名为 spider 的服务。默认运行1个容器。运行情况如下图所示。

当然也可以一创建就用很多容器来运行,此时只需要添加一个 --replicas 参数即可。例如一创建服务就使用50个容器运行:

复制代码 代码如下:

docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01

但是一般一开始的代码可能会有不少bug,所以建议先使用1个容器来运行,观察日志,发现没有问题以后再进行扩展。

回到默认1个容器的情况下,这个容器可能在目前三台机器在的任何一台上面。通过执行下面的命令来观察这一个默认的容器运行情况:

docker service ps spider

如下图所示。

查看节点log

根据上图执行结果,可以看到这个运行中的容器的id为 rusps0ofwids ,那么执行下面的命令动态查看log:

docker service logs -f 容器id

此时就会持续跟踪这一个容器的log。如下图所示。

横向扩展

现在,只有1台服务器运行了一个容器,我想使用3台服务器运行这个爬虫,那么我需要执行一条命令即可:

docker service scale spider=3

运行效果如下图所示。

此时,再一次查看爬虫的运行情况,可以发现三台机器上面会各自运行一个容器。如下图所示。

现在,我们登录slave-1机器上,看看是不是真的有一个任务在运行。如下图所示。

可以看到确实有一个容器在上面运行着。这是docker swarm自动分配过来的。

现在我们使用下面的命令强行把slave-1上面的docker给关了,再来看看效果。

systemctl stop docker

回到master服务器,再次查看爬虫的运行效果,如下图所示。

可以看到,docker swarm探测到slave-1掉线以后,他就会自动重新找个机器启动任务,保证始终有3个任务在运行。在这一次的例子中,docker swarm自动在master机器上启动了2个spider容器。

如果机器性能比较好,甚至可以在3每台机器上面多运行几个容器:

docker service scale spider=10

此时,就会启动10个容器来运行这些爬虫。这10个爬虫之间互相隔离。

如果想让所有爬虫全部停止怎么办?非常简单,一条命令:

docker service scale spider=0

这样所有爬虫就会全部停止。

同时查看多个容器的日志

如果想同时看所有容器怎么办呢?可以使用如下命令查看所有容器的最新的20行日志:

复制代码 代码如下:

docker service ps robot | grep running | awk '{print $1}' | xargs -i docker service logs --tail 20 {}

这样,日志就会按顺序显示出来了。如下图所示。

更新爬虫

如果你的代码做了修改。那么你需要更新爬虫。

先修改代码,重新构建,重新提交新的镜像到私有源中。如下图所示。

接下来需要更新服务中的镜像。更新镜像有两种做法。一种是先把所有爬虫关闭,再更新。

docker service scale spider=0docker service update --image 45.77.138.242:8003/spider:0.02 spiderdocker service scale spider=3

第二种是直接执行更新命令。

docker service update --image 45.77.138.242:8003/spider:0.02 spider

他们的区别在于,直接执行更新命令时,正在运行的容器会一个一个更新。

运行效果如下图所示。

你可以用docker swarm做更多事情

本文使用的是一个模拟爬虫的例子,但是显然,任何可以批量运行的程序都能够用docker swarm来运行,无论你用redis还是celery来通信,无论你是否需要通信,只要能批量运行,就能用docker swarm。

在同一个swarm集群里面,可以运行多个不同的服务,各个服务之间互不影响。真正做到了搭建一次docker swarm集群,然后就再也不用管了,以后的所有操作你都只需要在manager节点所在的这个服务器上面运行。

以上就是"如何使用Docker Swarm搭建分布式爬虫集群"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。

运行 服务 命令 服务器 容器 爬虫 代码 镜像 私有 集群 节点 更新 面的 机器 情况 效果 程序 篇文章 日志 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 重生之互联网科技帝国 互联网科技资迅 互联网与科技发展 科技信息互联网 网络科技有限互联网 合肥互联网科技公司 互联网 科技服务平台 中正互联网科技招聘 衡水科技产业互联网平台 广西拼得多互联网科技有限公司 西藏七维空间互联网科技有限公司 深圳国际航运科技和互联网 苏州铭阳互联网科技有限公司 互联网金融科技名词解释 伍佰万互联网科技怎么赚钱 四川互联网展示科技馆设计 容联科技互联网电商 陕西九四连强互联网科技有限公司 上海万顺科技互联网有限公司招聘 湖南永感互联网科技有限公司 奇酷互联网络科技公司 丰台科技园 互联网 互联网科技公司有哪些 科技类的互联网平台 华中科技有哪些互联网大佬 互联网金融科技名词解释 广州千川互联网科技有限公司 上海互联网科技公司ppt 上海互联网科技园景观
0