众所周知,Kubernetes 是一个容器集群管理系统,提供以容器为中心的基础架构。在了解Kubernetes 之前,我们首先要知道容器是什么。那又应该怎么去理解容器呢?
一、 怎么理解 “容器”
容器来源于英文中的 container 一词,也就是集装箱的意思,那为什么要把容器比作集装箱呢?首先,我们先来看下图,了解一下生活中的集装箱是什么样子的
看完之后,是不是发现自己的强迫症被治好了?
首先我们从外形上来看,是不是觉得同一型号的集装箱,大小尺寸内在空间都是一样的,是不是感觉像是有一台大机器,放进去制造集装箱的原材料,咔咔一下,出来的就是一个个一模一样的集装箱了。我们想让容器达到的效果也是这样的,只要提供的原材料(镜像)一样,得到的结果(运行实例)都是一样的。
其次集装箱的功能当然是可以对货物进行打包隔离了,将两个不同公司的货物分别放在不同的集装箱里,这样卸货的时候就不会混在一起了。
最后我们再来关注下集装箱里面的东西(毕竟我们不是一个只看外表这么肤浅的人),不管外面是刮风还是下雨,这个集装箱在北京还是上海,只要集装箱没有损坏,我们最初放进去的东西就会一直在集装箱里面,完好无损。也就是说,我们只要将货物装进集装箱之后,就可以很轻松地利用集装箱来运输货物,运输期间不必担心集装箱里的货物,等到运输完成后,打开集装箱得到的依旧是我们之前放进去的东西。
二、容器的目的、本质是什么
从容器(container)的名字上,我们就能够非常直观地看出容器的优点,“提供的原材料(镜像)一样,得到的结果(运行实例)一样”、“打包隔离”、“轻松运输” 等。
如果把容器类比成集装箱的话,那运行的服务或服务对应的多个进程就应该是集装箱里对应的货物了,可以很自然地想到,容器的目的就是为进程集合提供一个独立的运行环境。那我们具体应该怎么实现 “独立的运行环境” 呢?
1. 文件系统隔离
- 每个容器都具有独立的文件系统,单个容器内对文件系统进行增删改查不会影响到其他容器
- 参考 Linux 下的 chroot 命令,可以将子目录变为根目录
2. 资源隔离
- 利用 namespace 隔离进程之间的相互可见及通信
- 使用 Cgroup 限制资源使用率,设置其能够使用的 CPU 以及内存量的大小
所以容器的本质就是一个视图隔离、资源可限制、独立文件系统的进程集合,它将系统的其他资源隔离开来,具有自己独立的资源视图。“视图隔离”,指的是能够看到部分进程、有独立的主机名,“资源可限制”,指的是可以限制内存大小、CPU 使用个数等。
三、镜像是什么
我们之前提到过,容器有一个独立的文件系统,它包含了容器运行时所需要的全部文件。我们将容器运行时所需要的所有文件集合称为容器镜像。
那我们怎么去生成容器的镜像呢?一般来讲,我们会通过 Dockerfile 来构建镜像,通过 Dockerfile 的语法糖我们可以很方便的构建一个镜像,这个语法糖我们会在之后学到。
有了自己的镜像之后,我们会想,能不能把镜像都放在一个地方统一管理,就像 GitHub 一样,可以把自己的镜像分享给别人,也可以直接使用别人的镜像,于是我们把镜像放置、统一管理的地方,称之为镜像仓库。我们可以像操作 GitHub 那样(push、pull)对镜像进行操作。
四、如何得到容器
1. 构建一个镜像,可以直接从镜像仓库拉取,也可以自己手动生成,目的是为容器提供生成它所需要的一切
2. 运行镜像得到想要的容器
五、数据卷
进行到这里,我们先对容器和镜像小小的总结一下:
1. 一个镜像相当于一个模版,一个容器就像是这个模版生成的具体的运行实例
2. 运行一个容器,就是选择某一个镜像来提供独立的文件系统并指定相应的运行程序
很明显地,容器的生命周期就和我们指定的运行程序的生命周期一致,我们也叫这个运行程序为 initial 进程,initial 进程也可以产生其他子进程。当 initial 进程退出时 ,所有的子进程也会随之退出。这样看起来,管理容器就约等于管理运行程序了。
但是这样的话,initial 进程退出,所有子进程也退出,运行程序运行产生的一些数据我们怎么能拿到并且持久化到指定目录上呢?数据卷的概念就应运而生了。
容器可以将数据持久化到指定的目录上,这个目录就叫做数据卷。数据卷最明显的特点就是,它的生命周期是独立于容器的生命周期的。
数据卷的管理方式
1. 将目录直接挂载在容器内部,这种方式最简单,但是却提高了运维成本
2. 运行引擎管理
One more thing
提到容器肯定会联想到大名鼎鼎的 docker,因为docker实在是太出名了,有的人会误以为容器就是docker。所以这次我们故意在学习容器的时候,暂时忘记 docker,可以看到我们全篇并没有提到一句 docker,就是因为想要让初学者不要有个错误的初始印象。
看完整个容器的基础介绍,会不会觉得容器和VM有很多的相似之处,那它们的优缺点都各有什么呢?这个问题,有很多文章都已经总结的非常好了,我就不赘述了,就当作留了一个小小的课后作业吧~
下一篇我们学习 Dockerfile 的语法糖,来帮助我们学习如何构建镜像。
最后附上个人认为对容器技术写的不错的文章
容器技术(上)
容器技术(下)