【docker】docker的起源与容器的由来、docker容器的隔离机制

server/2024/11/30 18:01:35/

Docker 的起源与容器的由来

1. 虚拟机的局限:容器的需求萌芽

在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs):

  • 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。
  • 虽然虚拟机解决了隔离问题,但它们的缺点也很明显:
    • 占用资源多:每个虚拟机需要运行一个完整的操作系统,占用大量内存和存储。
    • 启动慢:启动虚拟机往往需要几分钟,影响开发和测试效率。
    • 部署繁琐:跨环境迁移应用时,环境差异容易引发问题。

这些问题推动了对更轻量级、快速启动、隔离性强的解决方案的需求,容器技术由此诞生。

2. 容器技术的前身

容器的概念并非 Docker 发明,而是基于 Linux 系统的已有技术演变而来:

  • 2001年:Chroot 环境
    Linux 的 chroot 技术可以改变进程的根文件系统,让进程只看到特定的目录。虽然简单,但它的隔离能力有限。
  • 2008年:LXC 容器技术
    Linux 开始支持 Linux Containers (LXC),基于 cgroupsnamespace 提供了资源控制和进程隔离的能力。这是容器的雏形,但 LXC 的操作复杂,开发者使用门槛较高。
3. Docker 的诞生
  • 2013年:Docker 横空出世
    一个名为 DotCloud 的创业公司开发了 Docker,目标是简化容器的使用:
    • 基于 LXC 技术:早期的 Docker 使用 LXC 容器技术。
    • 易用性:Docker 提供简单的命令行工具和友好的 API,让开发者轻松使用容器。
    • 镜像理念:Docker 引入了轻量级、可移植的镜像,将应用程序及其运行环境封装到一个标准化的包中,方便跨环境部署。

随着 Docker 的发展,它逐步替换 LXC,构建了自己的容器引擎 libcontainer,进一步增强性能和隔离性。


Docker 容器的隔离机制

容器的核心理念是隔离:让每个容器看起来像是独立运行的“微型计算机”。Docker 使用 Linux 的内核功能实现这一点,主要依赖以下两大机制:

1. Namespace:命名空间(隔离视图)

Namespace 提供进程的视图隔离,每个容器有自己的“世界”,看不到其他容器或宿主机的资源。

  • 进程隔离(PID Namespace)
    每个容器有自己的进程树,容器内部的进程只能看到自己的进程,无法干扰宿主机或其他容器的进程。
  • 文件系统隔离(Mount Namespace)
    容器内有独立的文件系统,依赖 Docker 镜像加载。容器只能访问分配给它的文件系统部分。
  • 网络隔离(Net Namespace)
    每个容器有自己的虚拟网卡和 IP 地址,容器之间、容器与宿主机之间的网络通信通过桥接或 NAT 控制。
  • 用户隔离(User Namespace)
    容器内的用户和宿主机的用户隔离,例如容器内的 root 用户并不是真正的宿主机 root。
2. Cgroups:控制组(资源限制)

Cgroups 提供进程的资源限制,防止某个容器耗尽系统资源。

  • CPU 限制:限制单个容器的 CPU 使用率,确保多个容器公平共享 CPU。
  • 内存限制:为容器分配固定内存,防止内存泄漏影响宿主机或其他容器。
  • I/O 限制:限制容器的磁盘读写速度,避免某些高 I/O 的容器影响整体性能。
3. UnionFS:分层文件系统

Docker 使用分层文件系统(如 AUFS、OverlayFS)管理镜像和容器的文件:

  • 镜像分层:Docker 镜像由多层组成,每层存储变化部分。
  • 写时复制:容器启动时创建一个可写层,所有对文件的修改只影响这一层,不改变原始镜像。

这种设计让镜像可以高效复用和快速构建,同时减少存储占用。


生动比喻

  • 虚拟机 vs 容器

    • 虚拟机就像是一栋栋独立的房子,每栋房子需要自己的地基(硬件),而且盖起来很耗时。
    • 容器就像是公寓中的单元,所有单元共用同一个地基(宿主机的内核),但每个单元都有自己的门、窗、墙壁,住户互不干扰。
  • 隔离机制的比喻

    • Namespace 就像每个单元的“视野”:单元内的住户只能看到自己的房间,看不到其他单元的情况。
    • Cgroups 就像物业对每个单元的资源限制:每户用电、用水有配额,超出了就会被限制。
    • UnionFS 就像一个多层的建筑结构:底层是固定的(镜像层),住户只在顶层装修(容器层),不会破坏建筑结构。

总结

Docker 是为了解决虚拟机的资源开销和环境迁移问题而生的,它通过 Linux 的 Namespace 和 Cgroups 实现隔离,通过 UnionFS 提高文件管理效率。这种轻量级的虚拟化方式彻底改变了现代应用的开发、测试和部署方式,为容器化技术奠定了基础。


http://www.ppmy.cn/server/146209.html

相关文章

26届JAVA 学习日记——Day17

2024.11.29 周五 今天把苍穹外卖的项目做完啦,准备开始做新的AI项目,今天的时间主要在修改简历,超级简历现在要收费,自己Word慢慢改真的很耗时间。 八股 今日暂无该内容学习。 算法 今日暂无该内容学习。 项目 苍穹外卖-完结…

AI开发-自然语言处理工具包-NumPy

1 需求 NLTK :: Natural Language Toolkit 2 接口 3 示例 4 参考资料

【机器学习】机器学习的基本分类-监督学习-逻辑回归-对数似然损失函数(Log-Likelihood Loss Function)

对数似然损失函数(Log-Likelihood Loss Function) 对数似然损失函数是机器学习和统计学中广泛使用的一种损失函数,特别是在分类问题(例如逻辑回归、神经网络)中应用最为广泛。它基于最大似然估计原理,通过…

智能云在线编辑网站(完结篇)

开始及初步计划 1.前端tiptip编辑器框架vue3 2.后端Pythonflaskmysql 3.大模型调用:飞桨系列(ppasr) 前言:以此篇谨记从软件杯到天津生成式ai答辩过程及结束。 『如蚍蜉见青天,双肩难挑日月』,感叹世事多…

【Linux】指令合集

Linux指令合集 一、基本操作指令 ls:罗列出当前路径下所有的文件名。 常见选项: ls -a:显示所有文件,包括隐藏文件(以“.”开头的文件)。例如,在查看包含配置文件(通常为隐藏文件&a…

leetcode - LRU缓存

什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…

代码随想录第十一天|栈与队列part02--150.逆波兰表达式求值、239.滑动窗口最大值、347.前k个高频元素、栈与队列总结篇

150.逆波兰表达式求值(150.逆波兰表达式求值) 题目分析: 计算逆波兰表达式(后缀表达式:左右中)的值,算符仅包含四则运算,操作数为一个整数或另一个表达式,整数除法向零…

多头注意力机制:从原理到应用的全面解析

目录 什么是多头注意力机制? 原理解析 1. 注意力机制的核心公式 2. 多头注意力的扩展 为什么使用多头注意力? 实际应用 1. Transformer中的应用 2. NLP任务 3. 计算机视觉任务 PyTorch 实现示例 总结 近年来,“多头注意力机制&…