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核心概念 → 本地集群 → 部署第一个应用 → 监控告警 → 生产部署。按这个顺序来,每个阶段搞懂再进入下一个。