【Docker入门】容器技术

🚀 欢迎来到我的CSDN博客:Optimistic _ chen

一名热爱技术与分享的全栈开发者,在这里记录成长,专注分享编程技术与实战经验,助力你的技术成长之路,与你共同进步!


🚀我的专栏推荐

专栏 内容特色 适合人群
🔥C语言从入门到精通 系统讲解基础语法、指针、内存管理、项目实战 零基础新手、考研党、复习
🔥Java基础语法 系统解释了基础语法、类与对象、继承 Java初学者
🔥Java核心技术 面向对象、集合框架、多线程、网络编程、新特性解析 有一定语法基础的开发者
🔥Java EE 进阶实战 Servlet、JSP、SpringBoot、MyBatis、项目案例拆解 想快速入门Java Web开发的同学
🔥Java数据结构与算法 图解数据结构、LeetCode刷题解析、大厂面试算法题 面试备战、算法爱好者、计算机专业学生
🔥Redis系列 从数据类型到核心特性解析 项目必备

🚀我的承诺:

✅ 文章配套代码:每篇技术文章都提供完整的可运行代码示例

✅ 持续更新:专栏内容定期更新,紧跟技术趋势

✅ 答疑交流:欢迎在文章评论区留言讨论,我会及时回复(支持互粉)


🚀 关注我,解锁更多技术干货!
⏳ 每天进步一点点,未来惊艳所有人!✍️ 持续更新中,记得⭐收藏关注⭐不迷路 ✨

📌 标签:#技术博客#编程学习#Java#C语言#算法#程序员

文章目录

容器发展史

Jail时代(隔离技术)

容器并不是一个新技术,很早就有了:

  • 1979年贝尔实验室发明了chroot,这是最早的"容器"思想雏形,出现在UNIX V7中。设计者们发明了chroot,可以把一个进程的文件系统隔离起来 。它允许将进程的根目录更改到文件系统的特定位置,为其提供一个隔离的文件系统视图,这个被隔离出来的新环境像监狱一样,被命名为 Chroot Jail (监狱)。
      这一步是进程隔离的开始:为每个进程隔离文件访问。所以 chroot 可以认为是容器技术的鼻祖。
  • 2000年, FreeBSD 4.0 发行FreeBSD Jail,实现服务和客户服务之间的明确分离;FreeBSD Jail 不仅仅有chroot的文件系统隔离,并且扩充了独立的进程和网络空间
  • 2001年,Linux VServer发行,和FreeBSD Jail一样是一种监狱机制 ,可以对计算机系统上的资源进行分区
  • 2004年,Solaris Containers 发行,结合系统资源控制和区域进行隔离,并添加了快照和克隆能力

云时代(虚拟化与基础设施即服务)

  • 2006年,Goole 101计划提出云的概念,无论你身处何地,都可以享受云计算提供的服务,云计算是一种按需获取计算资源的模式,这些资源被包装成服务,提供给用户。此时不仅仅需要隔离还需要能够对资源进行控制和调配
  • 同年, google推出Process Containers 旨在限制、统计和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络)。2007年它更名为"Control Groups (cgroups)",并最终合并到 Linux 内核 2.6.24。
  • 2008年,LXC(Linux 容器)是 Linux 容器管理器的第一个、最完整的实现(也是现代容器的直接前身 );使用 cgroups 和 Linux 命名空间实现。
      同年,goole 推出GAE(Goole App Engine) 首次把开发平台当作一种服务来提供,采用云计算技术,跨越多个服务器和数据中心来虚拟化应用程序。同时Google在 GAE中使用了Borg (Kubernetes的前身)来对容器进行编排和调度。
  • 2011年,CloudFoundry 推出Warden,直接对Cgroups以及Linux Namespace操作。
  • 2013年,LMCTFY(Let Me Contain That For You) 作为Goole容器堆栈的开源版本启动,提供Linux应用程序容器。但是在2015年因为转向了docker公司的 libcontainer而停止。
  • 2013年,Docker风靡全球。Docker在初期与Warden类似,使用的也是LXC,之后才开始采用自己开发的 libcontainer 来替代 LXC,它是将应用程序及其依赖打包到几乎可以在任何服务器上运行的容器的工具

Docker引入了一整套管理容器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的REST API、命令行等等;不仅解决了容器化问题,而且解决了分发问题,很快被各大厂商选择变成了云基础设施,厂商围绕Docker也开始了生态建设。

云原生时代(应用为中心)

Google & Docker的竞争

  • 2013年,专为容器设计的操作系统CoreOS与Docker原本保持着紧密合作关系。然而随着Docker生态的快速扩张,其试图构建完整的云平台生态系统的野心逐渐显现,这导致CoreOS与Docker之间出现了竞争关系,合作终止。

  • 2014年6月,Google发布开源的容器编排引擎Kubernetes(K8S) ,可以支持对容器的编排和管理;同年12月,CoreOS正式发布了CoreOS的开源容器引擎Rocket(简称rkt) 正式和Dokcer进行竞争。

  • 2015年,Docker推出容器集群编排组件Swarm,为Docker提供原生集群管理功能。6月,Docker 公司将 Libcontainer 捐出,并改名为 RunC 项目,然后根据RunC为依据,共同制定一套容器和镜像的标准,本质上是可以不通过Docker Daemon直接运行容器。

  • 这个标准就是OCI:制定并维护容器镜像格式和容器运行时的正式规范(OCI Specifications)。它的产出是容器运行时规范、镜像格式规范。镜像分发规范,规范了容器的构建、分发和运行问题。虽然这个标准是针对容器设立的,但是这个时候Docker已经成为容器标准了。

Google 和RedHat等公司将方向调转到容器上面的平台层。7月,Google联合Linux基金会成立CNCF(Cloud Native Computing Fount)云原生计算基金会,构建云原生的基础设施,目的是解决应用管理及容器编排问题。

K8S成为云原生事实标准

  • 2016年,Google 和红帽主导了CRI标准,用于k8s和特定的容器运行时解耦。CRI(Container Runtime Interface容器运行时接口)本质上就是k8s定义的一组与容器运行时进行交互的接口,所以只要实现了这套接口的容器运行时都可以对接k8s 。Docker作为容器运行时标准,docker-shim本质上是Kubernetes为对接Docker而实现的CRI接口。
  • 2016年,作为运行时标准的 containerd,Docker从Docker Engine(核心产品)中剥离出来捐献 给CNCF,Google为了把containerd加入到CRI标准,又开发了cri-containerd,用来完成k8s和容器之间的交互

  • 2016年,CRI-O发布:可以让开发者直接从K8S来运行容器。促使容器回归云原生本质(专一性和可组合性),同年Docker放弃Swarm(容器集群编排组件)项目 ,将容器编排和集群管理都内置到Docker项目中。但是K8S为开发者暴露出了能够扩展的插件机制,鼓励用户经过代码的方式介入到Kubernetes项目的每个阶段,得到各大厂商的支持。

  • 2017年,Kubernetes 已成了容器编排领域的绝对标准, Docker 已成容器事实的标准。

虚拟化、容器化

物理机:实际的服务器或者计算机,物理机提供给虚拟机硬件环境。

虚拟化:通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。

容器化:容器化是一种虚拟化技术 ,又称操作系统层虚拟化。这种技术将操作系统内核虚拟化,可以允许用户空间软件实例 被分割成几个独立的单元,在内核中运行,而不是只有一个单一实例运行。这个软件实例就是容器。docker 是现今容器技术的事实标准。

虚拟化、容器化带来的好处

  • 资源利用率高: 将利用率较低的服务器资源进行整合,用更少硬件资源运行更多业务
  • 环境标准化 :一次构建,到处运行。实现执行环境的标准化发布,部署和运维,Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性。
  • 资源弹性使用:根据业务情况,动态调整计算、存储、网络等硬件及软件资源。
  • 提供差异化环境 :同时提供多套环境,在只有一个物理机的情况下,可以自主部署Ubuntu操作系统、windows操作系统等其他系统,并且互不干扰。

虚拟化类别

应用程序执行环境
应用程序层 :各种应用app
函数库层 :提供数据结构定义以及函数调用接口
操作系统层 :提供系统调用接口,管理硬件资源
硬件层:提供硬件抽象,指令集架构、硬件设备及硬件访问接口

虚拟机

虚拟机是一种位于硬件与操作系统之间的虚拟化技术。它通过模拟硬件接口,将操作系统及其上层应用程序与物理硬件相连接,从而提供与物理计算机完全相同的功能。

容器

容器是一种位于操作系统和函数库之间的虚拟化技术,它通过模拟操作系统的接口,将函数库及其以上的功能置于操作系统上;Docker就是一个基于 Linux 操作系统的 Namespace 和 Cgroup 功能实现的隔离容器,可以模拟操作系统的功能

JVM之类的虚拟机

存在于函数库层和应用程序之间的虚拟化技术。JVM 就是在应用程序层与函数库层之间建立一个抽象层,对下 通过不同的版本适应不同的操作系统函数库,对上提供统一的运行环境交给程序和开发者,使开发者能够调用不同操作系统的函数库。

主机虚拟化实现

主机虚拟化的原理是通过在物理主机上安装一个虚拟化层来实现。这个虚拟化层可以在物理主机和客户操作系统之间建立虚拟机,使得它们可以独立运行。

  • Type 1Hypervisor (虚拟机管理器)一种运行在物理主机和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。是直接运行在硬件设备上(裸机虚拟化环境)
  • Type 2 Hypervisor运行在宿主机操作系统上,Hypervisor作为宿主机操作系统中的一个应用程序,客户机就是在宿主机操作系统上的一个进程。

容器虚拟化实现

原理:容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过namespace进行各程序的隔离,加上cgroups进行资源的控制,以此来进行虚拟化。

至于namespacecgroups敬请下一篇博客。。。。

完结撒花!🎉

如果这篇博客对你有帮助,不妨点个赞支持一下吧!👍
你的鼓励是我创作的最大动力~

想获取更多干货? 欢迎关注我的专栏 → optimistic_chen

📌 收藏本文,下次需要时不迷路!

我们下期再见!💫 持续更新中......


悄悄说:点击主页有更多精彩内容哦~ 😊

相关推荐
小明_GLC5 小时前
理解Docker、镜像Images、容器Container
docker·容器
努力搬砖的咸鱼5 小时前
用 Docker 部署你的第一个微服务
docker·微服务·云原生·容器
Lueeee.5 小时前
2.智梯云枢・全维管控广告系统——解决串口卡顿 + 优化稳定性
linux·运维·服务器
南行*5 小时前
C语言Linux环境编程
linux·c语言·开发语言·网络安全
海清河晏1115 小时前
Linux进阶篇:HTTP协议
linux·运维·http
June`6 小时前
IO模型全解析:从阻塞到异步(高并发的reactor模型)
linux·服务器·网络·c++
水上冰石6 小时前
如何查看k8s按照的jenkins插件的路径
容器·kubernetes·jenkins
oMcLin6 小时前
如何在 CentOS 7.9 上配置并调优 Docker Swarm 集群,确保跨多个节点的高效服务发现与负载均衡?
docker·centos·服务发现
鱼跃鹰飞6 小时前
经典面试题:K8S的自动缩扩容和崩溃恢复
java·容器·kubernetes