我把 Docker 全刪了,結(jié)果一切都變簡單了
你真的需要 Docker 嗎?
等鏡像第 17 次把“半個互聯(lián)網(wǎng)”拉到本地,CI 流水線等 15 分鐘,你就會開始懷疑人生。
以前每個提交、每個分支、每個小修復,都會經(jīng)歷:構(gòu)建慢、報錯玄學、鏡像臃腫、本地環(huán)境神秘失靈。
為了啥?跑個 Node.js + Redis + PostgreSQL 的普通 Web 應用。
這又不是造火箭。
“最佳實踐”說 Docker 能帶來隔離、環(huán)境一致性、可擴展。我得到的卻是:復雜度、YAML 疲勞、破碎的本地環(huán)境。
直到有一天,把 Docker 從工作流里連根拔掉。
世界沒有崩塌。反而更順了。
用什么替代了 Docker
大實話:大多數(shù)開發(fā)不需要 Docker。你真正需要的是可復現(xiàn)和好文檔。
問自己:我到底用 Docker 干了什么? 然后,一張鏡像一張鏡像地替換掉。
1) 本地開發(fā)環(huán)境 → asdf + direnv + Shell 腳本
我的項目是 monorepo:
- React 前端
- Node.js API
- PostgreSQL
- Redis
替代方案:
- asdf 管理每個項目的 Node/Postgres 版本
- direnv 自動加載環(huán)境變量
- 一個 **
dev.sh**:brew裝 Postgres、brew services啟 Redis、npm start拉起應用
結(jié)果:無容器開銷、無上下文切換、飛快。
2) CI/CD 構(gòu)建 → 原生 Runner + 樸素腳本
以前我的 GitHub Actions 被 Docker 鏡像拖到 12 分鐘。 現(xiàn)在:
- 用 GitHub 托管 Runner(Linux,自帶 Node)
- Shell 腳本完成
npm ci、lint、test - 不用 DinD、不推鏡像、不玩緩存黑魔法
CI 固定 3 分鐘。每一次都一樣。
3) 部署 → Railway / Fly.io / Deno Deploy(無 Dockerfile)
曾給 Heroku/K8s 寫 Dockerfile。現(xiàn)在:
- Fly.io:從源碼構(gòu)建,無需 Dockerfile
- Deno Deploy:邊緣部署,根本沒有 Docker 這回事
- 數(shù)據(jù)庫用 Supabase/Neon:托管、零配置、很快
一句話:It Just Works。
“那開發(fā)/生產(chǎn)環(huán)境不一致怎么辦?”
常聽到這句:“Docker 保證環(huán)境一致性”。除非你在 Dockerfile 里死磕版本固定、每次都重建(你大概率不會),容器也會漂移:
- 基礎(chǔ)鏡像悄悄更新
- Alpine 包變了
- 某一層緩存抽風
切到源碼構(gòu)建 + 輕工具后,環(huán)境不一致的 Bug 反而更少。 因為:零碎部件更少、版本邊界更清晰、本地環(huán)境更透明。
真正的問題不是 Docker,而是你不信任你的環(huán)境
Docker 成了一個拐杖,用來遮蓋:
- 糟糕的文檔
- 雪花般的環(huán)境
- 混亂的本地配置
- 折磨人的入職流程
把 Docker 炸掉后,被迫把這些做好:
- 寫清楚如何安裝/運行
- 版本管理干凈
- 腳本可讀、可維護
團隊的入職更快、調(diào)試更輕松、部署更有底氣。
自從不用 Docker 之后,我拿到的實打?qū)嵤找?/span>
- 構(gòu)建時間:12 分鐘 → 3 分鐘
- 新人入職:2 小時 → 15 分鐘(運行腳本直接開工)
- 磁盤占用:20GB+ Docker 卷 → < 500MB
- 認知負擔:我終于看懂自己棧里發(fā)生了什么,不再調(diào)“那個容器連不上這個容器”的謎題
你的 CRUD 應用,不需要 K8s
Docker 聽起來很酷,Kubernetes 更酷。 但如果你只是做單體 Web + 數(shù)據(jù)庫:一臺服務器 + 一個定時任務就夠了,不需要集群。
別再跟著 YouTube 把 Todo App 部署上 EKS。別假裝你的 Side Project 需要 Helm Chart。如果你不會手寫 Nginx,你大概也用不著容器化。
很多人把工具復雜度當成工程成熟度。復雜 ≠ 高級。簡單解決真實問題才是本事。 Docker 不會讓你的架構(gòu)更“干凈”,它常常只是讓它更重。
什么時候 Docker 仍然有意義
這里不是說 Docker 是原罪。它在這些場景很棒:
- 操作系統(tǒng)級隔離(安全)
- 多語言混合(Go 后端 + Python ML)
- 基礎(chǔ)設(shè)施團隊需要生產(chǎn)副本/一致分發(fā)
- 史前依賴地獄
- Playwright 之類需要 headless 瀏覽器的工具
但如果你在做 Node / Rails / Django / Laravel 的普通 Web:從簡單開始。
常見問題(FAQ)
Q:開發(fā)一定要用 Docker 嗎?A:不。用 asdf / nvm / pyenv + Shell 腳本,可以覆蓋 Docker 90% 的“環(huán)境可復現(xiàn)”價值,而且沒有容器開銷。
Q:團隊協(xié)作是不是 Docker 更好?A:只有當你的文檔很差時才是。把版本、工具、腳本寫清楚,不上容器也能更快上手。
Q:能不用 Docker 部署嗎?A:當然。Fly.io / Railway / Vercel / Deno Deploy 都支持源碼部署。
Q:Docker 的替代是什么?A:
- 版本管理:asdf / nvm / pyenv
- 環(huán)境變量:direnv
- 可復現(xiàn):Shell 腳本
- 服務依賴:系統(tǒng)包管理(
brew/apt) - 部署:源碼構(gòu)建平臺
這幾樣工具,確實讓我輕松了
- asdf:通用版本管理
- direnv:按目錄自動加載
.env - Fly.io:無 Dockerfile 的源碼部署
- Railway.app:后端一鍵部署
- Supabase:托管 Postgres + Auth
- Neon:無服務器 Postgres,彈性強
結(jié)尾的重話
你不需要容器。 你需要清晰、克制,以及一個你真正理解的技術(shù)棧。
更重要的是: 別再為 DevOps 推特的炫技優(yōu)化, 開始為速度、心智負擔、交付優(yōu)化。

























