Docker 与 Kubernetes


一、从虚拟机到容器

在 Docker 之前,虚拟化技术的代表是虚拟机(VMWare、OpenStack)。Docker 这样的容器技术也是虚拟化技术,但属于轻量级虚拟化

虚拟机容器(Docker)
虚拟化层级虚拟整个操作系统共享宿主机内核,只隔离应用环境
启动速度分钟级秒级
体积GB 级(完整 OS)MB 级(只有应用和依赖)
性能损耗较大(多了一层 OS)几乎没有
隔离性强(完全独立的 OS)较弱(共享内核)
代表VMWare、VirtualBox、OpenStackDocker、containerd、Podman

类比

  • 虚拟机像独栋别墅——每家有自己的地基、水电管网、围墙,安全但占地大
  • 容器像公寓套间——共享地基和水电管网,每家只有自己的房间和家具,轻便高效

二、Docker

Abstract

“Build, Ship and Run” — 搭建、发送、运行 “Build once, Run anywhere” — 搭建一次,到处能用

Docker 本身不是容器,它是创建容器的工具,是应用容器引擎

三大核心概念

概念说明类比
镜像(Image)只读的应用模板,包含代码、运行时、依赖、配置安装光盘
容器(Container)镜像的运行实例,可启动、停止、删除用光盘装好的电脑
仓库(Repository)存放和分发镜像的地方应用商店(Docker Hub)

基本工作流

编写 Dockerfile → 构建镜像(build)→ 推送到仓库(push)→ 拉取镜像(pull)→ 运行容器(run)

常用命令速查

docker build -t myapp .           # 根据 Dockerfile 构建镜像
docker images                     # 列出本地镜像
docker run -d -p 8080:80 myapp    # 后台运行容器,映射端口
docker ps                         # 列出运行中的容器
docker stop <container_id>        # 停止容器
docker rm <container_id>          # 删除容器
docker logs <container_id>        # 查看容器日志
docker exec -it <id> /bin/bash    # 进入容器内部
docker push myapp                 # 推送镜像到仓库
docker pull myapp                 # 拉取镜像

Dockerfile 示例

FROM node:18-alpine          # 基础镜像
WORKDIR /app                 # 工作目录
COPY package*.json ./        # 复制依赖描述
RUN npm install              # 安装依赖
COPY . .                     # 复制源码
EXPOSE 3000                  # 声明端口
CMD ["node", "index.js"]     # 启动命令

三、Kubernetes(K8S)

Abstract

K8S 是基于容器的集群管理平台,用于对 Docker 及容器进行更高级、更灵活的管理。全称 kubernetes(k 和 s 之间有 8 个字母,所以简称 K8S)。

为什么需要 K8S?

Docker 解决了单个容器的问题,但生产环境中有成百上千个容器需要管理:

问题Docker 能力K8S 能力
一个容器挂了怎么办?手动重启自动重启、自动迁移
流量变大需要扩容?手动启动更多容器自动扩缩容
多个容器怎么通信?手动配置网络内置服务发现和负载均衡
滚动升级不停服?自己写脚本内置滚动更新和回滚
几百台机器怎么调度?无能为力自动调度到合适的节点

集群架构

一个 K8S 系统称为一个集群(Cluster),由两部分组成:

                    K8S 集群
        ┌──────────────┬──────────────┐
    Master 节点         Node 节点      Node 节点
    (控制平面)         (计算节点)    (计算节点)

Master 节点组件

Open: Pasted image 20260218214114.png

组件职责类比
API Server整个系统的对外接口,供客户端和其它组件调用营业厅
Scheduler对集群内部的资源进行调度,决定 Pod 运行在哪个 Node调度室
Controller Manager管理各种控制器(副本、节点、端点等)大总管
etcd分布式键值存储,保存集群所有配置和状态数据档案室

Node 节点组件

Open: Pasted image 20260218214136.png

组件职责
容器运行时(containerd)创建和运行容器(K8S 1.24 起默认 containerd)
Kubelet监视指派到本 Node 的 Pod,负责创建、修改、监控、删除
Kube-proxy为 Pod 提供网络代理和负载均衡

日志收集

早期文档常把 Fluentd 列为 Node 核心组件,但它实际上是可选的附加组件(add-on),通常以 DaemonSet 形式部署。K8S 本身不内置日志收集方案,常见选择包括 Fluentd、Fluent Bit、Promtail 等。

核心概念

概念说明
PodK8S 最小调度单位,一个 Pod 包含一个或多个紧密关联的容器
Deployment管理 Pod 的副本数量、滚动更新和回滚
Service为一组 Pod 提供稳定的访问地址和负载均衡
Namespace集群内的逻辑隔离(如 dev、staging、production)
ConfigMap / Secret配置管理(明文 / 加密)
IngressHTTP/HTTPS 路由入口,类似反向代理

Pod 和容器的关系

Pod 是”豌豆荚”,容器是”豌豆”。一个豌豆荚里的豌豆共享网络和存储,一起被调度到同一台机器上。大多数情况下一个 Pod 只跑一个容器。


四、Docker vs K8S 的关系

Docker:造集装箱、装货、封箱
K8S:  管理码头上成千上万个集装箱——该放哪、坏了换哪个、怎么调度
DockerK8S
解决什么单个应用的打包和运行大规模容器的编排和管理
粒度单个容器集群(成百上千个容器)
关系K8S 管理 Docker 创建的容器Docker 是 K8S 支持的容器运行时之一

补充

K8S 从 1.24 版本起不再直接支持 Docker,转而使用 containerd 作为默认容器运行时。但 Docker 构建的镜像完全兼容,开发流程不受影响。


相关笔记