Docker底层实现(一些底层原理)

Docker底层的核心技术包括Linux上的命名空间(Namespace)、控制组(Control groups)、Union文件系统(Union file systems)和容器格式(Container format)。

传统的虚拟机通过在宿主主机中运行hypervisor来模拟一整套完整的硬件环境系统提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。这种直接的做法实现了对资源的完整封装,但很多时候往往意味着系统资源的浪费。例如,Linux上运行Linux虚拟机,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。

可以通过Linux的命名空间实现大家虽然都共用一个内核和某些运行时环境(例如一些系统命名和系统库),但是彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器(Container),利用Namespace来做权限的隔离控制,利用cgroups来做资源分配。

基本架构

Docker采用了C/S架构,包括客户端和服务端。Docker守护进程(Daemon)作为服务端接收来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

客户端和服务端既可以运行在一个机器上,也可以通过socket或者RESTful API来进行通信。

Docker守护进程一般在宿主主机后台运行,等待接收客户端的消息。Docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker守护进程交互。

命名空间

每个容器都有自己的单独命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。

常见的命名空间:

pid 隔离不同用户进程;net 网络隔离;ipc 进程间交互隔离;mnt 文件结构的隔离;

uts 独立host name\domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。

User 每个容器可以有不同的用户组id。

控制组(control groups)

cgroups是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计、只有能控制分配到容器的资源,才能避免当多个容器同时运行时对系统资源的竞争。控制组可以提供对容器的内存、CPU、磁盘IO等资源的限制和审计管理(之后单独整理一篇cgroups)。

联合文件系统

UnionFS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。

联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。这样的话,不同Docker容器就可以共享一些基础的文件系统,同时再加上自己独有的改动层,大大提高了存储的效率。

Docker中使用的AUFS(AnotherUnionFS)就是一种联合文件系统。AUFS支持为每一个成员目录设定readonly/readwrite/whiteout-able权限,同时AUFS里有一个类似分层的概念,对只读权权限的分支可以逻辑上进行增量地修改(不影响只读部分)。

Docker目前支持的联合文件系统包括 OverlayFS/AUFS/Btrfs/VFS/ZFS/Device Mapper。

Linux版本和Docker推荐存储驱动

所以说,如果不考虑太多,默认overlay2 就可以,并且overlay2也是目前Docker默认的存储驱动(以前是aufs)。

Docker网络实现

Docker的网络实现是用了Linux上的网络命名空间和虚拟网络设备(特别是veth pair)。

要实现网络通信,机器需要至少一个网络接口(物理接口或者虚拟接口)来收发数据包;此外,如果不同子网之间要进行通信,需要路由机制。Docker中的网络接口默认是虚拟的接口。虚拟接口得优势之一是转发效率高。Linux通过在内核中进行数据复制来实现虚拟接口之间的数据转发,发送接口得发送缓存中的数据包被直接复制到接收缓存中。对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。Docker容器网络就是利用这项技术,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样的一对接口叫 veth pair)。

Docker创建一个容器的时候,网络方面会执行如下操作:

  1. 创建一对虚拟接口,分别放在本地主机和新容器中;
  2. 本地主机一端桥接到默认的docker0或者指定网桥上,并且有一个唯一的名字,如veth0101。
  3. 容器一端放到新容器中,并修改名字作为eth0,这个接口只在容器的命名空间中可见;
  4. 从网桥可用地址段中获取一个空闲地址分配给容器的eth0,并配置默认路由到桥接网卡veth0101。

之后,容器就可以使用etch0虚拟网卡来连接其他容器和其他网络。

可以在docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:

--net=bridge 这个是默认值,连接到默认的网桥。

--net=host 不进行网络隔离,即不要容器化容器内的网络。此时容器使用本地主机的网络,他拥有完全的本地主机接口访问权限。容器进程可以跟主机其他root进程一样可以打开地范围端口等。甚至可以进一步使用 --privileged=true,容器会被允许直接配置主机的网络堆栈。

--net=container:NAME or ID 让Docker将新建容器的进程放到一个已存在容器的网络栈中。

--net=none 让Docker将新容器放到隔离的网络栈中,但是不进行网络配置。

Docker 底层实现相关推荐

  1. Docker底层技术

    架构师之巅 1 容器 & Docker & 虚拟机 Container(容器)是一种轻量级的虚拟化技术,它不需要模拟硬件创建虚拟机.在Linux系统里面,使用到Linux kernel ...

  2. docker底层实现原理总结

    Docker底层实现主要基于LINUX技术,包含LINUX上的命名空间(Namespaces).控制组(Control groups).Union文件系统(Union file system). 命名 ...

  3. 你应当了解的Docker底层技术

    本文已获得原作者__七把刀__授权. Docker 容器技术已经发展了好些年,在很多项目都有应用,线上运行也很稳定.整理了部分 Docker 的学习笔记以及新版本特性,对Docker感兴趣的同学可以看 ...

  4. 浅谈Docker底层原理

    1 Docker和虚拟机异同 如下图,来自Docker官网,左边为Docker,右边为虚拟机,VM虚拟机是在宿主机器操作系统的基础上创建操作系统.Docker是在宿主机器的操作系统上创建Docker引 ...

  5. Docker底层原理

    Docker底层原理 底层实现 基本架构 命名空间 pid 命名空间 net 命名空间 ipc 命名空间 mnt 命名空间 uts 命名空间 user 命名空间 控制组 联合文件系统 本人菜鸡一枚,这 ...

  6. Docker 底层原理浅析

    作者:vitovzhong,腾讯 TEG 应用开发工程师 容器的实质是进程,与宿主机上的其他进程是共用一个内核,但与直接在宿主机执行的进程不同,容器进程运行在属于自己的独立的命名空间.命名空间隔离了进 ...

  7. Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件...

    先说和虚拟化技术的区别: 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降.容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和name ...

  8. Docker圣经:大白话说Docker底层原理,6W字实现Docker自由

    说在前面: 现在拿到offer超级难,甚至连面试电话,一个都搞不到. 尼恩的技术社群(50+)中,很多小伙伴凭借 "左手云原生+右手大数据"的绝活,拿到了offer,并且是非常优质 ...

  9. Docker学习总结(64)——快速理解 Docker 底层原理

    前言 宿主机就好比一间大房子,Docker 把它成了 N 个小隔断.在这些小隔断之间,有独立的卫生间.小床.电视.麻雀虽小,五脏俱全,这个比喻非常的贴切.Linux 提供了非常全面的隔离机制,使得每个 ...

最新文章

  1. 常见面试题学习(1)
  2. 分享一个Go按行读取命令行输入的例子
  3. Java实现算法导论中求解模线性方程解(基于最大公约数欧几里得扩展算法)
  4. selenium3+python-多窗口、句柄(handle)
  5. LeetCode 392打劫房屋 python
  6. STM32----摸石头过河系列(三)
  7. mysql5.7.18的安装与主从复制
  8. 用python计算有效前沿_15个好用到哭的python库,太牛了!
  9. 基于SWMM及自主开发城市内涝一维二维耦合软件的复杂城市排水系统建模技术及在城市排涝、海绵城市等领域实践
  10. 第十八篇 难点突破之-VUE中使用 C-LODOP 实现模板的套打
  11. android studio下载sdk的方法,Android Studio修改Android SDK路径的几种方法
  12. winform 窗体的单例模式
  13. Python while语句2021-08-27
  14. 李宏毅2020机器学习作业3-CNN:食物图片分类
  15. 什么样的投影仪好?哪款家用投影仪又好又便宜
  16. vue组件中校验身份证号,手机号和邮箱
  17. 雷电3菊链功能_别选错!笔记本的Type-C和雷电3接口区别可大了
  18. 浅谈偏光镜使用与选购[机器视觉系列]
  19. linux tc流量控制(一):classless qdisc
  20. 移动端基于Vant组件封装底部弹出搜索多选列表

热门文章

  1. centos 7 安装docker 并设置阿里云镜像仓库
  2. Docker 私有仓库最简便的搭建方法
  3. 有关SQL server connection Keep Alive 的FAQ(3)
  4. 使用JS在textarea在光标处插入内容
  5. 并发编程-单元练习题
  6. CF911F Tree Destruction (树的直径,贪心)
  7. go语言切片切片与指针
  8. 上交三月月赛[SJTU] 1105 path
  9. UE研究方法—ethnography(人种志)
  10. Objective-C ,ios,iphone开发基础:NSDictionary(字典) 和 NSMutableDictionary