【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>作用: 提高理解和分析复杂系统的能力。促…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
