【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来
1. 虚拟机的局限:容器的需求萌芽
在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs):
- 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。
- 虽然虚拟机解决了隔离问题,但它们的缺点也很明显:
- 占用资源多:每个虚拟机需要运行一个完整的操作系统,占用大量内存和存储。
- 启动慢:启动虚拟机往往需要几分钟,影响开发和测试效率。
- 部署繁琐:跨环境迁移应用时,环境差异容易引发问题。
这些问题推动了对更轻量级、快速启动、隔离性强的解决方案的需求,容器技术由此诞生。
2. 容器技术的前身
容器的概念并非 Docker 发明,而是基于 Linux 系统的已有技术演变而来:
- 2001年:Chroot 环境
Linux 的chroot
技术可以改变进程的根文件系统,让进程只看到特定的目录。虽然简单,但它的隔离能力有限。 - 2008年:LXC 容器技术
Linux 开始支持 Linux Containers (LXC),基于cgroups
和namespace
提供了资源控制和进程隔离的能力。这是容器的雏形,但 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 提高文件管理效率。这种轻量级的虚拟化方式彻底改变了现代应用的开发、测试和部署方式,为容器化技术奠定了基础。
相关文章:
【docker】docker的起源与容器的由来、docker容器的隔离机制
Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...
Window 安装 Nginx
参考链接 Windows 环境nginx安装使用及目录结构详解_windows 安装nginx-CSDN博客 Nginx 安装及配置教程(Windows)【安装】_nginx下载安装-CSDN博客 安装 1)下载 nginx: download 2)解压 3)启动 3.1)方…...
replace (regexp|substr, newSubstr|function)替换字符串中的指定部分
replace 方法用于替换字符串中的指定部分。它可以接受一个子字符串或正则表达式作为第一个参数,第二个参数是替换的内容。 用法示例 基本替换 let str "Hello, world!"; let newStr str.replace("world", "everyone"); console.lo…...
【ROS2】Ubuntu22.04安装ROS humble
一. ROS简介 1.1 什么是ROS ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。ROS的核心思想就是将机器人的软件功能做…...
cesium 3Dtiles变量
原本有一个变亮的属性luminanceAtZenith,但是新版本的cesium没有这个属性了。于是 let lightColor 3.0result._customShader new this.ffCesium.Cesium.CustomShader({fragmentShaderText:void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial mate…...
配置泛微e9后端开发环境
配置泛微e9的后端开发环境 1.安装jdk1.8(请自行安装并设置环境变量) 2.将服务器上的WEARVER文件夹拷贝到开发环境下(其中要包含ecology和Resin目录) 3.通过idea创建一个基础Java项目,将jdk设置为1.8 4.添加依赖,需要将3个文件夹的所有jar包添加到项目中…...
【Stable Diffusion】安装教程
目录 一、python 安装教程 二、windows cuda安装教程 三、Stable Diffusion下载 四、Stable Diffusion部署(重点) 一、python 安装教程 (1)第一步下载 打开python下载页面,找到python3.10.9,点击右边…...
USB Type-C一线通扩展屏:多场景应用,重塑高效办公与极致娱乐体验
在追求高效与便捷的时代,启明智显USB Type-C一线通扩展屏方案正以其独特的优势,成为众多职场人士、娱乐爱好者和游戏玩家的首选。这款扩展屏不仅具备卓越的性能和广泛的兼容性,更能在多个应用场景中发挥出其独特的价值。 USB2.0显卡ÿ…...
【力扣】541.反转字符串2
问题描述 思路解析 每当字符达到2*k的时候,判断,同时若剩余字符>k,只对前k个进行判断(这是重点)因为字符串是不可变变量,所以将其转化为字符串数组,最后才将结果重新转变为字符串 字符串->字符数组 …...
什么是防抖与节流
防抖(Debouncing)与节流(Throttling) 在前端开发中,尤其是在处理用户输入、窗口调整大小、滚动事件等高频率触发的事件时,防抖和节流是两种常用的技术手段。它们可以帮助我们优化性能,减少不必…...
springboot vue 开源 会员收银系统 (12)购物车关联服务人员 订单计算提成
前言 完整版演示 http://120.26.95.195/ 开发版演示 http://120.26.95.195:8889/ 在之前的开发进程中,我们完成订单的挂单和取单功能,今天我们完成购物车关联服务人员,用户计算门店服务人员的提成。 1.商品关联服务人员 服务人员可以选择 一…...
FFmpeg 推流给 FreeSWITCH
FFmpeg 推流,貌似不难,网上有很多资料, 接到一个任务,推流给 FreeSWITCH,最开始以为很容易, 实则不然,FreeSWITCH uuid_debug_media <uuid>, 一直没人任何反应 仔细一查,Fr…...
.npmrc文件的用途
.npmrc 文件是 npm(Node.js 的包管理工具)用于配置项目或用户的设置文件。它可以存储与 npm 相关的配置信息,如注册表地址、认证信息、代理设置、安装路径等。.npmrc 文件可以出现在不同的地方,具有不同的作用范围,通常…...
C++游戏开发入门:如何从零开始实现自己的游戏项目?
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C游戏开发的相关内容! 关于【…...
Redis设计与实现第16章 -- Sentinel 总结1(初始化、主从服务器获取信息、发送信息、接收信息)
Sentinel是Redis的高可用解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主…...
Windows10+VirtualBox+Ubuntu:安装虚拟机VirtualBox,虚拟机中安装Ubuntu
一、需求 在Windows10系统中,安装虚拟机VirtualBox,VirtualBox中安装Ubuntu桌面版。 二、环境准备 系统环境 Windows10 内存:8G 虚拟化 虚拟机的运行,如果需要Windows系统开启虚拟化,可以通过BIOS设置。 “虚拟…...
Torchtune在AMD GPU上的使用指南:利用多GPU能力进行LLM微调与扩展
Torchtune on AMD GPUs How-To Guide: Fine-tuning and Scaling LLMs with Multi-GPU Power — ROCm Blogs 这篇博客提供了一份详细的使用Torchtune在AMD GPU上微调和扩展大型语言模型(LLM)的指南。Torchtune 是一个PyTorch库,旨在让您轻松地…...
C底层 函数栈帧
文章目录 一,什么是寄存器 二,栈和帧 前言 我们在学习c语言程序的时候,是不是有很多的疑问,如 1,为什么形参不可以改变实参 2,为什么我们编写程序的时候会出现烫烫烫......这个乱码 3,那些局…...
【模块一】kubernetes容器编排进阶业务容器化案例
Kubernetes 实战案例 Kubernetes实战案例-规划(基于nerdctl buildkitdcontainerd构建容器镜像) 业务容器化优势: ① 提高资源利用率、节约部署IT成本。 ② 提高部署效率,基于kubernetes实现微服务的快速部署与交付、容器的批量调度与秒级启动。 ③…...
可视化建模以及UML期末复习篇----相关软件安装
作为一个过来人,我的建议是别过来。 一、可视化建模 <1>定义: 官方:一种使用图形符号来表示系统结构和行为的建模技术。 我:其实说白了就是把工作流程用图形画出来。懂不? <2>作用: 提高理解和分析复杂系统的能力。促…...
Appflyer记录卸载事件
Appflyer官方文档 1.原理 1.AppsFlyer每天向Firebase Cloud Messaging(FCM)和 Apple Push Notification Services(APNS)发送一次API请求。 2.然后FCM和APNS会发送一条静默推送消息,用于判断用户设备上是否仍装有相关应…...
JDK17 AbstractQueuedSynchronizer 二 条件队列
条件队列 同步队列中的线程是为了争抢锁,而条件队列中的线程是主动释放锁,挂起自己,等条件满足时被别的线程唤醒,继续工作。 AQS里只有1个同步队列,但可以有多个等待队列,每个等待队列对应一个ConditionO…...
8 设计模式之简单工厂模式
设计模式是软件开发中的一套通用解决方案,而简单工厂模式则是最基础、最常用的一种创建型模式。在这篇博客中,我将为大家详细介绍简单工厂模式的概念、优缺点,以及通过一个饮料制作的案例,帮助大家更好地理解和应用这种模式。 一、…...
计算机的错误计算(一百六十九)
摘要 探讨 MATLAB 中一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然,每个 均为 0.5 . 下面看看 MATLAB 的计算结果。不妨不用循环语句,直接用算术表达式表示 这时计算结果在如下图片: …...
Android 图形系统之三:SurfaceControl
在 Android 系统中,SurfaceControl 是一个关键的类,用于管理应用窗口和屏幕上的显示内容。它与 SurfaceFlinger 紧密交互,通过 BufferQueue 提供高效的图形缓冲区管理能力。SurfaceControl 是 Android 的显示架构中不可或缺的部分,…...
Laravel8.5+微信小程序实现京东商城秒杀方案
一、商品秒杀涉及的知识点 鉴权策略封装掊口访问频次限制小程序设计页面防抖接口调用订单创建事务使用超卖防御 二、订单库存系统方案(3种) 下单减库存 优点是库存和订单的强一致性,商品不会卖超,但是可能导致恶意下单ÿ…...
Makefile 入门指南:构建自动化编译流程
个人主页:chian-ocean 文章专栏 前言 make 和 Makefile 是编译和构建软件项目时非常常用的工具和文件,它们通常配合使用来自动化项目的编译过程。 make 定义:make 是一个构建自动化工具,用于根据项目文件的依赖关系自动完成编译…...
C#热更原理与HybridCLR
一、Mono的诞生 在Mono之前,C#虽然很好,但是只在windows家族平台上使用,就这点C#与Java就无法比。于是微软公司向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。意味着只要你遵守CLI(Common Lang…...
里氏替换原则:Java面向对象设计的基石
在面向对象编程(OOP)中,继承是一个强大的工具,它允许我们创建新的类(子类)来复用和扩展现有类(父类)的功能。然而,继承也带来了复杂性,特别是在确保子类能够正…...
恒创科技:服务器操作系统和客户端操作系统之间的区别
客户端操作系统和服务器操作系统是两种不同的操作系统,旨在满足计算机网络环境中的特定目的。虽然每种类型的操作系统在基本功能方面都有一些相似之处,但它们针对不同的用例进行了优化,并具有针对其特定角色量身定制的特定功能。 什么是服务器…...
网站建设一般用什么编程/华为手机软文范文300
1. 假设你使用了Innodb存储引擎2. 假设你在innodb设定了主键(聚集索引)3. 因为聚集索引页面之间是通过双向链表链接,页按照主键的顺序排序每个页中的记录也是通过双向链表维护。聚集索引上存储了主键的值由于B树的特性,最左端的叶子节点存储最小的值&…...
优酷 做视频网站还能成功吗/重庆seo教程博客
第1关:获取工作簿中的数据 任务描述 本关任务:获取data.xls文件中的数据。 相关知识 获取工作簿中的信息,我们可以使用Java POI(POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能)提供的Workbook类来操作。 为了完成本关任务,你需要掌握:如何获取W…...
wix网站做图片能折叠吗/软文营销平台
PHP中的$_ENV是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。 $_ENV只是被动的接受服务器端的环境变量并把它们转换为数组元素,你可以尝试直接输出它。 当你想看看一个变量中究竟有什么东西在…...
wordpress 直达链接/it培训机构
我们可以去开通快手小店,如果要开通的话是必须要去缴纳保证金的,这个都是必不可少的步骤,那我们如何去缴纳这个快手小店保证金,下面为各位亲们进行相关的介绍。 怎么交? 1、问:为什么要缴纳保证金? 答:…...
wordpress用户前台投稿/安徽seo团队
中国研究生电子设计竞赛自创办以来,研究生培养单位积极响应,广大研究生踊跃参与,地方政府和行业企业大力支持,已经形成了政府,高校,企业协同推进的竞赛格局。为继续了服务第十三届“兆易创新杯”研究生电子…...
定制网站的优势/淘宝客推广
为了防止数据在传输的时候丢失或被篡改,有了各种校验码。 每种CRC校验都有自己的多项式。每个多项式都有唯一对应的二进制。 CRC16就如果名字一样,校验码就是16位的 如果CRC32就是32位的。 原理就是 用一个数字(数据的二进制)去除一个特定的数字(多项式…...