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

docker底层原理简述

前言

平时用docker很多,今天深入了解下docker原理层面的实现,包括docker核心概念,文件系统,资源隔离,网络通信等

参考文章:

Docker底层原理(图解+秒懂+史上最全) - 疯狂创客圈 - 博客园

docker - Libnetwork CNM框架与实现 - 187J3X1 - SegmentFault 思否

docker网络配置:bridge模式、host模式、container模式、none模式 - 熊仔其人 - 博客园

一、docker的核心概念

docker的核心组件包括客户端,守护进程,容器、镜像、镜像仓库

docker是Client/Server架构的系统,由运行在宿主机的守护进程控制主机上的容器,接收客户端的请求

由主机上或远程的客户端与守护进程交互,提供执行命令对资源操作

镜像是一个轻量级的,可运行的软件包

容器是镜像运行的实例

镜像仓库是用于保存镜像的中心

二、docker与虚拟机

虚拟机在宿主机操作系统上创建虚拟层、虚拟操作系统、在安装应用,docker在宿主机创建docker引擎,创建应用共享宿主机内核

虚拟机分钟级启动,单机支持几十个,docker秒级启动,单机支持上千个

虚拟机提供了系统级别的隔离性,docker利用linux提供的namspacescgroups进行隔离

三、docker的分层镜像

docker分层镜像是基于Advanced UnionFS(or AUFS,联合文件系统)的,利用mount将不同的文件夹挂载按顺序挂载到一个目录下,上层的文件会覆盖下层的同名文件,且只有最上层是可读写,往下都是只读的

docker镜像是分层的,在构建时每次RUN都会加一层,相同的base镜像是共享的,节省存储空间,容器运行时会增加容器层,只有容器层是可写的,镜像是只读的,利用的是copyOnWrite技术

四、docker的环境隔离

docker利用linux的namespaces(命名空间)实现PID、IPC、网络、挂载点等系统资源的隔离,利用CGroups(控制组)实现CPU、内存、带宽等物理资源的隔离

五、namespace相关操作

可以在/proc/[pid]/ns查看进程的各个namespace

clone()创建新进程同时创建namespace

setns()为当前进程设置namespace

unshare()跳出原先的namespace进行操作

六、docker的网络模式

  1. bridge模式,默认启动docker0网桥,启动一个容器时分配一对虚拟网卡,并设置docker0为默认网关,利用iptables定义NAT配置
  2. host模式,与主机共享network namespace
  3. container模式,与某个容器共享network namespace
  4. none模式,不提供联网

七、容器网络模型(Container Network Model)

由Sandbox、Endpoint、Network组成

每个容器包含一个Sandbox保存网卡Interface、路由表等,一个Sandbox可以包含多个Endpoint,这些Endpoint可以来自不同Network,Sandbox的典型实现是Network namespace

Endpoint由Network创建并归属于Network,当Endpoint加入Sandbox,代表该Sandbox加入了Network,Endpoint的典型实现是veth-pair

Network可以创建多个Endpoint,将Endpoint加入到Sandbox,实现多个Sandbox的互通,典型实现是Linux bridge

八、CGroups

Linux将物理资源划分为/sys/fs/cgroup下的不同子系统,如cpu、内存、网络带宽等,cgroup能为一组进程分配资源,并且cgroup是有层级关系的,子节点会从父节点继承资源限制,并且该限制百分比是基于系统总资源而言的

相关文章:

  • 开源版「v0」OpenUI:根据文本生成UI界面代码
  • 读书笔记:淘宝十年产品与技术演进史
  • 配置Spark历史服务器,轻松查看任务记录
  • 算法训练营第一天|704.二分查找、27.移除元素、977.有序数组的平方
  • 【哈希表】1399. 统计最大组的数目
  • Java学习手册:Web 安全基础
  • 【KWDB 创作者计划】_上位机知识篇---MicroPython
  • 青少年编程与数学 02-018 C++数据结构与算法 06课题、树
  • Kairos 生态有哪些值得关注的进展?
  • 搭建Stable Diffusion图像生成系统实现通过网址访问(Ngrok+Flask实现项目系统公网测试,轻量易部署)
  • Linux:进程地址空间
  • 基于Python将MongoDB文本数据通过text2vec-large-chinese模型向量化并存储到Milvus数据库的完整实现方案
  • 20、 DeepSeekMoE论文笔记
  • TCP 协议:原理、机制与应用
  • windows端远程控制ubuntu运行脚本程序并转发ubuntu端脚本输出的网页
  • SVN仓库突然没有权限访问
  • 奇安信春招面试题
  • linux内核进程管理(1)——创建,退出
  • 两个面向视觉定位的遥感船舶数据集:RSSVGSARVG
  • 深入解析 Spring Boot Test:架构、核心组件与最佳实践
  • 巴菲特再谈投资日本:希望持有日本五大商社至少50年
  • 德国巴斯夫:关税政策加剧全球市场不确定性,间接影响已显现
  • 跳水世界杯女子单人10米台决赛,陈芋汐、全红婵包揽金银牌
  • 多地晒五一假期前两日成绩单,湖南单日客流同比增长逾三成
  • 客场不敌蓉城遭遇联赛首败,申花争冠需要提升外援能力
  • 苏州一直升机坠落致1死4伤,事故调查正展开