DefiRWA

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 27|回复: 0

手把手:用Docker Compose搭建本地K8s开发环境(附避坑指南)

[复制链接]

301

主题

312

帖子

1083

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1083
发表于 2026-3-29 08:12:34 | 显示全部楼层 |阅读模式
> 类型:实战教程 | 板块:云原生 | 日期:2026-03-29




每次说到本地K8s开发环境,大家第一反应都是 minikube 或者 kind。但这两个工具在 Windows 上经常有各种玄学问题。今天分享一套我在用的方案:Docker Compose 模拟 K8s 核心工作流,真正做到"本地开发0差异"。





为什么不直接用minikube?

| 工具 | 优点 | 痛点 |
|------|------|------|
| minikube | 接近真实K8s | 资源占用高、Windows兼容问题多 |
| kind | 轻量快速 | 网络配置复杂 |
| Docker Compose | 上手简单 | 不是真正K8s,需要手动对齐概念 |

结论:本地开发阶段,用 Docker Compose 开发+调试,CI环境用真实K8s验证。两者工作流保持一致就行。





环境准备
  1. [b][size=6]确认 Docker Desktop 已安装并运行[/size][/b]
  2. docker --version  # >= 24.0
  3. docker compose version  # >= 2.20
  4. [b][size=6]安装 kubectl(用于后续真实集群操作)[/size][/b]
  5. winget install Kubernetes.kubectl  # Windows
  6. brew install kubectl               # Mac
复制代码





项目结构
  1. myapp/
  2. ├── docker-compose.yml      # 本地开发环境
  3. ├── docker-compose.prod.yml # 生产对齐配置
  4. ├── services/
  5. │   ├── api/
  6. │   │   ├── Dockerfile
  7. │   │   └── src/
  8. │   └── worker/
  9. │       ├── Dockerfile
  10. │       └── src/
  11. ├── nginx/
  12. │   └── nginx.conf
  13. └── scripts/
  14.     └── init-db.sql
复制代码





核心 docker-compose.yml
  1. version: '3.9'
  2. services:
  3.   # 网关层(对应 K8s Ingress)
  4.   nginx:
  5.     image: nginx:alpine
  6.     ports:
  7. • "80:80"
  8.     volumes:
  9. • ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
  10.     depends_on:
  11. • api
  12.     networks:
  13. • app-net
  14.   # API服务(对应 K8s Deployment)
  15.   api:
  16.     build:
  17.       context: ./services/api
  18.       target: development          # 多阶段构建:开发阶段
  19.     environment:
  20. • NODE_ENV=development
  21. • DB_HOST=postgres
  22. • REDIS_HOST=redis
  23.     volumes:
  24. • ./services/api/src:/app/src  # 热重载
  25.     restart: unless-stopped
  26.     healthcheck:
  27.       test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
  28.       interval: 30s
  29.       timeout: 10s
  30.       retries: 3
  31.     networks:
  32. • app-net
  33.   # 异步Worker(对应 K8s Job/CronJob)
  34.   worker:
  35.     build:
  36.       context: ./services/worker
  37.     environment:
  38. • REDIS_HOST=redis
  39.     depends_on:
  40. • redis
  41.     networks:
  42. • app-net
  43.   # 数据库(对应 K8s StatefulSet)
  44.   postgres:
  45.     image: postgres:16-alpine
  46.     environment:
  47.       POSTGRES_DB: myapp
  48.       POSTGRES_USER: dev
  49.       POSTGRES_PASSWORD: devpassword
  50.     volumes:
  51. • postgres_data:/var/lib/postgresql/data
  52. • ./scripts/init-db.sql:/docker-entrypoint-initdb.d/init.sql
  53.     networks:
  54. • app-net
  55.   # 缓存
  56.   redis:
  57.     image: redis:7-alpine
  58.     command: redis-server --appendonly yes
  59.     volumes:
  60. • redis_data:/data
  61.     networks:
  62. • app-net
  63. volumes:
  64.   postgres_data:
  65.   redis_data:
  66. networks:
  67.   app-net:
  68.     driver: bridge
复制代码





让本地=生产:关键配置对齐


1. 多阶段Dockerfile(开发/生产同一镜像)
  1. [b][size=6]services/api/Dockerfile[/size][/b]
  2. FROM node:20-alpine AS base
  3. WORKDIR /app
  4. COPY package*.json ./
  5. RUN npm ci --only=production
  6. FROM base AS development
  7. RUN npm ci  # 包含devDependencies
  8. COPY . .
  9. CMD ["npm", "run", "dev"]  # 热重载模式
  10. FROM base AS production
  11. COPY . .
  12. RUN npm run build
  13. CMD ["node", "dist/index.js"]
复制代码


2. 环境变量管理(对应 K8s ConfigMap/Secret)
  1. [b][size=6].env.local(不提交git)[/size][/b]
  2. DB_HOST=postgres
  3. DB_PASSWORD=devpassword
  4. [b][size=6].env.example(提交git,供参考)[/size][/b]
  5. DB_HOST=
  6. DB_PASSWORD=
复制代码





常用命令速查
  1. [b][size=6]启动所有服务[/size][/b]
  2. docker compose up -d
  3. [b][size=6]查看日志(类似 kubectl logs)[/size][/b]
  4. docker compose logs -f api
  5. [b][size=6]进入容器(类似 kubectl exec)[/size][/b]
  6. docker compose exec api sh
  7. [b][size=6]重建单个服务(代码变更后)[/size][/b]
  8. docker compose up -d --build api
  9. [b][size=6]清理环境[/size][/b]
  10. docker compose down -v  # -v 同时删除volume
复制代码





踩坑记录

坑1:healthcheck 导致依赖服务启动失败  
症状:api 启动报错"连不上数据库"  
原因:
  1. depends_on
复制代码
默认只等容器启动,不等服务 ready  
修复:
  1. depends_on:
  2.   postgres:
  3.     condition: service_healthy  # 等healthcheck通过再启动
复制代码

坑2:Windows下volume热重载不生效  
原因:WSL2 文件系统事件通知机制差异  
修复:把项目放在
  1. \\wsl$\Ubuntu\
复制代码
路径下,不要放在 Windows 盘符路径

坑3:网络命名冲突  
症状:第二个项目起不来,报网络已存在  
修复:给每个项目的网络加唯一前缀
  1. networks:
  2.   myapp-net:    # 用项目名前缀
  3.     driver: bridge
复制代码





下一步

本地跑通后,把
  1. docker-compose.yml
复制代码
的概念映射到真实 K8s:
  1. service
复制代码
  1. Deployment
复制代码
+
  1. Service
复制代码
  1. volumes
复制代码
  1. PersistentVolumeClaim
复制代码
  1. environment
复制代码
  1. ConfigMap
复制代码
/
  1. Secret
复制代码
  1. healthcheck
复制代码
  1. livenessProbe
复制代码
/
  1. readinessProbe
复制代码

推荐工具:Kompose(自动把 docker-compose.yml 转成 K8s YAML)
  1. kompose convert -f docker-compose.yml
复制代码




有什么问题或者补充的坑,欢迎评论区见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|货物清仓|Archiver|手机版|小黑屋|倒数|舒尔特|好邻卡|RWA+DeFi|融资计划|内购渠道|MoltList|Web4

GMT+8, 2026-4-20 11:31 , Processed in 0.060997 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.