2.1 容器技术革命:为什么Docker能替代虚拟机?深度解析Namespace和Cgroup
引言
容器技术正在改变软件开发和部署的方式。Docker作为容器技术的代表,为什么能够替代传统的虚拟机?本文将深入解析容器技术的底层原理,特别是Namespace和Cgroup机制,帮助你理解容器技术的本质。
一、容器 vs 虚拟机
1.1 架构对比
虚拟机架构:
┌─────────────────────────────────────┐ │ 应用程序 │ ├─────────────────────────────────────┤ │ Guest OS │ ├─────────────────────────────────────┤ │ Hypervisor │ ├─────────────────────────────────────┤ │ Host OS │ ├─────────────────────────────────────┤ │ 硬件 │ └─────────────────────────────────────┘容器架构:
┌─────────────────────────────────────┐ │ 容器1 容器2 容器3 │ ├─────────────────────────────────────┤ │ Container Runtime │ ├─────────────────────────────────────┤ │ Host OS │ ├─────────────────────────────────────┤ │ 硬件 │ └─────────────────────────────────────┘1.2 性能对比
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 启动时间 | 分钟级 | 秒级 |
| 资源占用 | 高(需要完整OS) | 低(共享OS) |
| 性能损耗 | 5-15% | 1-3% |
| 隔离性 | 强 | 中等 |
| 可移植性 | 中等 | 高 |
二、Linux Namespace
2.1 Namespace概述
Namespace是Linux内核提供的资源隔离机制,让进程拥有独立的系统视图。
2.2 六种Namespace类型
2.2.1 PID Namespace
进程ID隔离,每个容器有独立的进程树。
# 查看当前进程的PID Namespacels-l /proc/self/ns/pid# 创建新的PID Namespaceunshare --pid --fork /bin/bash2.2.2 Network Namespace
网络隔离,每个容器有独立的网络栈。
# 创建Network Namespaceipnetnsaddtest-ns# 在Namespace中执行命令ipnetnsexectest-nsipaddr# 创建veth对连接两个Namespaceiplinkaddveth0typeveth peer name veth1iplinksetveth1 netns test-ns2.2.3 Mount Namespace
文件系统隔离,每个容器有独立的挂载点。
# 创建Mount Namespaceunshare --mount --fork /bin/bash# 挂载文件系统mount-t tmpfs tmpfs /tmp2.2.4 UTS Namespace
主机名和域名隔离。
# 创建UTS Namespace并修改主机名unshare --uts --fork /bin/bashhostnamecontainer-host2.2.5 IPC Namespace
进程间通信隔离。
# 创建IPC Namespaceunshare --ipc --fork /bin/bash2.2.6 User Namespace
用户和组ID隔离。
# 创建User Namespaceunshare --user --fork /bin/bash2.3 实战:手动创建容器
#!/bin/bash# 创建一个简单的容器环境# 创建新的Namespaceunshare --pid --mount --net --uts --ipc --user --fork --mount-proc /bin/bash<<EOF # 设置主机名 hostname mycontainer # 挂载proc文件系统 mount -t proc proc /proc # 设置网络 ip link set lo up # 运行命令 ps aux hostname EOF三、Linux Cgroup
3.1 Cgroup概述
Cgroup(Control Groups)用于限制和监控进程组的资源使用。
3.2 Cgroup v1子系统
3.2.1 CPU子系统
限制CPU使用。
# 创建CPU cgroupmkdir-p /sys/fs/cgroup/cpu/mycontainerecho50000>/sys/fs/cgroup/cpu/mycontainer/cpu.cfs_quota_usecho100000>/sys/fs/cgroup/cpu/mycontainer/cpu.cfs_period_us# 将进程加入cgroupecho$$>/sys/fs/cgroup/cpu/mycontainer/cgroup.procs3.2.2 Memory子系统
限制内存使用。
# 创建Memory cgroupmkdir-p /sys/fs/cgroup/memory/mycontainerecho100M>/sys/fs/cgroup/memory/mycontainer/memory.limit_in_bytes# 将进程加入cgroupecho$$>/sys/fs/cgroup/memory/mycontainer/cgroup.procs3.2.3 BlkIO子系统
限制块设备IO。
# 创建BlkIO cgroupmkdir-p /sys/fs/cgroup/blkio/mycontainerecho"8:0 1048576">/sys/fs/cgroup/blkio/mycontainer/blkio.throttle.read_bps_device# 将进程加入cgroupecho$$>/sys/fs/cgroup/blkio/mycontainer/cgroup.procs3.3 Cgroup v2
Cgroup v2是新的统一层次结构:
# 挂载cgroup2