容器,到底怎么一回事

简介: 用故事的方式让你记住。同时解释实现容器的关键技术。

容器是一种沙盒技术。那什么是沙盒呢?

沙盒就像一个装着小猫的纸箱,把小猫“放”进去的技术。不同的小猫之间,因为有了纸箱的边界,而不至于互相干扰,纸箱 A 中吃饭的小猫并不会打扰到纸箱 B 中睡觉的小猫;而被装进纸箱的小猫,也可以方便地搬来搬去,你不用再去找它躲在哪里了!

我用了小猫在纸箱中的例子,其实想表达沙盒技术的两个能力,“隔离”和“迁移”。这两个能力,要如何用技术手段去实现呢?

我们先思考这样一个问题,一个加法程序是如何在计算机上运行的?

我们假设它需要输入值,处理值,输出值,才能完成了一次闭环。在输入值时,输入值会被加载到内存中待命。随后在处理逻辑中,操作系统又读到了加法的指令,操作系统告诉 CPU 进行加法操作。CPU 与内存协作,完成加法计算,又会使用寄存器存放输出值、内存堆栈保存执行的命令和变量。最后,再把计算结果,输出值,保存到指定位置。

这样的加法程序,它就是磁盘上的二进制文件,一旦被执行,它就需要内存中的数据、寄存器的值、堆栈中的指令等,这些条件的执行环境汇总起来,就是进程。对于进程来说,它的静态表现就是程序,平时就老老实实的待在磁盘上;一旦运行起来,它便有了动态表现,变成了计算机里的数据和状态的总和。

而容器的核心功能,“隔离”,就是通过约束和修改进程的动态表现,创造出一个“纸箱”,也就是“边界”。

在 Linux 系统中,Namespace、Cgroups 机制是用来制造约束的主要手段。

Namespace 是 Linux 在创建新进程的一个可选参数,Linux 通过系统调用函数 clone() 来创建进程:

int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 

在可选参数中添加 CLONE_NEWPID 后,我们就使用了一把 Namespace 机制,clone() 会返回新创建进程的 PID,此时 PID 对应的进程空间中,再运行新的程序,这个新进程的 PID 会是 1。而在宿主机真实的进程空间里,这个新创建的进程 PID 还是真实的数值,它的前面有着之前已经运行的进程。

除了刚刚用到的 CLONE_NEWPID -> PID Namespace,Linux 还提供了 Mount、Network 等 Namespace,用于约束和修改进程。比如 Mount Namespace,用于让被隔离的进程只看到当前 Namespace 里的挂载点信息;Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

以上就是 Linux 容器最基本的实现原理了。Docker 容器,实际上是在创建容器进程时,指定了进程所需要启用的一组 Namespace 参数。这样容器就只能“看”到当前 Namespace 所限定的资源、设备等。

我们理解 Namespace 的工作方式后,就可以知道,容器就是一种特殊的进程而已。

目录
相关文章
|
前端开发 JavaScript 测试技术
深入理解Web3:构建去中心化应用的未来
本文将探讨Web3技术的核心原理及其在构建去中心化应用(DApps)中的应用。我们将从Web3的定义开始,深入到其背后的区块链技术,智能合约,以及如何通过使用现代编程语言和框架实现去中心化应用的开发。此外,本文还将探讨当前Web3生态系统中面临的挑战和机遇,为读者提供一个全面的Web3技术概览,旨在启发开发者和技术爱好者探索去中心化世界的无限可能。
|
2月前
|
消息中间件 运维 调度
【分布式】分布式核心组件——分布式事务:2PC、TCC、SAGA、本地消息表、事务消息、最大努力通知以及各方案适用场景
本文系统梳理分布式事务核心知识:从CAP/BASE理论基石出发,对比2PC(强一致)、TCC(高并发同步)、SAGA(长事务)、本地消息表、事务消息、最大努力通知六大方案,涵盖原理、优劣、适用场景及选型决策框架,强调“无银弹”,重在业务匹配与工程落地。
|
11月前
|
缓存 数据库连接 数据库
缓存三剑客(穿透、击穿、雪崩)
缓存穿透指查询数据库和缓存中都不存在的数据,导致请求直接冲击数据库。解决方案包括缓存空对象和布隆过滤器。缓存击穿是大量请求访问同一个失效的热点数据,使数据库瞬间压力剧增,解决方法有提前预热、设置永不过期、加锁限流等。缓存雪崩是大量key同时失效,导致所有请求直达数据库,可通过引入随机过期时间缓解。三者分别对应单点爆破、全面崩塌等问题,需根据场景选择合适策略优化系统性能与稳定性。
598 0
|
运维 负载均衡 安全
slb传统硬件负载均衡器的性能瓶颈
【11月更文挑战第3天】
522 4
Linux中的错误码
Linux中的错误码
|
负载均衡 网络协议
使用LVS搭建集群实现负载均衡(二)安装使用
【8月更文挑战第8天】使用LVS搭建集群实现负载均衡(二)安装使用
325 5
|
canal 消息中间件 缓存
面试题:如何解决缓存和数据库的一致性问题?
面试题:如何解决缓存和数据库的一致性问题?
719 1
|
存储 负载均衡 数据管理
分区和分片
分区和分片
966 5
|
负载均衡 安全 应用服务中间件
微服务架构中的API网关模式与实践
在微服务架构中,API网关扮演着至关重要的角色。它不仅是客户端请求和服务之间的中介,而且负责请求的路由、聚合以及协议转换等关键功能。本文将深入探讨API网关的设计原则、实现方式及其在现代后端系统中的应用,同时提供具体案例分析以展示其在实际项目中的有效运用。
|
数据采集 存储 测试技术
C语言高效的网络爬虫:实现对新闻网站的全面爬取
C语言高效的网络爬虫:实现对新闻网站的全面爬取