快速结论
- Docker:开发测试环境首选,解决"在我机器上能跑"的问题
- K8s托管服务:生产环境用阿里云ACK或腾讯云TKE,不用自己维护Master节点
- 起步门槛:单机用Docker Compose,3台机器以上考虑K8s
- 成本参考:2节点K8s集群(4核8G)约600元/月起
Docker基础:为什么要容器化
传统部署的痛点:
- 开发环境:Mac + Node 20 + MySQL 8.0
- 测试环境:Ubuntu + Node 18 + MySQL 5.7
- 生产环境:CentOS + Node 16 + MySQL 5.7
- 结果:环境不一致导致"在我机器上能跑"
Docker通过将应用和依赖打包成镜像,实现一次构建,到处运行。
Dockerfile最佳实践
基础Dockerfile(Node.js)
# 使用官方轻量基础镜像
FROM node:20-alpine AS builder
# 设置工作目录
WORKDIR /app
# 先复制依赖文件(利用Docker层缓存)
COPY package*.json ./
RUN npm ci --only=production
# 复制源码
COPY . .
# 构建阶段(如有)
RUN npm run build
# 生产运行阶段(多阶段构建,减小镜像体积)
FROM node:20-alpine AS runner
WORKDIR /app
# 创建非root用户(安全最佳实践)
RUN addgroup -g 1001 -S nodejs && \
adduser -S nextjs -u 1001
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json .
USER nextjs
EXPOSE 3000
CMD ["node", "dist/index.js"]优化要点:
- 使用Alpine镜像减小体积(node:20 -> 1GB,node:20-alpine -> 180MB)
- 多阶段构建,生产镜像不包含构建工具
- 依赖层在源码层之前,利用缓存加速构建
- 非root用户运行,提升安全性
Docker Compose本地开发环境
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=development
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
volumes:
- ./src:/app/src # 热重载
depends_on:
- db
- cache
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
cache:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
postgres_data:Kubernetes核心概念
K8s的学习曲线较陡,但掌握这几个核心概念就能处理大多数场景:
Pod:最小部署单元
Pod是K8s中最小的可部署单元,包含一个或多个容器。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp
image: registry.cn-hangzhou.aliyuncs.com/myorg/myapp:v1.0
ports:
- containerPort: 3000
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"Deployment:管理Pod副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: registry.cn-hangzhou.aliyuncs.com/myorg/myapp:v1.0
ports:
- containerPort: 3000
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 滚动更新时最多多出1个Pod
maxUnavailable: 0 # 更新时不允许有不可用的PodService:服务发现和负载均衡
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer # 创建云厂商负载均衡器,暴露到公网ConfigMap和Secret:配置管理
# 非敏感配置
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
---
# 敏感配置(Base64编码)
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
DATABASE_PASSWORD: cGFzc3dvcmQ= # "password"的Base64云端K8s托管服务选型
阿里云ACK(容器服务Kubernetes版)
优势:
- 国内最成熟的K8s托管服务
- 与阿里云生态深度整合(OSS、RDS、SLB、ACR)
- 支持自动弹性伸缩(KEDA、Virtual Node)
- 免费Master节点,只为Worker节点付费
规格参考(2026年):
| 配置 | 月费用 | 适合场景 |
|---|---|---|
| 2×ecs.c6.large(2核4G) | ≈400元 | 开发/测试 |
| 3×ecs.c6.xlarge(4核8G) | ≈900元 | 小型生产 |
| 5×ecs.c6.2xlarge(8核16G) | ≈2500元 | 中型生产 |
快速创建集群:
# 安装aliyun CLI
pip install aliyun-python-sdk-core
# 创建K8s集群(示例)
aliyun cs CreateCluster \
--name my-k8s-cluster \
--cluster-type ManagedKubernetes \
--region cn-hangzhou \
--kubernetes-version 1.29.0腾讯云TKE(容器服务)
优势:
- 与腾讯云CLB(负载均衡)、CBS(云盘)无缝集成
- 超级节点(Serverless容器):按Pod使用量计费,无需预置节点
- 与微信企业版生态整合(容器日志直推CLS)
超级节点(推荐中小团队):
- 按实际Pod运行时间和资源计费
- 不需要预置EC实例,节省低峰期费用
- 适合流量波动大的业务
华为云CCE(云容器引擎)
优势:
- 鲲鹏架构支持(ARM64)
- 政企合规认证完善
- CCE Turbo极速Pod启动(<3秒)
生产部署实战:完整流程
第一步:推送镜像到私有仓库
# 登录阿里云容器镜像服务
docker login --username=your-account registry.cn-hangzhou.aliyuncs.com
# 构建并推送
docker build -t myapp:v1.0 .
docker tag myapp:v1.0 registry.cn-hangzhou.aliyuncs.com/myorg/myapp:v1.0
docker push registry.cn-hangzhou.aliyuncs.com/myorg/myapp:v1.0第二步:配置kubectl连接集群
# 从阿里云控制台下载kubeconfig
# 或使用aliyun CLI
aliyun cs DescribeClusterUserKubeconfig --ClusterId cf123xxx > ~/.kube/config
# 验证连接
kubectl get nodes第三步:部署应用
# 应用所有配置
kubectl apply -f deployment.yml
kubectl apply -f service.yml
# 查看部署状态
kubectl rollout status deployment/myapp
# 查看Pod运行情况
kubectl get pods -l app=myapp
# 查看日志
kubectl logs -l app=myapp --tail=100 -f第四步:配置Ingress(HTTPS访问)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
tls:
- hosts:
- api.yourdomain.com
secretName: tls-secret
rules:
- host: api.yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80推荐方案
个人开发者:Docker + Docker Compose,本地开发够用
小团队(<5人):腾讯云TKE超级节点,按量付费,无需运维K8s
成长型团队:阿里云ACK托管K8s,成熟稳定,生态完整
政企用户:华为云CCE,合规认证齐全
容器化不只是技术升级,更是团队协作方式的升级。拥抱容器,拥抱现代云原生。
站内延伸阅读:容器技术选型:什么时候不该上 K8s