Docker Compose 可作为云原生演进起点,需遵循松耦合、声明式配置、可观测性前置、无状态优先、配置与镜像分离原则;服务须真正解耦、API 明确、禁直连数据库;配置用环境变量或外部中心;健康检查、多阶段构建、非 root 用户、结构化日志、内嵌指标、OpenTelemetry 追踪、secrets/volumes/networks 预留 K8s 接口。
用 Docker Compose 编排轻量级应用,本身不是云原生的“生产就绪”方案,但它可以作为云原生演进的起点——关键在于设计时就遵循云原生原则:松耦合、声明式配置、可观测性前置、无状态优先、配置与镜像分离。
很多团队把单体应用简单拆成多个容器(比如 web + db + cache),但代码仍强依赖、共享数据库、同步调用阻塞,这不算云原生。真正的轻量编排应体现职责分离:
/healthz),并在 healthcheck 中启用,供后续迁移到 Kubernetes 的 readiness/liveness 做准备Docker Compose 的 build 段容易写成“本地构建+复制源码”,这会污染镜像、增加体积、破坏可重现性。推荐做法:
dist/)复制到精简运行镜像(如 alpine 或 distroless)node:20.15-alpine),避免 latest 引发不可控更新Dockerfile 中设置非 root 用户(USER 1001)并限制能力(cap-drop: ALL),Compose 文件中通过 user: 和 cap_drop: 显式声明不能等上 K8s 才加日志和指标。轻量级应用可在 Compose 中低成本落地可观测三要素:
logging.driver: "json-file" 并配 max-size/max-file 防磁盘打满prometheus_client、Go 的 promhttp),暴露 /metrics;Compose 中为监控服务(如 Prometheus)配置静态 job,抓取各服务 http://service-name:port/metrics
otel/opentelemetry-collector-contrib 镜像),服务通过 OTLP 协议上报 span,Collector 转发至 Jaeger 或 Zipkin让 Compose 文件成为向 Kubernetes 迁移的“草稿”而非障碍:
env_file: 加载 .env,但避免敏感信息明文;改用 secrets: 定义(即使本地用 file driver),未来可平滑对接 K8s Secretsnetworks: 自定义桥接网络,禁用 host 或 default,便于后续映射为 K8s NetworkPolicyvolumes: 声明 + volume: 引用),而非绑定宿主机路径,这样迁移时只需替换为 PersistentVolumeClaim