01-容器本质与基础概念
学习目标
- 理解容器与虚拟机的本质区别
- 掌握 Linux 容器的核心技术栈
- 了解容器技术的发展历程
- 建立容器技术的整体认知框架
前置知识
- Linux 基础命令操作
- 进程和线程概念
- 操作系统基础原理
一、容器的本质
1.1 容器 ≠ 虚拟机
容器和虚拟机是两种完全不同的虚拟化技术:
| 特性 | 容器 (Container) | 虚拟机 (VM) |
|---|---|---|
| 虚拟化层级 | 操作系统级虚拟化 | 硬件级虚拟化 |
| 资源开销 | 轻量级,共享内核 | 重量级,独立内核 |
| 启动速度 | 秒级 | 分钟级 |
| 资源利用率 | 高 | 低 |
| 隔离程度 | 进程级隔离 | 硬件级隔离 |
| 技术基础 | Linux Namespace + CGroup | Hypervisor |
1.2 容器本质:进程的"包装"
容器的本质就是被特殊"包装"的 Linux 进程:
关键理解:
- 容器进程运行在同一个 Linux 内核上
- 通过 Namespace 让进程"看到"不同的世界
- 通过 CGroup 限制进程能使用的资源
- 通过 RootFS 提供独立的文件系统视图
1.3 为什么容器如此重要?
- 开发效率:一次构建,到处运行
- 资源效率:比虚拟机节省 50-90% 资源
- 部署效率:秒级启动,快速扩缩容
- 运维效率:标准化环境,减少环境差异
二、Linux 容器的核心技术栈
2.1 四大核心技术
2.2 技术栈详解
Namespace - 隔离"我看到的世界"
- 作用:让进程拥有独立的系统视图
- 原理:内核为每个 namespace 维护独立的资源表
- 实现:通过
clone()系统调用的 flags 参数
CGroup - 限制"我能用的资源"
- 作用:控制进程能使用的系统资源
- 原理:内核在资源分配时检查 cgroup 限制
- 实现:通过
/sys/fs/cgroup/文件系统接口
RootFS - 提供"我的文件系统"
- 作用:让容器拥有独立的文件系统视图
- 原理:通过
chroot()或pivot_root()切换根目录 - 实现:结合 Mount Namespace 实现完全隔离
Capabilities - 控制"我能做什么"
- 作用:限制进程的系统权限
- 原理:将 root 权限细分为多个 capability
- 实现:通过
setcap()和seccomp()系统调用
三、容器技术发展历程
3.1 历史演进
3.2 关键里程碑
- 2008 - LXC:第一个完整的 Linux 容器实现
- 2013 - Docker:让容器技术普及化
- 2014 - Kubernetes:容器编排成为主流
- 2015 - OCI:容器技术标准化
- 2017 - containerd:容器运行时标准化
️ 四、容器技术架构
4.1 整体架构图
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 隔离机制,这是容器技术的核心基础!