首页 >>  正文

Docker&k8s(一)

来源:www.zuowenzhai.com    作者:编辑   日期:2024-06-08

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界” 。对于 Docker 等大多数 Linux 容器来说, Cgroups 技术 是用来制造约束的主要手段,而 Namespace 技术 则是用来修改进程视图的主要方法。

其实只是 Linux 创建新进程的一个可选参数。我们知道,在 Linux 系统中创建线程的系统调用是 clone(),比如:

​ 这个系统调用就会为我们创建一个新的进程,并且返回它的进程号 pid。而当我们用 clone() 系统调用创建一个新进程时,就可以在参数中指定 CLONE_NEWPID 参数,比如:

​ 这时,新创建的这个进程将会“看到”一个全新的进程空间,在这个进程空间里,它的 PID 是 1。之所以说“看到”,是因为这只是一个“障眼法”,在宿主机真实的进程空间里,这个进程的 PID 还是真实的数值,比如 100。

​ 而 除了 PID Namespace,Linux 操作系统还提供了 Mount、UTS、IPC、Network 和 User 这些 Namespace,用来对各种不同的进程上下文进行“障眼法”操作。

​ 比如,Mount Namespace,用于让被隔离进程只看到当前 Namespace 里的挂载点信息;Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

这,就是 Linux 容器最基本的实现原理了。所以说,容器,其实是一种特殊的进程而已。Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容

优势:更加的轻量且没有损耗资源。弊端:隔离不彻底

Cgroups(Linux Control Group) 就是 Linux 内核中用来为进程设置资源限制的一个重要功能。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等

Cgroups 给用户暴露出来的操作接口是文件系统

比如,向 container 组里的 cfs_quota 文件写入 20 ms(20000 us):

意味着在每 100 ms 的时间里,被该控制组限制的进程只能使用 20 ms 的 CPU 时间,也就是说这个进程只能使用到 20% 的 CPU 带宽。

把被限制的进程的 PID 写入 container 组里的 tasks 文件,上面的设置就会对该进程生效了:

除 CPU 子系统外,Cgroups 的每一项子系统都有其独有的资源限制能力,比如:

Linux Cgroups 的设计还是比较易用的,简单粗暴地理解呢,它就是一个子系统目录加上一组资源限制文件的组合。容器是一个“单进程”模型。

Mount Namespace 修改的,是容器进程对文件系统“挂载点”的认知。Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。实际上,Mount Namespace 正是基于对 chroot 的不断改良才被发明出来的,它也是 Linux 操作系统里的第一个 Namespace。

而这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫作:rootfs(根文件系统)。

对 Docker 项目来说,它最核心的原理实际上就是为待创建的用户进程:

rootfs 只是一个操作系统所包含的文件、配置和目录,并不包括操作系统内核。在 Linux 操作系统中,这两部分是分开存放的,操作系统只有在开机启动时才会加载指定版本的内核镜像。

容器的 rootfs 由如下图所示的三部分组成:

第一部分,只读层 :它是这个容器的 rootfs 最下面的五层,对应的正是 ubuntu:latest 镜像的五层,挂载方式都是只读的(ro+wh,即 readonly+whiteout)

这些层,都以增量的方式分别包含了 Ubuntu 操作系统的一部分

第二部分,可读写层。 (rw)

​ 在没有写入文件之前,这个目录是空的。而一旦在容器里做了写操作,你修改产生的内容就会以增量的方式出现在这个层中。如果要删除AuFS 会在可读写层创建一个 whiteout 文件,把只读层里的文件“遮挡”起来。

专门用来存放你修改 rootfs 后产生的增量,原先的只读层里的内容则不会有任何变化

第三部分,Init 层。

​ 有些文件本来属于只读的 Ubuntu 镜像的一部分,但是用户往往需要在启动容器时写入一些指定的值比如 hostname,所以就需要在可读写层对它们进行修改。可是,这些修改往往只对当前的容器有效,我们并不希望执行 docker commit 时,把这些信息连同可读写层一起提交掉。所以,Docker 做法是,在修改了这些文件之后,以一个单独的层挂载了出来。而用户执行 docker commit 只会提交可读写层,所以是不包含这些内容的。可以参考git ignore的思想。

Dockerfile

ENTRYPOINT:entrypoint才是正统地用于定义容器启动以后的执行体的,其实我们从名字也可以理解,这个是容器的“入口”。

CMD:cmd给出的是一个容器的默认的可执行体。也就是容器启动以后,默认的执行的命令。如果docker run没有指定任何的执行命令或者dockerfile里面也没有entrypoint,那么,就会使用cmd指定的默认的执行命令执行如果你不额外指定,那么就执行cmd的命令,否则呢?只要你指定了,那么就不会执行cmd,也就是cmd会被覆盖。

docker commit,实际上就是在容器运行起来后,把最上层的“可读写层”,加上原先容器镜像的只读层,打包组成了一个新的镜像。当然,下面这些只读层在宿主机上是共享的,不会占用额外的空间。

而由于使用了联合文件系统,你在容器里对镜像 rootfs 所做的任何修改,都会被操作系统先复制到这个可读写层,然后再修改。这就是所谓的:Copy-on-Write。

​ 一个进程的每种 Linux Namespace,都在它对应的 /proc/[进程号]/ns 下有一个对应的虚拟文件,并且链接到一个真实的 Namespace 文件上。

这也就意味着:一个进程,可以选择加入到某个进程已有的 Namespace 当中,从而达到“进入”这个进程所在容器的目的,这正是 docker exec 的实现原理。

Volume 机制,允许你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。

​ 当容器进程被创建之后,尽管开启了 Mount Namespace,但是在它执行 chroot(或者 pivot_root)之前,容器进程一直可以看到宿主机上的整个文件系统。所以在 rootfs 准备好之后,在执行 chroot 之前,把 Volume 指定的宿主机目录(比如 /home 目录),挂载到指定的容器目录(比如 /test 目录)在宿主机上对应的目录(即 /var/lib/docker/aufs/mnt/[可读写层 ID]/test)上,这个 Volume 的挂载工作就完成了。

​ 由于执行这个挂载操作时,“容器进程”已经创建了,也就意味着此时 Mount Namespace 已经开启了。所以,这个挂载事件只在这个容器里可见。你在宿主机上,是看不见容器内部的这个挂载点的。这就 保证了容器的隔离性不会被 Volume 打破

​ 而这里要使用到的挂载技术,就是 Linux 的 绑定挂载(bind mount)机制 。它的主要作用就是,允许你将一个目录或者文件,而不是整个设备,挂载到一个指定的目录上。并且,这时你在该挂载点上进行的任何操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来且不受影响。绑定挂载实际上是一个 inode 替换的过程。在 Linux 操作系统中,inode 可以理解为存放文件内容的“对象”,而 dentry,也叫目录项,就是访问这个 inode 所使用的“指针”。

所以,在一个正确的时机,进行一次绑定挂载,Docker 就可以成功地将一个宿主机上的目录或文件,不动声色地挂载到容器中。




17274962178在docker编译之后还能看到原有文件吗
明滕钥答:还能。ocker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,在编译之后还能看到原有文件,在image里,image包含了docker源码编译所需的所有文件。

17274962178oswald是什么意思
明滕钥答:oswald的意思是奥斯瓦德。因为上世纪60年代,有个叫Ron Frazer的喜剧演员需要给一个人设是大粗老爷们的角色起名字,而澳大利亚叫Oscar奥斯卡的人很多,所以Ron Frazer就用Oscar的缩短式Ocker作为了这个角色的名字。为什么英国那时候叫Oscar的人多呢?因为那个时代,包括拿破仑和大诗人歌德在内的欧洲上流社会都...

17274962178澳洲本土词汇
明滕钥答:这个就是袋鼠 9. Ocker 这个是澳客、烂客人 10. Crikey 表惊讶 例句: Crikey, that ocker is drinking beer on the bus!11. Good on ya 就是指“干得好”,well done的意思,也可以把后面两个字连起来写变成Good onya 12.Bottle shop 不是卖瓶子的店,是卖瓶装酒的,不是夜店(...

17274962178dockerrun运行后没有unabletofindimag
明滕钥答:ockerrun运行后没有unabletofindimag的原因是以下原因导致的:1、镜像名称或标签错误:在运行Docker容器时,需要指定正确的镜像名称和标签。如果指定的镜像名称或标签错误,Docker就无法找到对应的镜像,从而导致“无法找到图像”的错误。此时需要检查镜像名称和标签是否正确。2、镜像不存在或未下载:如果指定的...

17274962178德语中是不是有些表示颜色的词作形容词时不用变格?如果是,有哪些...
明滕钥答:beige, bleu, chamois, champagner, cognac, creme, frais(e), lavendel, ocker, oliv, pensee, orange, rosa, türkis.

17274962178请求英文高手帮我收集一些新兴的英文词汇
明滕钥答:to address Prime Minister Paul Keating)ocker – an unsophisticated male blue–collar who drinks and is sports–mad, especially into footy oldies – parents. "Old Man" and "Old Girl" refer to Father and Mother respectively.Petrol Head - term used for a Hoon. (see Hoon)...

17274962178五个字母的英文第三字母为k
明滕钥答:maker n. 制造者;造物主;出期票人 naked adj. 裸体的;无装饰的;无证据的;直率的 nekal n. [有化] 二丁基萘磺酸钠;拉开粉 Orkut n. Google公司推出的一个社交网站 ocker 等等 还有不少 这里就提供这些,有兴趣的话,可以再通过相关英语资料查找更多的符合你要求的词语。

17274962178星系边缘传来“嗡嗡声”,旅行者1号突收神秘信号,是谁发出的?
明滕钥答:在抵达星际空间前后,NASA已经放弃了对旅行者一号的绝大部分控制,任由它漫无目的地飞行,用以节约能量。如今它已经距离地球有225亿公里远了,也就在最近,沉寂已久的旅行者1号突然发回了一段数据,康奈尔大学天文学博士生斯特拉·科赫·奥克(Stella Koch Ocker)对信号进行了处理,最后发现是一段“嗡...

17274962178【急求】德语的色彩翻译
明滕钥答:颜色  colour  die Farbe 黑色  black  schwarz 蓝色  blue  blau 棕色  brown  braun 绿色  green  grün 灰白  grey  grau 亮色  light  hell 橘黄色  orange  orange 粉红色  pink  rosa 紫色  purple  lila ...

17274962178win10下docker挂载文件夹报错
明滕钥答:报错 docker: Error response from daemon: status code not OK but 500: � ����� � FDocker.Core, Version=2.5.0.49550, Culture=neutral, PublicKeyToken=null�� ocker.Core.DockerException ClassNameMessa...


(编辑:费荆伦)
联系方式:
关于我们 | 客户服务 | 服务条款 | 联系我们 | 免责声明 | 网站地图
@ 作文摘要网