技术文摘

Docker到Kubernetes完全指南:从第一个容器到生产部署(含实战代码)

现代软件开发离不开容器化。Docker把应用打包成可移植的容器,Kubernetes编排这些容器在集群中运行。Netflix、Spotify、Airbnb都在用这套技术栈。本文从零开始,带你走完从Docker到K8s的完整路径。

第一步:理解Docker核心概念

Docker的四个关键概念:

  • 镜像(Image):应用的不可变模板,包含文件系统和配置
  • 容器(Container):镜像的运行实例,与宿主机隔离
  • Dockerfile:构建镜像的指令文件
  • Registry:镜像仓库(Docker Hub、GitHub Container Registry等)

第二步:编写第一个Dockerfile

以Node.js应用为例:

# 多阶段构建(减小镜像体积)
# 阶段1:构建
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --
COPY . .
RUN npm run build

# 阶段2:生产
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
EXPOSE 3000
CMD ["node", "dist/server.js"]

为什么用node:20-alpine?Alpine镜像只有5MB(Debian版200MB),Node 20是2026 LTS。永远锁定版本号,不要用latest。

第三步:Docker Compose多服务编排

真实应用通常需要多个服务(应用、数据库、缓存)。Docker Compose用YAML文件统一管理:

# docker-compose.yml
version: "3.8"
services:
  app:
    build: .
    ports: ["3000:3000"]
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    environment:
      - DATABASE_URL=postgresql://postgres:password@db:5432/myapp
      - REDIS_URL=redis://redis:6379

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: password
    volumes: ["pgdata:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes: ["redisdata:/data"]

volumes:
  pgdata:
  redisdata:

运行:docker compose up -d。所有服务同时启动,数据通过volume持久化。

第四步:Kubernetes核心概念

当单机Docker Compose不够用时(需要多节点、高可用、自动扩缩容),就需要Kubernetes。

K8s的五个核心对象:

对象作用类比 Pod最小部署单元,包含一个或多个容器一间房 Deployment管理Pod的生命周期、副本数、滚动更新物业管理 Service提供稳定的网络端点和负载均衡门牌号 IngressHTTP路由和TLS终止前台接待 ConfigMap/Secret配置和敏感数据管理文件柜

第五步:本地搭建K8s环境

# 方式一:Docker Desktop内置K8s(Mac/Windows)

# 方式二:minikube(学习推荐)
minikube start --cpus=4 --memory=8192

# 方式三:kind(轻量快速)
kind create cluster --name dev

第六步:第一个K8s部署

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        readinessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 15
          periodSeconds: 20

部署:kubectl apply -f deployment.yaml。检查:kubectl get pods,svc。

第七步:Service暴露服务

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
  - port: 80
    targetPort: 3000
  type: ClusterIP

集群内部通过 my-app-service:80 访问。需要外部访问时用Ingress或LoadBalancer。

第八步:生产必备配置

  • 资源限制:必须设置requests和limits,否则一个失控进程会饿死其他Pod
  • 健康检查:liveness告诉K8s"我坏了就重启我",readiness告诉它"我没准备好别给我流量"
  • 滚动更新:K8s默认滚动更新,保证零停机
  • HPA自动扩缩:根据CPU/内存自动增减副本数

第九步:监控告警

生产环境必备Prometheus + Grafana:

# 使用Helm一键部署
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install monitoring prometheus-community/kube-prometheus-stack

何时用K8s,何时不用

不需要K8s:单服务器博客、小型SaaS、内部工具。Docker Compose足够。

需要K8s:多节点高可用、自动故障恢复、水平扩缩容、多开发者同时部署、停机成本高。

从Compose到K8s的迁移

用Kompose工具转换:kompose convert -f docker-compose.yml。它会生成K8s的Deployment和Service YAML。然后手动添加资源限制、健康检查和Secret。

学习路径建议:Docker基础 → Docker Compose → K8s核心概念 → 本地集群 → 部署第一个应用 → 监控告警 → 生产部署。按这个顺序来,每个阶段搞懂再进入下一个。