01-容器本质与基础概念
学习目标
- 理解容器与虚拟机的本质区别
- 掌握 Linux 容器的核心技术栈
- 了解容器技术的发展历程
- 建立容器技术的整体认知框架
前置知识
- Linux 基础命令操作
- 进程和线程概念
- 操作系统基础原理
一、容器的本质
1.1 容器 ≠ 虚拟机
容器和虚拟机是两种完全不同的虚拟化技术:
特性 | 容器 (Container) | 虚拟机 (VM) |
---|---|---|
虚拟化层级 | 操作系统级虚拟化 | 硬件级虚拟化 |
资源开销 | 轻量级,共享内核 | 重量级,独立内核 |
启动速度 | 秒级 | 分钟级 |
资源利用率 | 高 | 低 |
隔离程度 | 进程级隔离 | 硬件级隔离 |
技术基础 | Linux Namespace + CGroup | Hypervisor |
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 为什么容器如此重要?
- 开发效率:一次构建,到处运行
- 资源效率:比虚拟机节省 50-90% 资源
- 部署效率:秒级启动,快速扩缩容
- 运维效率:标准化环境,减少环境差异
二、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 关键里程碑
- 2008 - LXC:第一个完整的 Linux 容器实现
- 2013 - Docker:让容器技术普及化
- 2014 - Kubernetes:容器编排成为主流
- 2015 - OCI:容器技术标准化
- 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 基础阶段
- 理解概念 → 容器 vs 虚拟机
- 掌握原理 → Namespace + CGroup
- 手动实践 → 命令行创建容器
- 代码实现 → Go 语言实现
5.2 进阶阶段
- 网络技术 → 容器网络原理
- 存储技术 → 文件系统和镜像
- 安全机制 → 权限控制和隔离
- 调试技术 → 故障排查和性能优化
5.3 专家阶段
- 标准化 → OCI 规范实现
- 插件开发 → CNI/CSI 插件
- 编排技术 → Kubernetes 集成
- 生产实践 → 大规模部署优化
️ 六、实践准备
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 隔离机制,这是容器技术的核心基础!