747 字
4 分钟
Docker 与 Kubernetes 云原生实战:从容器化到生产部署的完整指南
Docker 与 Kubernetes 云原生实战:从容器化到生产部署的完整指南
🐳 前言:Docker 和 Kubernetes 不仅改变了应用的部署方式,也改变了我们的开发和运维模式。这篇文章将从零开始,带你掌握从容器化到生产部署的完整流程。
一、Docker 基础与最佳实践
1.1 Dockerfile 优化技巧
一个好的 Dockerfile 应该遵循以下原则:体积小、构建快、安全、易维护。
# 使用更小的基础镜像FROM node:18-alpine AS builder
WORKDIR /app
# 先复制依赖文件,利用缓存层COPY package*.json ./RUN npm ci --only=production
# 生产阶段FROM node:18-alpine
# 创建非 root 用户运行应用RUN addgroup -g 1001 -S nodejsRUN adduser -S nextjs -u 1001
WORKDIR /app
# 只复制必要的文件COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modulesCOPY --chown=nextjs:nodejs . .
USER nextjs
EXPOSE 3000
# 健康检查HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1
CMD ["node", "server.js"]优化要点:
- 多阶段构建:分离构建环境和运行环境,减小镜像体积
- 利用缓存:先复制 package.json,再复制源代码
- 使用非 root 用户:提高安全性
- 指定具体版本:避免使用
latest标签 - 健康检查:确保容器运行正常
1.2 Docker Compose 编排
version: '3.8'
services: app: build: context: . dockerfile: Dockerfile container_name: myapp restart: unless-stopped ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgres://user:pass@db:5432/mydb depends_on: - db - redis networks: - app-network
db: image: postgres:15-alpine container_name: postgres restart: unless-stopped environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data networks: - app-network
redis: image: redis:7-alpine container_name: redis restart: unless-stopped volumes: - redis_data:/data networks: - app-network
volumes: postgres_data: redis_data:
networks: app-network: driver: bridge二、Kubernetes 核心概念
2.1 Pod、Deployment 和 Service
apiVersion: apps/v1kind: Deploymentmetadata: name: myapp-deployment labels: app: myappspec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myregistry/myapp:v1.0.0 ports: - containerPort: 3000 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 30 periodSeconds: 102.2 ConfigMap 和 Secret
apiVersion: v1kind: ConfigMapmetadata: name: myapp-configdata: app.properties: | max_connections=100 timeout=30
---apiVersion: v1kind: Secretmetadata: name: app-secretstype: OpaquestringData: database-url: "postgres://user:password@db:5432/mydb"2.3 Ingress 配置
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: myapp-ingress annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt-prodspec: tls: - hosts: - myapp.example.com secretName: myapp-tls rules: - host: myapp.example.com http: paths: - path: / pathType: Prefix backend: service: name: myapp-service port: number: 80三、K8s 高级特性
3.1 Horizontal Pod Autoscaler(HPA)
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: myapp-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp-deployment minReplicas: 3 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 703.2 持久化存储(PVC)
apiVersion: v1kind: PersistentVolumeClaimmetadata: name: postgres-pvcspec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: fast-ssd四、CI/CD 流水线
4.1 GitHub Actions 配置
name: CI
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3
- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '18'
- name: Install dependencies run: npm ci
- name: Test run: npm run test:ci
- name: Build run: npm run build五、监控与日志
使用 Prometheus 和 Grafana 监控 Kubernetes 集群和应用性能。
六、生产环境最佳实践
- 资源管理:为所有容器设置 requests 和 limits
- 安全配置:以非 root 用户运行容器
- 健康检查:配置 livenessProbe 和 readinessProbe
- 自动扩缩容:使用 HPA 实现自动扩缩容
- 备份与灾难恢复:定期备份数据
希望这篇文章能帮助你从零开始掌握 Docker 和 Kubernetes!
Docker 与 Kubernetes 云原生实战:从容器化到生产部署的完整指南
https://www.oferry.com/posts/a78/