一、Docker 到底解决什么问题?
三个真实价值:
- 环境一致性——本地能跑,线上就能跑,「我机器上正常」从此消失
- 进程管理——崩溃自动重启、健康检查、资源配额,都是容器运行时的内置能力
- 资源隔离——多服务互不干扰,一个服务内存泄漏不至于拖垮整机
它不解决:代码质量、安全漏洞、成本问题。一个有硬编码密钥的项目装进容器,密钥还是在镜像里。
二、这些情况不需要 Docker
纯静态站是最典型也最常见的场景。build 产物就是几个 HTML/CSS/JS 文件,放对象存储 + CDN 是最优解:
- 没有常驻进程,就没有崩溃、重启、内存泄漏这些问题
- 成本从每月几十元的服务器降到几乎为零的流量费
- 天然抗流量峰值,不存在「被扫爆」的服务器
判断标准一句话:build 完没有需要一直运行的东西,就不需要容器。
三、这些情况需要 Docker
- 有常驻进程:Node API、FastAPI、Django、Next.js SSR
- 依赖系统库:Python 编译依赖、中文字体、headless 浏览器(截图/PDF 场景)
- 多环境一致性要求高:开发、预发、生产行为要完全一致
- 需要限制单个服务的资源配额
四、多服务项目:Docker Compose
前端 + API + PostgreSQL + Redis 的项目,用一个 docker-compose.yml 讲清楚一切:
services:
api:
build: ./api
ports: ["8080:8080"]
env_file: .env
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
volumes: ["pgdata:/var/lib/postgresql/data"]
healthcheck:
test: ["CMD-SHELL", "pg_isready -U app"]
三个要点:数据库数据必须挂卷;服务间用 healthcheck 控制启动顺序;.env 与 compose 定义分离且永不入 Git。
五、AI 生成 Dockerfile 的四个高频问题
- root 用户运行——容器逃逸风险被放大。加
USER app创建普通用户运行 - 镜像 1GB+——没用多阶段构建,把 node_modules、编译工具链全打进了运行镜像。合理体积通常在 200MB 以内
- 没有 HEALTHCHECK——进程假死(端口在监听但不响应)时编排层毫无感知
- 危险挂载——挂载
/var/run/docker.sock或开 privileged,等于把宿主机钥匙交出去。AI 时不时会在「解决权限问题」时给出这类方案,要警惕
六、一张决策表
| 情况 | 用不用容器 | 理由 |
|---|---|---|
| 纯静态站 | 不用 | OSS/COS + CDN 更便宜、更稳、更安全 |
| 静态 + 少量接口 | 通常不用 | 云函数托管接口即可 |
| 单个 API 服务 | 用 | 环境一致 + 自动重启 + 健康检查 |
| SSR 应用 | 用 | 常驻进程需要容器化运行时 |
| 多服务 | Compose | 统一编排、网络隔离、启动顺序 |
| 需要 privileged 的方案 | 人工评估 | 优先找无特权替代方案 |
结语
Docker 化本身不产生价值,「为这个项目形态选对运行方式」才产生价值。宇视星的部署决策引擎做的就是这件事:输入项目结构,输出 STATIC_HOSTING / SERVERLESS / CONTAINER 的推荐路径和理由,而不是无脑容器化。