容器,到底怎么一回事

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 用故事的方式让你记住。同时解释实现容器的关键技术。

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

沙盒就像一个装着小猫的纸箱,把小猫“放”进去的技术。不同的小猫之间,因为有了纸箱的边界,而不至于互相干扰,纸箱 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 的工作方式后,就可以知道,容器就是一种特殊的进程而已。

目录
相关文章
|
3月前
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
|
6月前
|
容器
容器的通俗讲解
容器的通俗讲解
72 0
|
6月前
|
Kubernetes Cloud Native 网络协议
一文搞懂“镜像“和“容器“
一文搞懂“镜像“和“容器“
105 1
|
运维 Cloud Native Java
不得不提的容器 JVM
当我们将 JVM 生态中的关键要素,例如,垃圾收集器、堆大小和运行时编译器设置默认值时,许多技术人员(开发、运维人员)或许应该意识到在 Linux 容器生态中(诸如,Docker、Rkt、RunC、Lxcfs 等)内所运行的 Java 进程的实际行为与预期不符。当我们在没有任何调优参数(例如,最为简洁的的启动命令行:“ java -jar myapplication .jar”)的情况下执行 Java 应用程序时,JVM 将自行调整某些特定的参数,以在当前执行环境中获得最佳性能表现。
188 0
|
弹性计算 Kubernetes Cloud Native
一文搞懂Kubernetes容器运行原理
Hello folks,我是 Luga,今天我们来分享一下与云原生体系有关的话题- 云原生技术-Container。 作为一个“核心”要素之一,容器技术在云原生生态中发挥着重要的意义。
189 0
|
Kubernetes Cloud Native 安全
【探索 Kubernetes|容器基础进阶篇 系列1】容器的本质是进程
大家好,我是秋意零。 😈 CSDN作者主页 • 😎 博客主页 👿 简介 • 👻 普通本科生在读 • 在校期间参与众多计算机相关比赛,如:🌟 “省赛”、“国赛”,斩获多项奖项荣誉证书 • 🔥 各个平台,秋意零/秋意临 账号创作者 • 🔥 云社区 创建者 点赞、收藏+关注下次不迷路! 欢迎加入云社区
199 0
|
算法 程序员 C++
序言 容器
序言 容器
76 0
|
安全 网络协议 Shell
容器运行时的保护(二)| 学习笔记
快速学习容器运行时的保护。
容器运行时的保护(二)| 学习笔记
|
弹性计算 Kubernetes Ubuntu
通俗易懂的告诉你容器是什么
1.Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。 2.Docker包括:镜像(Image)、容器(Container)、仓库(Repository),后面会重点介绍。 3.K8S,全称kubernetes,是基于容器的集群管理平台,可以先简单理解为是管理容器的:可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
1458 0
通俗易懂的告诉你容器是什么
|
存储 Kubernetes Cloud Native
容器运行时探讨--从dockershim正式从K8s删除说起
2022年05月,Kubernetes 1.24正式发布,比较引人注目的就是在这个版本中正式将dockershim 组件从 kubelet 中删除。从这个版本开始,用户使用Kubernetes时需要优先选择containerd 或 CRI-O作为容器运行时。如果希望继续依赖 Docker Engine 作为容器运行时,需要cri-dockerd组件。
732 0
下一篇
无影云桌面