我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我
你知道什么最快乐吗?
每次提交代码,都要等15 分钟流水线构建,原因是你的 Docker 镜像坚持为你——第 17 次——下载半个互联网。
对,那就是我之前的生活。 每一次 commit、每一个 feature branch、每一轮 bug fix:构建慢得像在拖尸体,报错神秘得像在写谜语,容器臃肿得像塞满棉花的行李箱,而我一直有种感觉:我在跟一个黑盒子摔跤,它还不怎么尊重我。
然后你问我:为了什么?
为了跑一个 Node.js 应用 + Redis + PostgreSQL。
说真的,这不是什么火箭科学。
可我当时觉得自己在做“正确的事”。 Docker 本来应该让一切变好:环境隔离、生产一致性、魔法般的扩展性…… 结果我得到的是:复杂度、YAML 疲劳、以及动不动就坏掉的本地环境。
直到有一天,我干了一件很叛逆的事——
我就……不用了。
我把 Docker 从工作流里拔掉了。
世界没有崩。 反而变轻松了。 而且是那种“怎么以前没想到”的轻松。
我用什么替代了 Docker?以及为什么它更好用
这里有句没人爱说但很真实的话:
大多数开发者并不需要 Docker,他们需要的是可复现 + 好文档。
所以我先问自己:我到底在用 Docker 干什么?
然后我一项一项替换——像拔牙一样,但拔完之后爽到想笑。
1)本地开发环境 → direnv + asdf + 一点点脚本
Docker 对我来说是过度工程。我的项目就是一个 monorepo:
React 前端
Node.js API
PostgreSQL
Redis
我现在改用:
asdf:按项目锁 Node / Postgres 版本
direnv:进目录自动加载环境变量
一个统一的dev.sh:一键拉起服务(Postgres 用 Homebrew,Redis 用 brew services,应用直接 npm start)
结果是什么?
零开销。零切换。启动快。人也不暴躁。
2)CI/CD 构建 → 原生 Runner + 简单脚本(别再 Docker-in-Docker 了)
以前我 GitHub Actions 用 Docker,镜像越堆越肥,一个微服务构建要 12 分钟。 十二分钟是什么概念?就是你会开始怀疑人生的那种时间长度。
现在我换成:
GitHub 托管 runner(Linux,Node 直接预装)
干干净净的 shell scripts:npm install、lint、test
不再搞 Docker-in-Docker
不再 push 镜像
不再经历 cache 失效地狱
我的 CI 变成3 分钟。 每一次。 都稳定。 稳定到让我有点不习惯。
3)部署 → Railway / Fly.io / Deno Deploy(我甚至不写 Dockerfile 了)
以前我为了部署写 Dockerfile:先 Heroku,后来又开始卷 Kubernetes。 现在?
Node 应用我用Fly.io:它可以从源码构建
edge 部署我用Deno Deploy:这里压根没有 Docker 的存在感
数据库:Supabase或Neon,托管、快、少折腾
然后你猜怎么着?
它真的就……能用。 那种老派的、朴素的、让人安心的:It Just Works™。
“那生产一致性呢?没有 Docker 你怎么保证?”
对对对,这句话我听得耳朵起茧。
“Docker 可以保证 dev 和 prod 一致!”
问题是——它并不会。
除非你非常严格地锁版本、每次改动都重建镜像、对 base image 更新高度敏感(你并没有),否则你的容器环境也会漂移,而且是那种悄无声息、最阴险的漂移。
我遇到过这种最气人的情况: 容器在我机器上跑得好好的,到了 staging 直接炸。为什么? 因为 base image 更新了。 或者 Alpine 包变了。 或者某个缓存层突然发疯。
我换成源码构建 + 轻量工具之后,生产一致性 bug 反而更少。 原因也很简单:
运动部件更少
版本更清晰
本地环境更透明
真正的问题是:你其实不信任自己的环境
Docker 很容易变成拐杖。 它像创可贴,贴在这些问题上:
文档写得烂
每个人电脑都是“雪花环境”
本地配置不一致
新人 onboarding 像闯关游戏
但这些本质上是流程问题,不是容器问题。
当我把 Docker 砍掉,我被迫做三件事:
把环境搭建写清楚
把工具版本锁干净
把启动脚本做成别人看得懂的东西
结果呢?
团队上手更快。 排错更直接。 部署也更有信心。
我弃用 Docker 后,发生了哪些“真实收益”?
聊点数字,别空谈:
构建时间:12 分钟 → 3 分钟
上手时间:2 小时 → 15 分钟(真的是跑个脚本就能干活)
存储占用:20GB+ 的 Docker volumes → 500MB 以内
心智负担:我终于能理解自己的栈了 不再出现那种:“为什么这个容器连不上那个容器?”的玄学问题
你不需要给 CRUD 应用上 K8s(别把自己当 SRE)
我懂,Docker 听起来很性感。Kubernetes 更像“工程师战袍”。 但实话是:
如果你做的是一个单体 Web 应用 + 数据库, 你大概率只需要:一台服务器 + 一个 cron job。 不是一个集群。
别再跟着 YouTube 教程把 Todo 应用部署到 EKS。 别再假装你的 side project 需要 Helm charts。 如果你连手动配 Nginx 都不想做,那你基本也不需要容器化到那一步。
很多开发者最大的错觉是:
把工具复杂度当成工程高级感。
但复杂不等于聪明。 真正的聪明,是用简单方案解决真实问题。
Docker 没让你的架构更干净。 它只是让它更重、更难解释、更难维护。
什么时候 Docker 真的有用?
我不是说 Docker 是邪恶本体。它在这些场景非常值得:
OS 级沙箱(安全隔离)
多语言/多依赖环境(Go 后端 + Python ML 服务)
基础设施团队需要的生产镜像体系
历史项目的依赖地狱
Playwright 这种需要容器跑无头浏览器的工具链
但如果你只是做:
Node / Rails / Django / Laravel 的常规 Web 应用?
先简单。先清晰。先能跑。
常见问题(FAQ)
Q:开发环境真的不需要 Docker 吗?A:大多数情况不需要。asdf、pyenv、nvm + 脚本,能覆盖 Docker 90% 的价值,还更轻更透明。Docker 是可选项,不是必选项。
Q:团队协作不是更需要 Docker 吗?A:只有当你的文档和流程很差时才更需要。版本锁清楚、脚本写好,团队 onboarding 反而更快。
Q:不用 Docker 能部署吗?A:当然能。Fly.io、Railway、Vercel、Deno Deploy 都可以源码部署,容器不是必需品。
Q:不用 Docker 我该用什么?A:
asdf / nvm / pyenv:版本管理
direnv:环境变量自动加载
shell scripts:可复现与自动化
brew/apt:数据库与服务
源码部署平台:减少中间层
让我工作更轻松的工具清单
asdf—— 通用版本管理
direnv—— 目录级环境变量自动加载
Fly.io—— 源码构建式部署
Railway—— 低配置成本的后端部署
Supabase—— 托管 Postgres + Auth
Neon—— 可扩展 serverless Postgres
你不一定需要容器。 你更需要:清晰、纪律,以及一套你自己真正理解的栈。
最重要的是: 别再为了 DevOps 圈子的“面子”优化。 去为速度、理智、交付优化。
全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。
最后:
CSS终极指南
Vue 设计模式实战指南
20个前端开发者必备的响应式布局
深入React:从基础到最佳实践完整攻略
python 技巧精讲
React Hook 深入浅出
CSS技巧与案例详解
vue2与vue3技巧合集