当前位置: 首页 > news >正文

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

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 提高文件管理效率。这种轻量级的虚拟化方式彻底改变了现代应用的开发、测试和部署方式,为容器化技术奠定了基础。

相关文章:

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

Docker 的起源与容器的由来 1. 虚拟机的局限:容器的需求萌芽 在 Docker 出现之前,开发和部署软件主要依赖虚拟机(VMs): 虚拟机通过模拟硬件运行操作系统,每个应用程序可以运行在自己的独立环境中。虽然虚…...

mysql 事务之LBCC与MVCC

一、事务 数据库事务(Database Transaction)是数据库管理系统(DBMS)中执行的一系列操作,这些操作被当作一个逻辑单元进行处理,以保证数据的一致性和完整性。 ACID,事务四个关键特性 1、原子性…...

记一次 .NET某hdp智能柜系统 卡死分析

一:背景 1. 讲故事 停了一个月时间没有更新博客了,主要是这段时间有些许事情导致心神不宁,我这个人也比较浮躁所以无法潜心修炼,事情如下: 被狗咬了 也不知道是不是出门没看黄历,在小区门口店里买烟&am…...

大模型专栏--Spring Ai Alibaba介绍和功能演示

Spring AI Alibaba 介绍和功能演示 背景 Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。…...

【GPT】为什么人需要睡觉?

睡觉对人类来说是至关重要的生理和心理需求。以下是一些为什么人需要睡觉的主要原因,以及睡眠对身体和大脑的影响: 1. 恢复与修复 身体修复:在睡眠期间,身体进行细胞修复和再生。例如,生长激素在深度睡眠中分泌&#…...

【Linux】磁盘 | 文件系统 | inode

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊&#xff…...

A051-基于Spring Boot的网络海鲜市场系统的设计与实现

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…...

谷歌浏览器Chrome打开百度很慢,其他网页正常的解决办法,试了很多,找到了适合的

最近不知怎么的,Chrome突然间打开百度很慢,甚至打不开。不光我一个人遇到这问题,我同事也遇到这个问题。开发中难免遇到问题,需要百度,现在是百度不了。 作为一名开发人员,习惯了使用Chrome进行开发&#…...

《企业级低代码开发平台技术要求》核心要点解析

一、引言 在数字化转型的浪潮中,企业级低代码开发平台成为推动企业创新与发展的关键力量。深圳市标准化协会发布的《企业级低代码开发平台技术要求》(T/SZAS 77—2024)为该领域提供了重要的规范与指引。深入剖析其核心要点,对于理…...

AI一键生成3D动画:腾讯最新方案,为小程序带来革命性变化

随着3D技术的快速发展,将静态的3D模型转化为能够生动展现各种动作的角色已经成为许多创作者和开发者梦寐以求的能力。然而,在过去,这一过程往往需要大量的手动工作和技术积累。现在,腾讯推出了一项创新的技术——AI一键生成3D动画,它不仅极大地简化了流程,还显著提高了效…...

AD软件如何快速切换三维视图,由2D切换至3D,以及如何恢复

在Altium Designer软件中,切换三维视图以及恢复二维视图的操作相对简单。以下是具体的步骤: 切换三维视图 在PCB设计界面中,2D切换3D,快捷键按住数字键盘中的“3”即可切换; 快捷键ctrlf(或者vb快捷键也…...

【赵渝强老师】PostgreSQL的数据库

PostgreSQL的逻辑存储结构主要是指数据库中的各种数据库对象,包括:数据库集群、数据库、表、索引、视图等等。所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都…...

opencv 区域提取三种算法

opencv 区域提取三种算法 1.轮廓查找 findContours()函数&#xff0c;得到轮廓的点集集合 cv::vector<cv::vector<Point>> contours;threshold(roiMat,binImg,m_pPara.m_nMinGray,m_pPara.m_nMaxGray,THRESH_BINARY);//膨胀处理Mat dilaElement getStructuringE…...

C++初阶(十六)--STL--list的模拟实现

目录 结点类的实现 迭代器类的模拟实现 迭代器类的模板参数说明 构造函数 *运算符重载 ->运算符的重载 运算符的重载 --运算符重载 !运算符重载 运算符重载 list类的模拟实现 成员变量 默认成员函数 构造函数 拷贝构造函数 赋值运算符重载 迭代器相关函数 …...

树莓集团:以人工智能为核心,打造数字化生态运营新典范

在当今数字化浪潮席卷全球的背景下&#xff0c;各行各业都在积极探索数字化转型的路径。作为数字产业的领军者&#xff0c;树莓集团凭借其深厚的技术积累和创新理念&#xff0c;在人工智能、大数据、云计算等前沿技术领域不断突破&#xff0c;成功打造了一个以人工智能为核心的…...

基于深度学习的卷积神经网络十二生肖图像识别系统(PyQt5界面+数据集+训练代码)

本研究提出了一种基于深度学习的十二生肖图像识别系统&#xff0c;旨在利用卷积神经网络&#xff08;CNN&#xff09;进行图像分类&#xff0c;特别是十二生肖图像的自动识别。系统的核心采用了两种经典的深度学习模型&#xff1a;ResNet50和VGG16&#xff0c;进行图像的特征提…...

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上微调和扩展大型语言模型&#xff08;LLM&#xff09;的指南。Torchtune 是一个PyTorch库&#xff0c;旨在让您轻松地…...

ESLint

代码规范 一套写代码的约定规则&#xff1b;比如赋值符号左右是否需要空格&#xff0c;一句话结束是否要加&#xff1b;.... 代码规范错误 如果你的代码不符合standard的要求&#xff0c;ESLint&#xff08;脚手架里配的东西&#xff09;会告诉你哪个文件第几行错了 解决代码…...

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

如何具体实现商品详情的提取?

在电商领域&#xff0c;获取商品详情信息对于市场分析、价格比较、商品推荐等应用场景至关重要。本文将详细介绍如何使用Java编写爬虫程序&#xff0c;以合法合规的方式获取淘宝商品的详情信息&#xff0c;并提供详细的代码示例。 1. 环境准备 在开始编写爬虫之前&#xff0c;…...

antd table 自定义表头过滤表格内容

注意&#xff1a;该功能只能过滤可一次性返回全部数据的表格&#xff0c;通过接口分页查询的请自主按照需求改动哈~ 实现步骤&#xff1a; 1.在要过滤的列表表头增加过滤图标&#xff0c;点击图标显示浮窗 2.浮窗内显示整列可选选项&#xff0c;通过勾选单选或者全选、搜索框来…...

高效处理 iOS 应用中的大规模礼物数据:以直播项目为例(1-礼物池)

引言 在现代iOS应用开发中&#xff0c;处理大规模数据是一个常见的挑战。尤其实在直播项目中&#xff0c;礼物面板作为展示用户互动的重要部分&#xff0c;通常需要实时显示海量的礼物数据。这些数据不仅涉及到不同的区域、主播的动态差异&#xff0c;还需要保证高效的加载与渲…...

Maven - 优雅的管理多模块应用的统一版本号

文章目录 概述一、使用 versions-maven-plugin 插件1. 在主 pom.xml 中定义插件2. 修改版本号3. 回退修改4. 提交修改 二、使用占位符统一管理版本号1. 在主 pom.xml 中定义占位符2. 使用 flatten-maven-plugin 插件自动替换占位符3. 修改版本号4. 为什么这种方式更方便&#x…...

C++设计模式(观察者模式)

一、介绍 1.动机 在软件构建过程中&#xff0c;我们需要为某些对象建立一种“通知依赖关系”&#xff0c;即一个对象的状态发生改变&#xff0c;所有的依赖对象&#xff08;观察者对象&#xff09;都将得到通知。如果这样的依赖关系过于紧密&#xff0c;将使软件不能很好地抵…...

【unity】WebSocket 与 EventSource 的区别

WebSocket 也是一种很好的选择&#xff0c;尤其是在需要进行 双向实时通信&#xff08;例如聊天应用、实时数据流等&#xff09;时。与 EventSource 不同&#xff0c;WebSocket 允许客户端和服务器之间建立一个持久的、全双工的通信通道。两者的区别和适用场景如下&#xff1a;…...

从ETL到DataOps:WhaleStudio替代Informatica,实现信创化升级

作者 | 白鲸开源 姜维 在数据集成和调度的领域&#xff0c;Informatica曾经是公认的权威工具。其强大的ETL功能、多年积累的市场经验&#xff0c;使其成为众多企业数据处理的核心工具。 然而&#xff0c;随着新一代大数据平台的迅速崛起&#xff0c;以及信创化改造的要求愈发严…...

第四十二篇 EfficientNet:重新思考卷积神经网络的模型缩放

文章目录 摘要1、简介2、相关工作3、复合模型缩放3.1、 问题公式化3.2、扩展维度3.3、复合比例 4、EfficientNet架构5、实验5.1、扩展MobileNets和ResNets5.2、EfficientNet的ImageNet结果5.3、EfficientNet的迁移学习结果 6、讨论7、结论 摘要 卷积神经网络(ConvNets)通常在固…...

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 编译硬件需求&#xff1a;做多系统测试&#xff0c;磁盘500GB起步(固态)&#xff08;机械会卡死&#xff09;&#xff0c;内存3…...

Web Worker 和 WebSocket的区别

Web Worker&#xff08;消息传递机制&#xff09; 定义&#xff1a;是为了在浏览器中提供多线程支持&#xff0c;允许 JavaScript 在后台线程运行&#xff0c;而不阻塞主线程。它非常适合执行耗时的计算任务或处理大量数据&#xff0c;避免主线程&#xff08;通常是 UI 线程&a…...

vmware Ubuntu2004运行STAR-Searcher

github链接 安装ros noetic gazebo11 略 gazebo更新方法 sudo sh -c echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable lsb_release -cs main" > /etc/apt/sources.list.d/gazebo-stable.list wget https://packages.osrfoundation.org/gaz…...

04_JavaScript引入到文件

JavaScript引入到文件 嵌入到HTML文件中 <body> <script> var age 20 </script></body> 引入本地独立JS文件 <body> <script type"text/javascript" src"./itbaizhan.js"> </script></body> 引入网络来…...

计算机网络的功能

目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络&#xff0c;用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...

38 基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…...

Git仓库迁移到远程仓库(源码、分支、提交)

单个迁移仓库 一、迁移仓库 1.准备工作 > 手动在电脑创建一个临时文件夹&#xff0c;CMD进入该目录 > 远程仓库上创建一个同名的空仓库 2.CMD命令&#xff1a;拉取旧Git仓库&#xff08;包含提交、分支、源码&#xff09; $ git clone --bare http://git.domain.cn/…...

Go语言压缩文件处理

目录 Go 语言压缩文件处理1. 压缩文件&#xff1a;Zip函数2. 解压文件&#xff1a;UnZip 函数3. 小结 Go 语言压缩文件处理 在现代的应用开发中&#xff0c;处理压缩文件&#xff08;如 .zip 格式&#xff09;是常见的需求。Go 语言提供了内置的 archive/zip 包来处理 .zip 文…...

Libevent库-http通信不同请求方式的处理

做项目的时候用到了http通信&#xff0c;同事用libevent库写的&#xff0c;特此记录后端从前端拿到消息后的处理方式 void CHTTPTest::request(const std::any & data) {// data 是从前端拿到的数据void *obj std::any_cast<void *>(data); // std::any是C17新标准…...

Vue3 v-if与v-show的区别

v-if 与 v-show 我们都可以在开发中用于条件渲染&#xff0c;在面试时也是个常考的题目 实现原理 v-if&#xff1a;是真正的条件渲染&#xff0c;当v-if true时&#xff0c;元素会被创建、渲染&#xff0c;并插入到dom树中&#xff0c;这个过程会耗费系统的资源&#xff0c;当…...

同时在github和gitee配置密钥

同时在github和gitee配置密钥 1. 生成不同的 SSH 密钥 为每个平台生成单独的 SSH 密钥。 # 为 GitHub 生成密钥&#xff08;默认文件路径为 ~/.ssh/github_id_rsa&#xff09; ssh-keygen -t rsa -b 4096 -C "your_github_emailexample.com" -f ~/.ssh/github_id_…...

Scala—数组(不可变数组Array、可变数组ArrayBuffer)用法详解

Scala集合概述-链接 大家可以点击上方链接&#xff0c;先对Scala的集合有一个整体的概念&#x1f923;&#x1f923;&#x1f923; 在 Scala 中&#xff0c;数组是一种特殊的集合类型&#xff0c;可以是可变的也可以是不可变的。 1. 不可变数组 在 Scala 中&#xff0c;不可变…...

Failed to find SV in PRN block of SINEX file (Name svnav.dat)

gamit 精密星历生成失败 gamit svnav.dat没更新 下载svnav.dat.allgnss 重命名成 svnav.dat ,替换到tables&#xff0c;即可。...

H.265流媒体播放器EasyPlayer.js无插件H5播放器关于移动端(H5)切换网络的时候,播放器会触发什么事件

EasyPlayer.js无插件H5播放器作为一款功能全面的H5流媒体播放器&#xff0c;凭借其多种协议支持、多种解码方式、丰富的渲染元素和强大的应用功能&#xff0c;以及出色的跨平台兼容性&#xff0c;为用户提供了高度定制化的选项和优化的播放体验。无论是视频直播还是点播&#x…...

Ubuntu上使用自带python创建虚拟环境

虚拟环境让项目之间的依赖关系更加清晰&#xff0c;也可以避免全局安装的包的版本冲突问题。 1.查看python Ubuntu上一般都是自带python的&#xff0c;查看python版本及指向(使用的话python要换成python3)&#xff1a; ls -l /usr/bin | grep python 2.安装python虚拟环境工…...

对智能电视直播App的恶意监控

首先我们要指出中国广电总局推出的一个政策性文件是恶意监控的始作俑者&#xff0c;这个广电总局的政策性文件禁止智能电视和电视盒子安装直播软件。应该说这个政策性文件是为了保护特殊利益集团&#xff0c;阻挠技术进步和发展的。 有那么一些电视机和电视盒子的厂商和电信运…...

网络原理(一):应用层自定义协议的信息组织格式 HTTP 前置知识

目录 1. 应用层 2. 自定义协议 2.1 根据需求 > 明确传输信息 2.2 约定好信息组织的格式 2.2.1 行文本 2.2.2 xml 2.2.3 json 2.2.4 protobuf 3. HTTP 协议 3.1 特点 4. 抓包工具 1. 应用层 在前面的博客中, 我们了解了 TCP/IP 五层协议模型: 应用层传输层网络层…...

微软企业邮箱:安全可靠的企业级邮件服务!

微软企业邮箱的设置步骤&#xff1f;如何注册使用烽火域名邮箱&#xff1f; 微软企业邮箱作为一款专为企业设计的邮件服务&#xff0c;不仅提供了高效便捷的通信工具&#xff0c;更在安全性、可靠性和功能性方面树立了行业标杆。烽火将深入探讨微软企业邮箱的多重优势。 微软…...

matlab导出3D彩色模型(surface类转stl,并对白模上色)

在matlab中绘制3维图形时&#xff0c;需要将3维图形导出到PPT中展示。但是直接导出图片效果欠佳&#xff0c;无法全方位展示。 最近学习了如何将matlab中的图形导出为stl模型&#xff0c;然后再采用简单的方法对模型上色。 中间尝试过matlab导出stl、ply、3dm等多种格式&…...

【JavaScript】async /await异步详解2 promise举例

在 JavaScript 中&#xff0c;async 和 await 是处理异步操作的强大工具。结合 try...catch 语句&#xff0c;你可以优雅地处理异步操作中的错误。 基本用法 定义异步函数&#xff1a;使用 async 关键字。等待 Promise 解析&#xff1a;使用 await 关键字。错误处理&#xff…...

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络&#xff0c;想使用wireshark抓包工具抓取Android手机网络日志&#xff0c;有以下两种连接方法&#xff1a; Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑&#xff0c;并在开发者模式中启用 USB 网络共享。 查看设备连接信…...

封装类与封装函数

目录结构 src/ ├── utils/ │ ├── test.js │ ├── Calculator.js ├── views/ │ ├── Home.vue ├── App.vue 共同点&#xff1a;模块导出与模块引入 封装函数 场景 简单、轻量级和性能敏感的场景&#xff0c;适合快速开发和维护。 优 可维护性&…...

【java】接口幂等性的实现

文章目录 1. 引言介绍幂等性的概念为什么需要在Java接口中实现幂等性 2. 使用幂等表实现幂等性什么是幂等表如何设计幂等表示例&#xff1a;Java代码实现使用幂等表使用幂等表实现幂等性 3. 利用Nginx Lua 和 Redis实现幂等性Nginx和Lua的作用简介介绍Redis的SETNX命令架构设计…...