关于容器(Docker)的形象比喻

news/2024/11/17 10:37:31/

1 将容器比喻为样板间

容器是一种特殊的进程

容器依赖与Linux操作系统内核的几项技术:namespace、cgroup、chroot

namespace 与编程语言里的 namespace 有点类似,它可以创建出独立的文件系统、主机名、进程号、网络等资源空间,相当于给进程盖了一间小板房,这样就实现了系统全局资源和进程局部资源的隔离。对进程进行隔离,使其不能干扰其他进程。

cgroup 的全称是 Linux Control Group,用来实现对进程的 CPU、内存等资源的优先级和配额限制,相当于给进程的小板房加了一个天花板。限制了进程使用的资源。

chroot 可以更改进程的根目录,也就是限制访问文件系统,相当于给进程的小板房铺上了地砖。

综合运用这三种技术,就可以将进程封装为容器。

普通的进程 + namespace(一重枷锁,能看到什么进程) + 
cgroup(二重枷锁,能用多少资源,内存/磁盘。cpu等) + 
chroot(三重枷锁,能看到什么文件)= 特殊的进程  = 容器

在这里插入图片描述

2 关于 namespace、cgroup、chroot

Namespace
Namespace 是 Linux 内核的一项功能,该功能对内核资源进行隔离,使得容器中的进程都可以在单独的命名空间中运行,并且只可以访问当前容器命名空间的资源。Namespace 可以隔离进程 ID、主机名、用户 ID、文件名、网络访问和进程间通信等相关资源。

Docker 主要用到以下五种命名空间。

pid namespace:用于隔离进程 ID。

net namespace:隔离网络接口,在虚拟的 net namespace 内用户可以拥有自己独立的 IP、路由、端口等。

mnt namespace:文件系统挂载点隔离。

ipc namespace:信号量,消息队列和共享内存的隔离。

uts namespace:主机名和域名的隔离。

Cgroups
Cgroups 是一种 Linux 内核功能,可以限制和隔离进程的资源使用情况(CPU、内存、磁盘 I/O、网络等)。在容器的实现中,Cgroups 通常用来限制容器的 CPU 和内存等资源的使用。

chroot
chroot 是在 Unix 和 Linux 系统的一个操作,针对正在运作的软件行程和它的子进程,改变它外显的根目录。一个运行在这个环境下,经由 chroot 设置根目录的程序,它不能够对这个指定根目录之外的文件进行访问动作,不能读取,也不能更改它的内容。
首先创建一个目录rootfs
mkdir rootfs
然后在rootfs目录下新建三个文件
cd rootfs
touch a b c
此时执行一条命令:chroot /home/centos/rootfs /bin/sh
这条命令意思是启动一个 sh 进程,并且把 /home/centos/rootfs 作为 sh 进程的根目录
此时执行命令:/bin/ls /
就可以显示a b c三个文件,说明当前进程的根目录已经变成了主机上的 /home/centos/rootfs 目录。这样就实现了当前进程与主机的隔离

联合文件系统
联合文件系统,又叫 UnionFS,是一种通过创建文件层进程操作的文件系统,因此,联合文件系统非常轻快。Docker 使用联合文件系统为容器提供构建层,使得容器可以实现写时复制以及镜像的分层构建和存储。常用的联合文件系统有 AUFS、Overlay 和 Devicemapper 等。
参考:
被隔离的进程:一起来看看容器的本质


http://www.ppmy.cn/news/53180.html

相关文章

记录-有意思的气泡 Loading 效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 今日,群友提问,如何实现这么一个 Loading 效果: 这个确实有点意思,但是这是 CSS 能够完成的? 没错,这个效果中的核心气泡效果&am…

【机智云物联网低功耗转接板】+模拟无线远程控制仪表启停

GE211 是机智云自研的定制化的物联网转接板,使用 ESP32-C3-WROOM-02 通讯模块,适用于白色智能家电等设备应用。硬件设计上采用支持 WiFi 和 BLE 的双模无线通信模块,具备TTL电平转换串口,免开发快速接入,提高开发效率。…

前端开发之vue动态路由实现方案

前端开发之vue动态路由实现方案 前言2. 实现1、登录页面创建登录函数和watch监听路由2、调用的login方法(1)登录方法(2)存储token 3、router.push的时候调用路由守卫(1)创建路由守卫,建议路由守…

docker以外挂目录的方式部署springboot项目

前置准备: 清单: 安装有docker的Linuxspringboot打包的jar文件(该项目只有一个返回"hello world"接口) Linux的IP地址:192.168.221.129 springboot项目的接口: 1、上传jar文件至Linux 我上传…

Java有很多初学者常见的问题

作为一门流行的编程语言,Java有很多初学者常见的问题。以下是两个例子: 1.理解Java的数据类型 Java有不同的数据类型,包括整型、浮点型、布尔型等等。初学者可能会困惑如何选择合适的数据类型来存储他们的数据。例如,他们可能会…

thinkphp 的 whereIN() 、where IN 如何使用?

在 ThinkPHP 中,可以通过 whereIN 方法来构建 WHERE IN 子句。以下是 whereIN 方法的语法: $result Db::table(table_name)->whereIn(column, $array)->select();table_name:表示表名;column:表示要查询的列名…

最值得学的编程语言是哪个?

如果让我推荐的话,我肯定首选是python啦! 编程语言是一个计算机的概念,在我们有了计算机以后,想让它帮助我们做事情,就要通过计算机语言和它进行对话、交互,计算机语言能够被计算机所执行,完成…

Java NIO原理机制详解

Java NIO原理机制 什么是NIO Java NIO(New IO)是Java 1.4版本引入的一个新的IO API,与传统的Java IO有着同样的作用和目的,但是使用方式完全不同。NIO支持面向缓冲区的、基于通道的IO操作,可以提供比传统IO更高效、更…