云原生学习笔记(三) 容器的底层原理:Namespace、Cgroups 与文件系统魔法

114 阅读3分钟

一、容器不是“黑魔法”:它只是 Linux 特性的组合应用

很多初学者觉得容器很神奇,仿佛在一台机器里运行了“多个系统”。其实容器并不是真正意义上的独立系统,它只是通过 Linux 提供的一些机制,把进程“隔离”起来——看上去像一个小型操作系统,实则只是个进程空间。

这背后的关键技术有三大支柱:


二、Namespace:隔离世界的六道屏障

容器通过 Linux 的 Namespace 功能来实现资源隔离,确保每个容器像独立的“世界”一样运作。

Namespace 类型作用举例
pid每个容器拥有自己的进程编号空间
net容器有自己独立的虚拟网络接口
mnt文件系统挂载点隔离
uts主机名、域名隔离
ipc信号量、消息队列隔离
user容器中的用户 UID 与主机可不同

👉 Namespace 就是让容器进程“自以为在一个完整系统中”运行的关键技术。


三、Cgroups:限制容器的资源占用

如果没有限制,某个容器可以无限吃掉宿主机的内存和 CPU。为了控制资源分配,Linux 引入了 Cgroups(Control Groups)

  • CPU 限额:防止某容器吃满 CPU
  • 内存限制:设置最大内存使用量,防止 OOM
  • 磁盘 I/O 限制:控制读写速率,防止拖慢整个系统

💡 Cgroups 是 Kubernetes 能够“精细调度”的底层基础之一。


四、镜像分层结构:OverlayFS 是怎么做到节省空间的?

镜像并不是完整复制一个操作系统,而是 分层构建的“只读+读写”叠加结构

Docker 常用的文件系统类型有:

  • OverlayFS(主流):通过将多个只读层 + 一个读写层叠加在一起构建容器
  • UnionFS:早期实现(aufs 也属于该类)

📦 分层构建的优势:

  • 共享基础层,节省存储空间
  • 每一层都可缓存复用,加快构建速度
  • 容器运行时只有最顶层可写,其他只读,便于管理

五、Docker 的由来:从 DotCloud 到开源革命

Docker 诞生于 2013 年,由 DotCloud 公司在 PyCon 大会上开源,很快引发行业革命:

  • 以前部署流程繁琐、环境依赖不一致
  • Docker 提供了可打包、可移植、可重用的容器镜像
  • 推动了 CI/CD 的标准化和基础设施即代码理念

📌 简单一句话总结:Docker 把“构建 + 运行环境”变成了代码的一部分。


六、Docker 核心组件详解

概念功能说明
Dockerfile构建镜像的“脚本”,定义依赖、命令等
Image容器的只读打包文件,可以复用分发
Container镜像运行起来的实例,状态可读写
Registry镜像仓库,DockerHub 或私有 Harbor
CLI / DaemonDocker 命令与后台守护进程

七、实战:用 Docker 打包并运行一个 Python Flask 应用

🧪 示例目录结构:

flask-app/
├── app.py
└── Dockerfile

✏️ 示例代码:

app.py

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, Docker!"

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

Dockerfile

FROM python:3.9-slim
WORKDIR /app
COPY app.py .
RUN pip install flask
CMD ["python", "app.py"]

🧱 构建并运行:

docker build -t flask-demo .
docker run -p 5000:5000 flask-demo

访问 http://localhost:5000 即可看到效果。


八、容器的意义:不仅仅是“打包运行”

通过容器,开发人员可以:

  • 开发环境与生产环境完全一致
  • 部署过程自动化、版本可控
  • 将基础设施变成代码的一部分(IaC)

Docker 引发的容器化浪潮,不只是工具演进,而是开发运维范式的变革。


✅ 总结一句话:

容器本质是 Linux 的“组合拳”,Docker 则是这套拳法的工业化包装。它让容器真正走进开发者与工程团队的日常实践中。