CS 教程 · 第 14 章

云计算与虚拟化

Docker / KVM / 云服务

学习目标: 理解云计算的服务分层模型,掌握Docker容器的基本使用,了解Kubernetes的入门概念。

14.1 云计算究竟是什么?

一句话: 云计算就是把计算资源(服务器、存储、网络)像水电一样按需使用、按量付费。

20年前想做一个网站:买物理服务器→放到机房→装系统→配网络→申请公网IP,整个过程可能要几周。
今天想做一个网站:打开云平台控制台→点几下鼠标→5分钟后一台云服务器就好了。

云计算的核心特征

特征 说明
按需自助 无需人工交互,网页/API即可获取资源
广泛的网络接入 手机、电脑、平板都能访问
资源池化 多租户共享物理资源,逻辑隔离
弹性伸缩 流量大了自动加机器,流量小了自动释放
计量计费 像水电一样按用量收费

14.2 云计算的服务分层:IaaS / PaaS / SaaS

把这三种模式想象成吃披萨:

IaaS(基础设施即服务)

你管理: 操作系统及以上(应用、数据、运行时)

云厂商管理: 机房、物理服务器、网络、虚拟化

代表产品:

适用场景: 你需要完全控制服务器环境,自行安装软件、配置系统。

# IaaS的典型使用方式:SSH登录云服务器
ssh root@your-server-ip

# 装什么、怎么配,全由你决定
apt update && apt install nginx mysql-server python3

PaaS(平台即服务)

你管理: 只有你的应用代码和数据

云厂商管理: 操作系统、运行时、中间件

代表产品:

适用场景: 你只想写代码,不想管服务器。代码push上去自动部署运行。

# PaaS的典型使用方式:Vercel部署前端项目
vercel deploy
# 一行命令,域名、HTTPS、CDN全搞定

SaaS(软件即服务)

你只管用软件,其他全是厂商的事。

代表产品:

一句话区分三者:

IaaS PaaS SaaS
你的工作 从OS开始搭建 写代码部署 开箱即用
给你的 虚拟服务器 运行环境 完整软件
灵活性 最高
管理负担 最高 最低

14.3 主流云平台对比

维度 阿里云 AWS Azure
国内访问 ⭐⭐⭐⭐⭐ 极快 ⭐⭐ 较慢 ⭐⭐ 较慢
国际覆盖 ⭐⭐ 以亚洲为主 ⭐⭐⭐⭐⭐ 全球领先 ⭐⭐⭐⭐ 全球覆盖
备案支持 ✅ 完善 ❌ 不涉及 ❌ 不涉及
生态 国内SME首选 互联网企业首选 微软生态内首选
免费试用 部分产品有免费额度 12个月免费套餐 12个月免费+200美元额度
适合新手 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐

选型建议:


14.4 Docker容器基础

虚拟机 vs 容器

这是理解Docker的关键:

虚拟机架构:                Docker容器架构:
┌──────────────┐           ┌──────────────┐
│   应用 A     │           │  容器A │容器B │
├──────────────┤           ├──────────────┤
│   操作系统   │           │  Docker引擎  │
├──────────────┤           ├──────────────┤
│   虚拟硬件   │           │  宿主机OS    │
├──────────────┤           ├──────────────┤
│  Hypervisor  │           │   物理硬件   │
├──────────────┤           └──────────────┘
│   物理硬件   │
└──────────────┘
虚拟机 Docker容器
启动速度 分钟级 秒级甚至毫秒级
占用资源 GB级内存 MB级
隔离程度 完全隔离 进程级隔离
迁移部署 镜像大(几GB) 镜像小(几十MB)
操作系统 每个VM一套完整OS 共享宿主机内核
比喻: 虚拟机是在一块地上盖多栋独立别墅(各有地基),Docker是在一栋楼里分出多个公寓房间(共享地基和水电)。

Docker核心概念:镜像、容器、仓库

Dockerfile ──build──▶ 镜像(Image) ──run──▶ 容器(Container)
    │                     │                       │
    │                push/pull                 start/stop/rm
    │                     │                       │
    └──────────────────────┴──▶ Registry(仓库) ◀──┘

常用Docker命令

# === 镜像操作 ===
docker pull python:3.12          # 拉取镜像
docker images                    # 查看本地镜像
docker rmi python:3.12           # 删除镜像
docker build -t myapp:v1 .       # 用Dockerfile构建镜像

# === 容器操作 ===
docker run -d -p 8080:80 --name web nginx
# -d: 后台运行  -p: 端口映射(主机:容器)  --name: 起名

docker ps                        # 查看运行中的容器
docker ps -a                     # 查看所有容器(包括已停止的)
docker stop web                  # 停止容器
docker start web                 # 启动已停止的容器
docker rm web                    # 删除容器(要先停止)
docker exec -it web bash         # 进入容器内部

# === 日志与调试 ===
docker logs web                  # 查看容器日志
docker logs -f web               # 实时跟踪日志
docker inspect web               # 查看容器详细信息

Dockerfile详解

Dockerfile是一个包含构建镜像指令的文本文件。

# Dockerfile示例:一个Python Web应用
FROM python:3.12-slim            # 1. 基于哪个基础镜像
WORKDIR /app                     # 2. 设置工作目录
COPY requirements.txt .          # 3. 先复制依赖文件(利用缓存)
RUN pip install -r requirements.txt  # 4. 安装依赖
COPY . .                         # 5. 复制应用代码
EXPOSE 5000                      # 6. 声明端口(文档性质)
CMD ["python", "app.py"]         # 7. 容器启动时执行的命令

优化技巧:

docker-compose:编排多个容器

单容器用docker run,多容器协同用docker-compose

# docker-compose.yml
version: '3.8'
services:
  web:
    build: ./web          # 从./web目录的Dockerfile构建
    ports:
      - "3000:3000"
    depends_on:
      - db                 # web依赖db,db先启动
    environment:
      - DATABASE_URL=postgresql://user:pass@db:5432/mydb

  db:
    image: postgres:16    # 直接用现成镜像
    environment:
      - POSTGRES_PASSWORD=secret
    volumes:
      - pgdata:/var/lib/postgresql/data  # 数据持久化

volumes:
  pgdata:                 # 声明数据卷,容器删除数据还在
# docker-compose常用命令
docker-compose up -d           # 启动所有服务(后台)
docker-compose down            # 停止并删除所有服务
docker-compose logs -f web     # 查看特定服务日志
docker-compose ps              # 查看服务状态
docker-compose restart web     # 重启单个服务

14.5 Kubernetes入门概念

当你只有几个容器时,Docker + docker-compose就够了。当你有几十个、几百个容器时,就需要Kubernetes(简称K8s)。

为什么需要K8s?

Docker只管单台机器上的容器。但是:

K8s就是在Docker之上的"容器集群操作系统",解决这些问题。

核心概念(一张图理解K8s)

┌─────────────────────────────────────────────┐
│                 Kubernetes 集群              │
│                                              │
│  ┌──────────────────────────────────────┐    │
│  │              Node (节点1)             │    │
│  │  ┌──────────┐ ┌──────────┐          │    │
│  │  │  Pod A   │ │  Pod B   │  ...     │    │
│  │  │┌────────┐│ │┌────────┐│          │    │
│  │  ││容器1   ││ ││容器1   ││          │    │
│  │  ││容器2   ││ │└────────┘│          │    │
│  │  │└────────┘│ │          │          │    │
│  │  └──────────┘ └──────────┘          │    │
│  └──────────────────────────────────────┘    │
│  ┌──────────────────────────────────────┐    │
│  │              Node (节点2)             │    │
│  │  ┌──────────┐ ...                    │    │
│  │  │  Pod C   │                        │    │
│  │  └──────────┘                        │    │
│  └──────────────────────────────────────┘    │
│                                              │
│  ┌──────────────────────────────┐            │
│  │   控制平面 (Master Node)      │            │
│  │   API Server / Scheduler /    │            │
│  │   Controller Manager / etcd   │            │
│  └──────────────────────────────┘            │
└─────────────────────────────────────────────┘

核心对象:

对象 说明 类比
Pod K8s的最小调度单位,包含1个或多个容器 像一个"集装箱",里面装几个关联的容器
Node 运行Pod的物理机或虚拟机 像港口里的"码头工人"
Service 给一组Pod提供固定的访问入口 像"前台接待",后面Pod怎么变,入口不变
Deployment 管理Pod的多副本和滚动更新 像"调度经理",确保指定数量的Pod在运行
ConfigMap / Secret 配置信息和敏感数据 .env文件的管理版

Deployment配置示例(简化版)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 3                    # 始终保持3个Pod运行
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: app
        image: my-web-app:v2     # 镜像版本
        ports:
        - containerPort: 3000
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "200m"

K8s自动帮你做的事:

本地学习K8s的推荐方式

# 方法1:Minikube(单机K8s)
minikube start
kubectl get nodes

# 方法2:Kind(Kubernetes in Docker)
kind create cluster

# 方法3:K3s(轻量级K8s,适合树莓派/低配机器)
curl -sfL https://get.k3s.io | sh -

# 方法4:直接用云的托管K8s(阿里云ACK/腾讯云TKE)
# 控制台点几下就能建,省去自己搭建的麻烦

本章小结


⬅️ [上一章:13-网络安全基础](13-网络安全基础.html)   |   ➡️ [下一章:15-人工智能入门](15-人工智能入门.html)
Collaplex · 克拉普莱克斯 collaplex.me · 2026 浙ICP备2026080865号