既然不想招人,我就把所有的流程都写进 Docker

既然不想招人,我就把所有的流程都写进 Docker。这话说出来,一半是赌气,一半是绝望。团队扩张到第七个人,我他妈每天不是在开会,就是在去开会的路上。张三的代码跑不通李四的环境,王五的测试报告永远和线上对不上。上个星期,就因为一个 Python 依赖版本冲突,三个后端吵了整整一下午,项目直接停摆。我坐在中间,看着他们互相甩锅,脑子里只有一个念头:我当初一个人写爬虫、怼 API、通宵上线的时候,哪有这些破事?招人,本来是为了解放自己,结果招来一堆爹。

所以,去他妈的“团队协作”。我受够了。我要回到那种“一个命令,全球部署”的独狼状态。但这次不是单打独斗,我要用机器来复制无数个我。Docker 就是那个模子。

最开始的想法很简单:把我们现在手头最赚钱的那个“微信小程序裂变监测系统”给容器化。这玩意儿是个缝合怪:一个 Python 爬虫集群负责抓取公开的分享数据,一个 Node.js 中间层做清洗和去重,最后把结果塞进 MySQL 和 Redis,前端用个简单的 Vue 面板展示。之前部署一次,我得在阿里云、腾讯云、还有两个野鸡 VPS 供应商的机器上,重复四遍以下动作:装 Python 3.7、装 Node 环境、配 pip 源、解决该死的 libssl 版本问题、手动改配置文件里的 IP 和数据库密码……一遍下来,半天就没了,还必出幺蛾子。

Dockerfile 是我第一个突破口。我从最脏的 Python 爬虫部分开始写。基础镜像用 alpine,能多小就多小。把 requirements.txt 拷进去,pip install。这里第一个坑就来了:有些包需要编译,alpine 缺这缺那。行,那就先 apk add 一堆 build-base。然后发现爬虫依赖的 lxml 装不上,又得装 libxml2-dev。整个过程就像在玩一个依赖地狱的俄罗斯套娃。但我知道,这套罪只受一次。

镜像建好了,docker-compose.yml 才是灵魂。我把爬虫、Node 服务、MySQL、Redis 全定义成 service。网络用自定义的 bridge,端口映射只开必要的。最关键是环境变量:数据库连接串、Redis 地址、爬取的 API 频率限制阈值,全抽成环境变量。这样,同一套 docker-compose.yml,我只需要在四台 VPS 上分别改一个 .env 文件,然后 docker-compose up -d,完事。

那种感觉,像第一次偷到管理员密码。我在本地笔记本上测试通过,把整个目录 scp 到第一台阿里云机器。ssh 上去,cd 到目录,docker-compose up -d。看着日志刷刷地滚,服务一个一个起来,前后不到三分钟。那一刻,我坐在漆黑的办公室里,对着四块监控屏幕,感觉自己像个邪教头子,在同时给四个分身注入灵魂。

但这还不够。横向扩展呢?我的爬虫是吃 CPU 的大户,需要根据任务队列动态伸缩。Docker Compose 的 scale 命令很初级。于是我开始研究 Docker Swarm。把四台 VPS 组成了一个 swarm 集群,一台 manager,三台 worker。把 docker-compose.yml 升级成了 stack deploy 用的 docker-stack.yml。关键在这里:我把爬虫服务做成了 global mode,并且设置了资源限制(cpus: ‘0.5’, memory: 512M)。这样,Swarm 会自动在每一台 worker 节点上都跑一个爬虫容器实例,并且均匀分配负载。

数据库和 Redis 怎么办?不能每个节点都跑一个,数据会乱。我用 constraints 把 MySQL 和 Redis 服务 pin 到了 manager 节点上,其他节点上的爬虫和 Node 服务通过 overlay 网络去访问。网络通信的延迟有点小损耗,但比起管理四个独立环境的心力交瘁,这损耗可以忽略不计。

现在,我的“自动化盈利工坊”有了技术原型。任何新的、可重复的赚钱流程,我的第一反应不再是“招个人来干”,而是“能不能写成一组 Docker 服务”。招人,你要管他的情绪,付他的工资,担心他离职。而 Docker 容器,它不会抱怨,不会要求加薪,不会在周五下午提交完代码就失联。你只需要给它 CPU 和内存,它就能 24 小时替你干活。

我关掉 VPS 的管理面板。团队里那几个程序员还在为下一个需求的技术方案扯皮。我突然一点也不想参与他们的讨论了。他们维护他们的“事业”,我建造我的“机器军团”。也许这才是管理,或者说,是逃避管理的终极形式。把对人的依赖,降到零。

© 版权声明
THE END
喜欢就支持一下吧
点赞84 分享