教程雨

OKX新手入门教程导航,收录OKX注册、充值、买币、提现等基础操作教程

Docker与Kubernetes云原生技术

Docker与Kubernetes容器化实战:2026年云原生开发者的必备技能

一、为什么2026年必须掌握容器技

1.1 容器技术已经无处不在

很多刚入行的开发者可能会问:”我平时写代码,又不涉及部署,为什么要去学Docker和Kubernetes?”这个想法其实是一个常见的误区。

在我早期做后端开发的时候,每次项目要上线都是噩梦。测试环境明明好好的,部署到生产环境就各种问题——可能是Node.js版本不一致,可能是某个依赖库在生产服务器上缺少,甚至还遇到过因为操作系统差异导致的奇怪bug。每次部署都要加班到半夜,还经常出现回滚的情况。

直到我们团队开始采用Docker容器化部署,所有的环境问题都迎刃而解。因为Docker容器包含了应用运行所需的一切——代码、运行时、系统工具、系统库——所以无论在哪里运行,容器内的环境都是完全一致的。”在我机器上能跑”这句话,在容器时代终于变成了”在容器里能跑,就到处都能跑”。

容器化技术三层架构

1.2 容器技术带来的实际价值

环境一致性

这是容器技术最核心的价值。开发、测试、生产环境使用相同的容器镜像,彻底解决了”环境不一致”的世纪难题。

资源隔离

每个容器都是相互隔离的进程,不会相互影响。这意味着你可以在同一台服务器上运行多个互不干扰的应用,而不用担心端口冲突或依赖冲突。

快速部署与弹性伸缩

容器可以在秒级启动和停止。结合Kubernetes,你可以根据负载自动伸缩应用的实例数量,这在处理突发流量时尤为重要。

版本管理与回滚

通过Docker镜像的版本标签,你可以轻松管理不同版本的应用。出现问题时,一键回滚到之前的版本,整个过程可能只需要几秒钟。

1.3 市场需求的真实数据

根据2026年的招聘数据,Docker和Kubernetes相关岗位的平均薪资比普通后端开发岗位高出约25%-35%。具体来看:

  • 初级Docker工程师:15K-25K
  • 中级K8s运维工程师:25K-40K
  • 高级云原生架构师:40K-60K甚至更高

更关键的是,容器技术几乎是所有中高级岗位的必备技能要求。无论是后端开发、系统运维还是DevOps工程师,简历上写着”熟悉Docker和Kubernetes”已经成为基本门槛。

二、Docker核心技术详解

2.1 Docker核心概念解析

镜像(Image)

镜像可以理解为一个”只读模板”,包含了应用运行所需的所有文件和依赖。你可以基于某个镜像创建多个容器实例。就像类(Class)和对象(Object)的关系一样,镜像是类,容器是对象。

Docker Hub是官方镜像仓库,你可以从中下载各种现成的镜像,如Nginx、MySQL、Redis、Node.js等。

容器(Container)

容器是镜像的运行实例。你可以创建、启动、停止、删除容器。每个容器都是相互隔离的,拥有自己的文件系统、网络和进程空间。

仓库(Repository)

仓库用于存放和分发镜像。Docker Hub是最大的公共仓库,国内可以使用阿里云、腾讯云等加速服务。

2.2 常用Docker命令速查

以下是我在实际工作中最常用的Docker命令,按功能分类整理:

镜像管理

bash

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx:latest

# 查看本地镜像
docker images

# 删除镜像
docker rmi nginx:latest

# 构建镜像(需要Dockerfile)
docker build -t my-app:1.0 .

容器管理

bash

# 运行容器
docker run -d --name my-nginx -p 80:80 nginx

# 参数说明:
# -d: 后台运行
# --name: 指定容器名称
# -p 80:80: 端口映射(主机端口:容器端口)

# 查看运行中的容器
docker ps

# 查看所有容器(包括已停止的)
docker ps -a

# 停止/启动容器
docker stop my-nginx
docker start my-nginx

# 进入容器内部
docker exec -it my-nginx /bin/bash

# 查看容器日志
docker logs -f my-nginx

# 删除容器
docker rm my-nginx

数据管理

bash

# 创建数据卷
docker volume create my-data

# 挂载数据卷到容器
docker run -d -v my-data:/app/data nginx

# 挂载主机目录
docker run -d -v /host/path:/container/path nginx

2.3 Dockerfile实战编写

Dockerfile是用于构建Docker镜像的脚本文件。下面我用一个实际项目来演示如何编写Dockerfile。

Node.js应用的Dockerfile

dockerfile

# 指定基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源代码
COPY . .

# 构建应用(如果有构建步骤)
RUN npm run build

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "dist/index.js"]

多阶段构建优化

上面的Dockerfile有一个问题:构建好的镜像包含了源代码、测试文件等不需要的内容,导致镜像体积过大。多阶段构建可以很好地解决这个问题:

dockerfile

# 第一阶段:构建
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 第二阶段:运行(使用更轻量的基础镜像)
FROM node:18-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist

EXPOSE 3000
CMD ["node", "dist/index.js"]

通过多阶段构建,最终的镜像只包含运行所需的文件,体积可以减少50%以上。

Java应用的Dockerfile

dockerfile

FROM maven:3.8-openjdk-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

FROM openjdk:17-slim
WORKDIR /app
COPY --from=builder /app/target/myapp.jar ./app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

2.4 Docker Compose编排多容器

当你的应用需要多个容器协同工作时(如Web应用 + 数据库 + 缓存),Docker Compose是很好的选择。

docker-compose.yml示例

yaml

version: "3.8"

services:
  # Web应用
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    depends_on:
      - db
      - redis

  # 数据库
  db:
    image: mysql:8.0
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=myapp
    ports:
      - "3306:3306"

  # 缓存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data

volumes:
  mysql-data:
  redis-data:

常用命令:

bash

# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f web

# 停止所有服务
docker-compose down

# 重新构建并启动
docker-compose up -d --build

三、Kubernetes核心架构与实践

3.1 K8s核心概念解析

为什么需要Kubernetes

虽然Docker已经解决了环境一致性的问题,但在生产环境中,我们往往需要:

  • 同时运行多个容器实例来保证可用性
  • 根据负载自动伸缩容器数量
  • 实现滚动更新和回滚
  • 管理多个集群和命名空间
  • 处理容器间的网络通信

Kubernetes(简称K8s)就是来解决这些问题的。K8s是一个容器编排平台,可以自动化地管理、调度、伸缩和运维容器化应用。

核心组件架构

plaintext

┌─────────────────────────────────────────────────┐
│                  Control Plane                    │
│  ┌─────────┐ ┌─────────┐ ┌─────────┐           │
│  │  API    │ │ Scheduler│ │ Controller│        │
│  │ Server  │ │         │ │ Manager  │           │
│  └─────────┘ └─────────┘ └─────────┘           │
└─────────────────────────────────────────────────┘
                        │
┌─────────────────────────────────────────────────┐
│                    Node Pool                     │
│  ┌─────────────┐  ┌─────────────┐              │
│  │    Node 1    │  │    Node 2    │              │
│  │  ┌─────────┐ │  │  ┌─────────┐ │              │
│  │  │  Pod 1  │ │  │  │  Pod 3  │ │              │
│  │  ├─────────┤ │  │  ├─────────┤ │              │
│  │  │  Pod 2  │ │  │  │  Pod 4  │ │              │
│  │  └─────────┘ │  │  └─────────┘ │              │
│  │     kubelet  │  │     kubelet  │              │
│  │     kube-proxy│  │     kube-proxy│             │
│  └─────────────┘  └─────────────┘              │
└─────────────────────────────────────────────────┘
  • API Server:集群的网关,所有操作都通过API Server进行
  • Scheduler:负责将Pod调度到合适的Node上
  • Controller Manager:管理各种控制器,维持集群期望状态
  • kubelet:运行在每个Node上,负责管理容器的生命周期
  • kube-proxy:负责网络代理和负载均衡

3.2 核心资源对象

Pod:最小调度单元

Pod是Kubernetes中的最小部署单元,一个Pod可以包含一个或多个容器。

yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-app-pod
  labels:
    app: my-app
spec:
  containers:
    - name: my-app
      image: my-app:1.0
      ports:
        - containerPort: 3000
      resources:
        limits:
          memory: "256Mi"
          cpu: "500m"
        requests:
          memory: "128Mi"
          cpu: "250m"

Deployment:应用部署

Deployment用于管理Pod的创建、扩缩容和更新。

yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
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
          readinessProbe:
            httpGet:
              path: /health
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 10

Service:服务发现与负载均衡

Service为一组Pod提供统一的访问入口,并实现负载均衡。

yaml

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80        # Service端口
      targetPort: 3000  # 容器端口
  type: ClusterIP

ConfigMap和Secret:配置管理

yaml

# ConfigMap:存储非敏感配置
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
data:
  DATABASE_HOST: "db-service"
  LOG_LEVEL: "info"

---
# Secret:存储敏感信息
apiVersion: v1
kind: Secret
metadata:
  name: my-app-secret
type: Opaque
stringData:
  DATABASE_PASSWORD: "secret-password"
  API_KEY: "your-api-key"

Ingress:HTTP路由

yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-app-service
                port:
                  number: 80

3.3 常用kubectl命令

bash

# 获取资源
kubectl get pods
kubectl get deployments
kubectl get services
kubectl get all

# 查看详情
kubectl describe pod my-app-pod
kubectl logs my-app-pod

# 应用配置
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

# 扩缩容
kubectl scale deployment my-app --replicas=5

# 滚动更新
kubectl set image deployment/my-app my-app=my-app:2.0
kubectl rollout status deployment/my-app

# 回滚
kubectl rollout undo deployment/my-app

# 删除资源
kubectl delete -f deployment.yaml

四、从Docker到K8s的实战路径

4.1 本地开发环境搭建

使用Docker Desktop

最简单的本地K8s学习方案是使用Docker Desktop,它内置了Kubernetes集群。

  1. 下载安装Docker Desktop
  2. 启用Kubernetes:在设置中勾选”Enable Kubernetes”
  3. 等待集群初始化完成

使用Minikube

如果你想要更轻量的方案,可以使用Minikube:

bash

# 安装Minikube
brew install minikube

# 启动集群
minikube start

# 开启仪表板
minikube dashboard

4.2 项目容器化实战步骤

第一步:编写应用的Dockerfile

确保应用能够在容器中正常运行,注意处理健康检查、信号处理等。

第二步:编写Kubernetes配置文件

根据应用需求,编写Deployment、Service等配置文件。

yaml

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo-app
  template:
    metadata:
      labels:
        app: todo-app
    spec:
      containers:
        - name: todo-app
          image: your-registry.com/todo-app:v1
          ports:
            - containerPort: 3000
          env:
            - name: NODE_ENV
              value: "production"

第三步:配置健康检查

yaml

livenessProbe:
  httpGet:
    path: /health/live
    port: 3000
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /health/ready
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 5

第四步:设置资源限制

yaml

resources:
  requests:
    memory: "128Mi"
    cpu: "100m"
  limits:
    memory: "512Mi"
    cpu: "500m"

4.3 CI/CD自动化部署

yaml

# GitHub Actions示例
name: Deploy to Kubernetes

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Login to Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      
      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ghcr.io/${{ github.repository }}:latest
      
      - name: Deploy to Kubernetes
        uses: azure/k8s-deploy@v4
        with:
          namespace: production
          manifests: |
            k8s/deployment.yaml
            k8s/service.yaml
          images: |
            ghcr.io/${{ github.repository }}:latest

五、常见问题与避坑指南

5.1 Docker常见问题

镜像构建失败

常见原因包括网络问题、依赖缓存失效、基础镜像不可用等。解决方案是检查Dockerfile语法,确保网络畅通,使用合适的构建缓存策略。

容器无法启动

检查端口是否被占用,文件权限是否正确,环境变量是否完整。使用docker logs查看详细日志。

数据持久化问题

容器删除后数据会丢失。务必使用数据卷(Volume)来持久化重要数据。

5.2 Kubernetes常见问题

Pod一直处于Pending状态

可能是资源不足、节点不可用或调度失败。使用kubectl describe pod查看详细原因。

Pod一直处于CrashLoopBackOff

通常是应用启动失败。检查应用日志,排查配置错误、依赖服务不可用等问题。

Service无法访问

检查selector是否正确匹配Pod标签,端口映射是否正确,网络策略是否允许。

5.3 生产环境注意事项

镜像安全

  • 定期更新基础镜像
  • 扫描镜像中的漏洞
  • 不使用root用户运行容器
  • 使用私有镜像仓库

资源配置

  • 设置合理的资源请求和限制
  • 配置健康检查探针
  • 设置合理的副本数

日志与监控

  • 收集并集中管理日志
  • 配置监控告警
  • 跟踪关键指标

六、总结与学习建议

6.1 核心知识点回顾

  1. Docker核心价值:环境一致性、资源隔离、快速部署
  2. Docker三大概念:镜像、容器、仓库
  3. Dockerfile编写:多阶段构建优化镜像体积
  4. K8s核心组件:Pod、Deployment、Service、Ingress
  5. K8s架构:Control Plane + Node Pool

6.2 学习路线建议

阶段一:Docker基础(1-2周)

  • 掌握Docker核心概念
  • 熟练使用常用命令
  • 编写Dockerfile并构建镜像
  • 使用Docker Compose编排多容器

阶段二:Kubernetes入门(2-3周)

  • 搭建本地K8s环境
  • 理解核心资源对象
  • 编写K8s配置文件
  • 部署简单应用到K8s

阶段三:实战进阶(持续)

  • 搭建完整的CI/CD流程
  • 学习服务网格(Istio/Linkerd)
  • 掌握监控与日志方案
  • 学习GitOps部署理念

6.3 推荐学习资源

七、相关资源链接

内部链接

外部资源

适用人群: 后端开发者、DevOps工程师、运维工程师、想要学习云原生技术的程序员

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注