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 nodejs
RUN adduser -S nextjs -u 1001
WORKDIR /app
# 只复制必要的文件
COPY --from=builder --chown=nextjs:nodejs /app/node_modules ./node_modules
COPY --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"]

优化要点:

  1. 多阶段构建:分离构建环境和运行环境,减小镜像体积
  2. 利用缓存:先复制 package.json,再复制源代码
  3. 使用非 root 用户:提高安全性
  4. 指定具体版本:避免使用 latest 标签
  5. 健康检查:确保容器运行正常

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/v1
kind: Deployment
metadata:
name: myapp-deployment
labels:
app: myapp
spec:
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: 10

2.2 ConfigMap 和 Secret#

apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
app.properties: |
max_connections=100
timeout=30
---
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
stringData:
database-url: "postgres://user:password@db:5432/mydb"

2.3 Ingress 配置#

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
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/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-deployment
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

3.2 持久化存储(PVC)#

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
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 集群和应用性能。


六、生产环境最佳实践#

  1. 资源管理:为所有容器设置 requests 和 limits
  2. 安全配置:以非 root 用户运行容器
  3. 健康检查:配置 livenessProbe 和 readinessProbe
  4. 自动扩缩容:使用 HPA 实现自动扩缩容
  5. 备份与灾难恢复:定期备份数据

希望这篇文章能帮助你从零开始掌握 Docker 和 Kubernetes!

Docker 与 Kubernetes 云原生实战:从容器化到生产部署的完整指南
https://www.oferry.com/posts/a78/
作者
晨平安
发布于
2026-02-27
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00