Docker系列之烹饪披萨(二)
前言
上一篇我们讲解了虚拟机和容器的区别,本节我们来讲讲Docker中关于Dockerfile、镜像、容器等基本概念。Docker是一个在容器内开发、部署、运行应用程序的平台,Docker本质上是容器化的代名词,容器对于提高软件开发和数据科学的安全性,可重复性和可扩展性起到了重要作用,拥抱Docker已是趋势,让我们进入Docker课堂。
烹饪材料
接下来我们通过学习如何烹饪披萨,一探究竟Docker平台各个基本概念,一说到吃,大家应该马上就提起兴趣了。
Docker Container(容器)
啥是容器啊,搞的这么高深,这么玄乎的概念,于是乎 ,我终于找到容器是什么了,如下:
哈哈,这就是容器,还是在某宝上截图来的,不过此容器非彼容器,如上图是一个真实存在的物理收纳箱容器,看到如上真实存在的容器,我们能想到这样一个容器有什么特点呢?
1.承载东西-这当然是最基本的啦,既然是收纳箱,就是用来装东西的,有些东西可以放在收纳箱内,也可以放在收纳箱外(这就好比在容器内可以装载应用程序及其依赖)
2.方便携带-有了收纳箱我们可以随处搬运,就像小孩的玩具一样,可以从家拿到学校,携带方便。(这就好比容器轻巧,可以在任何地方运行)
3.接口访问-收纳箱上方有一个盖盖,我们将其打开,可以放入或取出物品(这就好比容器与外界有连接的机制,比如通过命令行进行数据交互)
4.远程获取-制造商通过对应模具模板可以制造出成千上万个收纳箱,然后将收纳箱放到某宝或某东上,最终我们在某宝或某东上购买这个收纳箱(这就好比模具是镜像,通过镜像制作容器)
物理形式存在的收纳箱容器从被制造出来的那一刻就被赋予了生命,既然被赋予了生命当然也就存在对应的生命周期,我们可将收纳箱的生命周期归纳为四个阶段:孵化、闲置、使用、废弃。万事万物一旦存在,无论是物理形式还是虚拟形式都有其生命周期,容器也不例外,只不过容器由人为操纵控制其生命周期直至其关闭。
通过以上引入生活实例物理收纳箱容器的隐喻来对比虚拟化容器,得出虚拟化容器的特点,想必到此应该对容器有了一点点通透的了解。
Docker Image(镜像)
上述关于关于物理存在的收纳箱容器是以某种实例而存在,虽说容器是虚拟的,但是到底是如何虚拟出来的呢?它是以何种生命形式而存在的呢?答案则是:镜像孕育了容器,也就是说镜像构造出了容器。那么镜像又是什么呢?从语义层面理解,我们可能认为就是图像,而图像可能是根据手机或者摄像机将拍摄范围的全部内容映射到物理图像上,但是事实情况真的如此吗?
显然不是,镜像其实就是一个模具或模板,对于收纳箱的模板如下,我们根据模板而刻画出如上漂亮且精致的收纳箱容器。
如上所述,我们根据镜像刻画出了容器,镜像是不可变的主模板,用来抽取出完全相同的容器,而镜像包含应用程序所需要运行的Dockerfile、代码、库等,如此这些被完全捆绑在一起。
Dockerfile(镜像说明书)
讲完了镜像,我们又有疑惑了,镜像又是怎么来的呢?通过Dockerfile来创建,Dockerfile是一个文件,这个文件中包含了如何构建镜像的说明,Dockerfile只是用来构建初始镜像层的基本镜像,我们可将其看做是镜像的说明书。根据Dockerfile中的使用说明,我们可以将附加层堆叠在基础镜像层的顶部。最后根据Dockerfile代码,在其他层的顶部堆叠薄的可写层,每一层是如此的薄,堆叠可写的过程就好似洋葱的成长过程,多么形象而生动,如果你愿意一层一层,一层的剥开我的心,你会发现 你会讶异....哈哈。
Container Registry (镜像仓储)
如果我们希望其他人能够利用我们的镜像来创建容器,我们可以将镜像传送到容器注册表中,Docker Hub是最大的默认注册表位置。
烹饪披萨
关于披萨所需要的材料我们都已配齐,接下来我们试试来自制披萨,好不好吃不要紧,重要的是享受制作的过程。
第一步:我们需要知道制作披萨的配方,这个配方好比Dockerfile,里面包含如何制作出披萨的说明。
第二步:披萨有几层,比如包含面包层、奶酪层、酱汁层等等,因为配方说明我们知道要做什么,这是不可更改的计划,这就好比我们从底层首先构建出基本的镜像如ubuntu,然后添加奶酪层等,这一层相当于我们安装外部库,比如python,最后再刷上一层泰国甜辣酱,简直是人间美味,这就相当于我们已编写好的应用程序代码,最终就有了披萨的原型,也就形成了Docker Image(镜像),
第三步:我们做好了披萨,这个时候我们需要将其放入烤箱中,烤箱就好比Docker平台,当我们将买回来的烤箱放在家里,这个时候就好比将Docker安装在计算机上一样,当我们扭动烤箱按钮的那一刻,我们就开始烹饪披萨,这就像我们开始创建并启动容器啦。
第四步:等待一小会,当披萨熟了,熟透了的披萨就好比Docker容器。
第五步:最终大功告成,我们开始吃披萨,吃披萨就好比我们在容器中使用应用程序一样。
烹饪总结
本节我们通过烹饪披萨讲述了Docker平台上基本概念,以及各个基本概念之间的关系,它们是如何关联起来的,希望通过本文的讲解,对于阅读本文的童鞋能对概念有更深入的理解,应该不会通过我的讲解,越讲越懵逼吧,哈哈。有了对基本概念的理解,后续陆续引入例子就一目了然啦,感谢阅读,我们下节再会。

为了方便大家在移动端也能看到我分享的博文,现已注册个人公众号,扫描上方左边二维码即可,欢迎大家关注,有时间会及时分享相关技术博文。
感谢花时间阅读此篇文章,如果您觉得这篇文章你学到了东西也是为了犒劳下博主的码字不易不妨打赏一下吧,让楼主能喝上一杯咖啡,在此谢过了!
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!
本文版权归作者和博客园共有,来源网址:http://www.cnblogs.com/CreateMyself)/欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2015-08-08 (第七天)DOM练习一