HiHuo
首页
博客
手册
工具
首页
博客
手册
工具
  • 手撸容器系统

    • 完整手撸容器技术文档系列
    • 01-容器本质与基础概念
    • 02-Namespace隔离机制
    • 03-CGroup资源控制
    • 04-Capabilities与安全机制
    • 05-容器网络原理
    • 06-网络模式与实现
    • 07-CNI插件开发
    • 08-RootFS与文件系统隔离
    • 09-OverlayFS镜像分层
    • 10-命令行手撸容器
    • 11-Go实现最小容器
    • 12-Go实现完整容器
    • 13-容器生命周期管理
    • 14-调试技术与工具
    • 15-OCI规范与标准化
    • 16-进阶场景与优化
    • 常见问题与故障排查
    • 参考资料与延伸阅读

01-容器本质与基础概念

学习目标

  • 理解容器与虚拟机的本质区别
  • 掌握 Linux 容器的核心技术栈
  • 了解容器技术的发展历程
  • 建立容器技术的整体认知框架

前置知识

  • Linux 基础命令操作
  • 进程和线程概念
  • 操作系统基础原理

一、容器的本质

1.1 容器 ≠ 虚拟机

容器和虚拟机是两种完全不同的虚拟化技术:

特性容器 (Container)虚拟机 (VM)
虚拟化层级操作系统级虚拟化硬件级虚拟化
资源开销轻量级,共享内核重量级,独立内核
启动速度秒级分钟级
资源利用率高低
隔离程度进程级隔离硬件级隔离
技术基础Linux Namespace + CGroupHypervisor

1.2 容器本质:进程的"包装"

容器的本质就是被特殊"包装"的 Linux 进程:

graph TD
    A[Linux 内核] --> B[Namespace 隔离]
    A --> C[CGroup 资源控制]
    A --> D[RootFS 文件系统]
    A --> E[Capabilities 权限控制]
    
    B --> F[容器进程]
    C --> F
    D --> F
    E --> F
    
    F --> G[看起来像独立系统]
    F --> H[实际上共享内核]

关键理解:

  • 容器进程运行在同一个 Linux 内核上
  • 通过 Namespace 让进程"看到"不同的世界
  • 通过 CGroup 限制进程能使用的资源
  • 通过 RootFS 提供独立的文件系统视图

1.3 为什么容器如此重要?

  1. 开发效率:一次构建,到处运行
  2. 资源效率:比虚拟机节省 50-90% 资源
  3. 部署效率:秒级启动,快速扩缩容
  4. 运维效率:标准化环境,减少环境差异

二、Linux 容器的核心技术栈

2.1 四大核心技术

graph LR
    A[Linux 容器] --> B[Namespace 隔离]
    A --> C[CGroup 资源控制]
    A --> D[RootFS 文件系统]
    A --> E[Capabilities 安全]
    
    B --> B1[UTS - 主机名隔离]
    B --> B2[PID - 进程隔离]
    B --> B3[MNT - 文件系统隔离]
    B --> B4[NET - 网络隔离]
    B --> B5[IPC - 进程间通信隔离]
    B --> B6[USER - 用户隔离]
    
    C --> C1[CPU 限制]
    C --> C2[内存限制]
    C --> C3[IO 限制]
    C --> C4[进程数限制]
    
    D --> D1[chroot/pivot_root]
    D --> D2[OverlayFS 分层]
    D --> D3[镜像管理]
    
    E --> E1[权限降级]
    E --> E2[系统调用过滤]
    E --> E3[强制访问控制]

2.2 技术栈详解

Namespace - 隔离"我看到的世界"

  • 作用:让进程拥有独立的系统视图
  • 原理:内核为每个 namespace 维护独立的资源表
  • 实现:通过 clone() 系统调用的 flags 参数

CGroup - 限制"我能用的资源"

  • 作用:控制进程能使用的系统资源
  • 原理:内核在资源分配时检查 cgroup 限制
  • 实现:通过 /sys/fs/cgroup/ 文件系统接口

RootFS - 提供"我的文件系统"

  • 作用:让容器拥有独立的文件系统视图
  • 原理:通过 chroot() 或 pivot_root() 切换根目录
  • 实现:结合 Mount Namespace 实现完全隔离

Capabilities - 控制"我能做什么"

  • 作用:限制进程的系统权限
  • 原理:将 root 权限细分为多个 capability
  • 实现:通过 setcap() 和 seccomp() 系统调用

三、容器技术发展历程

3.1 历史演进

timeline
    title 容器技术发展历程
    
    1979 : chroot 系统调用
         : Unix 系统首次引入进程隔离
    
    2000 : FreeBSD Jails
         : 第一个完整的容器实现
    
    2004 : Solaris Zones
         : 商业级容器技术
    
    2006 : Linux VServer
         : Linux 容器技术萌芽
    
    2008 : LXC (Linux Containers)
         : 第一个完整的 Linux 容器实现
    
    2013 : Docker
         : 容器技术普及化
    
    2014 : Kubernetes
         : 容器编排平台
    
    2015 : OCI 标准
         : 容器标准化
    
    2017 : containerd
         : 容器运行时标准化
    
    2020 : 云原生生态
         : 容器技术成熟期

3.2 关键里程碑

  1. 2008 - LXC:第一个完整的 Linux 容器实现
  2. 2013 - Docker:让容器技术普及化
  3. 2014 - Kubernetes:容器编排成为主流
  4. 2015 - OCI:容器技术标准化
  5. 2017 - containerd:容器运行时标准化

️ 四、容器技术架构

4.1 整体架构图

graph TB
    subgraph "用户空间"
        A[Docker CLI] --> B[Docker Engine]
        B --> C[containerd]
        C --> D[runc]
        D --> E[容器进程]
    end
    
    subgraph "Linux 内核"
        F[Namespace] --> E
        G[CGroup] --> E
        H[RootFS] --> E
        I[Capabilities] --> E
    end
    
    subgraph "硬件层"
        J[CPU]
        K[内存]
        L[存储]
        M[网络]
    end
    
    E --> J
    E --> K
    E --> L
    E --> M

4.2 各组件职责

组件职责技术实现
Docker CLI用户接口Go 语言,REST API
Docker Engine容器管理Docker API,镜像管理
containerd容器运行时gRPC API,生命周期管理
runc底层运行时OCI 标准,系统调用封装
Linux 内核资源隔离Namespace + CGroup

五、学习路线图

5.1 基础阶段

  1. 理解概念 → 容器 vs 虚拟机
  2. 掌握原理 → Namespace + CGroup
  3. 手动实践 → 命令行创建容器
  4. 代码实现 → Go 语言实现

5.2 进阶阶段

  1. 网络技术 → 容器网络原理
  2. 存储技术 → 文件系统和镜像
  3. 安全机制 → 权限控制和隔离
  4. 调试技术 → 故障排查和性能优化

5.3 专家阶段

  1. 标准化 → OCI 规范实现
  2. 插件开发 → CNI/CSI 插件
  3. 编排技术 → Kubernetes 集成
  4. 生产实践 → 大规模部署优化

️ 六、实践准备

6.1 环境要求

  • 操作系统:Linux (Ubuntu 22.04+ 推荐)
  • 权限:root 权限或 sudo 权限
  • 内核版本:3.10+ (支持 namespaces 和 cgroups)
  • 内存:至少 2GB RAM
  • 存储:至少 10GB 可用空间

6.2 必要工具

# 基础工具
sudo apt-get update
sudo apt-get install -y \
    curl \
    wget \
    git \
    vim \
    htop \
    strace \
    iproute2 \
    iptables \
    bridge-utils

# Go 开发环境
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc

6.3 内核特性检查

# 检查 namespace 支持
ls /proc/self/ns/

# 检查 cgroup 支持
ls /sys/fs/cgroup/

# 检查 overlayfs 支持
cat /proc/filesystems | grep overlay

七、验证检查清单

基础概念理解

  • [ ] 能够解释容器与虚拟机的区别
  • [ ] 理解容器的本质是"被包装的进程"
  • [ ] 掌握四大核心技术的作用
  • [ ] 了解容器技术发展历程

环境准备

  • [ ] Linux 环境已就绪
  • [ ] 必要工具已安装
  • [ ] 内核特性支持检查通过
  • [ ] 开发环境配置完成

学习进度

  • [ ] 完成本章理论学习
  • [ ] 理解整体技术架构
  • [ ] 明确后续学习路径
  • [ ] 准备好进入实践阶段

相关链接

  • 02-Namespace隔离机制 - 深入理解进程隔离
  • 03-CGroup资源控制 - 掌握资源限制技术
  • 17-环境准备与依赖 - 详细环境配置指南

下一步:让我们深入理解 Namespace 隔离机制,这是容器技术的核心基础!

Prev
完整手撸容器技术文档系列
Next
02-Namespace隔离机制