持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第六天,点击查看活动详情
----------20220605
迟来的端午节快乐!再不发大家都要上班了吧,哈哈哈哈哈哈,所以现在把这篇发出来,就当是给大家提前说个祝福吧。
摘要:前天发的文章向大家讲述了Docker是什么,Docker 作为作为一个管理和创建容器的工具,那他所管理的容器是什么呢,容器和包粽子的粽叶有什么联系呢?本文希望以一个较为轻松的视角来进行带入,帮助大家更加了解Docker中容器的相关知识
1 Docker容器与Docker
Docker是一个用于应用程序级虚拟化的系统。虽然不同的Docker容器共享一个内核,但它们通常很少共享其他内容:文件、进程等都可以单独使用。它通常用于测试软件系统和在生产中运行它们。如果要介绍Docker,那么就必须要谈到容器这个内容,那么为什么我们需要强调容器这个概念呢
图1:基于容器的虚拟化堆栈
我们模拟一个场景,一家公司一般会有测试,技术,以及运维这几个职位,有一天程序员写好了一个程序,但是测试与运维和他的环境不同,那么在运行时,就需要重新搭建环境进行运行,这样较为耗时,并且实际运用中可能会出现很多的问题,
早期,大家都认为硬件抽象层基于hypervisor的虚拟化方式可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过hypervisor(KVM、XEN等)来衍生、运行、销毁。然而,随着时间推移,用户发现hypervisor这种方式麻烦越来越多。为什么?因为对于hypervisor环境来说,每个虚拟机都需要运行一个完整的操作系统以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序,如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。
基于上述情况,人们就在想,有没有其他什么方式能让人更加的关注应用程序本身,底层多余的操作系统和环境我可以共享和复用?换句话来说,那就是我部署一个服务运行好后,我再想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境。
这时候就需要我们使用容器对于配置环境以及文件进行一个打包,容器技术为打包服务栈提供了一种更为高效的方式,那么Docker能够让我们更为方便的创建和使用容器。
Docker有这样几个概念:dockerfile,image,container。我们可以简单的把image理解为可执行程序,container是运行起来的进程。写程序的话需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是“编译器”。
因此我们只需要在dockerfile中指定需要哪些程序,依赖什么样的配置,之后把dockerfile交给“编译器”docker进行编译也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。
图2:Motivational example of a workflow when developing a Dockerfile.
(写Dockerfile时工作流的激励示例)
2 容器与粽子粽叶的相似性
针对上面的描述,我们可以看出,容器给人第一印象就是——“装”,它可以装载很多东西。其实它最重要的作用也就是我们上面所提到部署一个服务运行好后,我再想移植到另外一个地方,我可以不用再安装一套操作系统和依赖环境。需要我们使用容器对于配置环境以及文件进行一个打包时,容器技术为打包服务栈提供了一种更为高效的方式。
那么和粽子有什么相似性呢?
假设我们把包粽子准备过程中的糯米与馅料统一编号,每一粒米与每一份板栗都设置为特定的数字,这是我们先将其按数字顺序排列整齐,但是在搬运的过程中,由于其排列极不稳定,所以他会发生位置的变化,顺序都被打乱了,那我们在之后如果想要进行一个查找,或是排列回之前的顺序,是一件较为麻烦的事。因此我们可以用粽叶包裹粽子,使其能过在于其格式划一,并可以层层重叠,将一定数量的馅料包裹住,稳定其排列顺序,使得顺序不易乱,不让其不同粽子里的馅料乱在一起,无法正常分离.
这其实也与我们容器技术的内核是一样的,我们的核心就是为了让我们需要传输的东西能够稳定、正确的传输到另一个地方,运行时不受运行硬件环境,或是传输过程中所出现问题的影响,正常运行。