Docker和Kubernetes这些技术名词听起来确实很酷,但如果你只是在开发一个简单的单体Web应用加上数据库——比如一台服务器搭配一个定时任务就足够运行了,那真的需要搞容器编排这套复杂的东西吗?
别再跟着YouTube教程把Todo应用部署到EKS上了,也别假装你的个人项目需要Helm Chart这么复杂的配置。如果你连手写Nginx配置都不太熟练,那么盲目追求容器化可能只会让你陷入更多困惑。
当你第17次等待镜像构建,看着CI流水线转上15分钟,难免会开始怀疑这样做的意义。
回想以前,每次代码提交、分支合并或小型修复,都要经历漫长的构建过程、令人头疼的报错排查、不断膨胀的镜像尺寸,以及本地环境那些难以解释的神秘问题。
这一切到底是为了什么?仅仅是为了运行一个使用Node.js、Redis和PostgreSQL的普通Web应用。
这又不是在造火箭。
虽然“最佳实践”总说Docker能带来环境隔离、一致性以及可扩展性,但现实中我们得到的往往是:日益增加的复杂度、永无止境的YAML配置、以及被容器碎片化弄得一团糟的本地环境。
直到有一天,我彻底把Docker从工作流程中移除。
世界并没有崩塌,恰恰相反,一切变得更顺畅了。
用什么替代了Docker
实话实说:大多数开发场景其实并不需要Docker。我们真正需要的是可复现的环境和清晰的文档。
问问自己:我到底用Docker做了什么?然后,一步步用更简单的方案替换掉那些复杂的容器配置。
1) 本地开发环境 → asdf+direnv+ Shell脚本
我的项目采用monorepo结构:
React前端Node.js APIPostgreSQLRedis替代方案:
asdf管理每个项目的Node/Postgres版本direnv自动加载环境变量一个**dev.sh**:brew装Postgres、brew services启Redis、npm start拉起应用
结果:没有容器开销、无需上下文切换、运行飞快。
2) CI/CD构建 → 原生Runner + 简单脚本
以前我的GitHub Actions被Docker镜像拖慢到12分钟。现在:
用GitHub托管Runner(Linux,自带Node)Shell脚本完成npm ci、lint、test不用DinD、不推镜像、不玩缓存黑魔法
CI稳定在3分钟。每一次都一样。
3) 部署 → Railway / Fly.io / Deno Deploy(无Dockerfile)
曾经为Heroku/K8s写Dockerfile。现在:
Fly.io:从源码构建,无需DockerfileDeno Deploy:边缘部署,根本没有Docker这回事数据库用Supabase/Neon:托管、零配置、很快一句话:它就这么顺利运行。
“那开发/生产环境不一致怎么办?”
经常听到这种说法:“Docker保证环境一致性”。但除非你在Dockerfile里死磕版本固定、每次都重建(你大概率不会),容器也会漂移:
基础镜像悄悄更新Alpine包变了某一层缓存抽风切换到源码构建加轻工具后,环境不一致的Bug反而更少了。因为:零部件更少、版本边界更清晰、本地环境更透明。
真正的问题不是Docker,而是你不信任你的环境
Docker成了一个拐杖,用来掩盖这些问题:
糟糕的文档雪花般的环境混乱的本地配置折磨人的入职流程把Docker清理掉后,反而被迫把这些事情做好:
写清楚如何安装/运行版本管理要干净脚本要可读、可维护团队的新人上手更快、调试更轻松、部署更有底气。
自从不用Docker之后,我拿到的实打实收益
构建时间:12分钟 → 3分钟新人入职:2小时 → 15分钟(运行脚本直接开工)磁盘占用:20GB+ Docker卷 → < 500MB认知负担:我终于看懂自己栈里发生了什么,不再调“那个容器连不上这个容器”的谜题你的CRUD应用,不需要K8s
Docker和Kubernetes听起来确实吸引人,但如果你只是开发单体Web应用加上数据库——一台服务器搭配一个定时任务就足够了,不需要集群。
别再跟着YouTube把Todo应用部署到EKS上,也别假装你的个人项目需要Helm Chart。如果你不会手写Nginx配置,那你大概也用不好容器化。
很多人把工具复杂度等同于工程成熟度。复杂≠高级。用简单方案解决实际问题才是真本事。Docker不会让你的架构更“干净”,它常常只是让它变得更重。
什么时候Docker仍然有意义
这里不是说Docker是原罪。它在这些场景很管用:
操作系统级隔离(安全)多语言混合(Go后端 + Python ML)基础设施团队需要生产副本/一致分发史前依赖地狱Playwright之类需要headless浏览器的工具但如果你在做Node/Rails/Django/Laravel的普通Web应用:从简单开始。
常见问题(FAQ)
问:开发一定要用Docker吗?答:不一定。用asdf/nvm/pyenv+Shell脚本,可以覆盖Docker 90%的“环境可复现”价值,而且没有容器开销。
问:团队协作是不是Docker更好?答:只有当你文档很差时才是。把版本、工具、脚本写清楚,不上容器也能更快上手。
问:能不用Docker部署吗?答:当然。Fly.io/Railway/Vercel/Deno Deploy都支持源码部署。
问:Docker的替代是什么?答:
版本管理:asdf/nvm/pyenv环境变量:direnv可复现:Shell脚本服务依赖:系统包管理(brew/apt)部署:源码构建平台这几样工具,确实让我轻松了
asdf:通用版本管理direnv:按目录自动加载.envFly.io:无Dockerfile的源码部署Railway.app:后端一键部署Supabase:托管Postgres + 身份验证Neon:无服务器Postgres,弹性强结尾的重话
你不需要容器。你需要清晰、克制,以及一个你真正理解的技术栈。
更重要的是:别再被DevOps推特的炫技优化、交付速度、心智负担这些概念牵着鼻子走。
