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