了解Docker的文件系统网络模式的基本原理

Docker文件系统

Linux基础

一个Linux系统运行需要两个文件系统: bootfs + rbootfs

bootfs(boot file system)

bootfs 即引导文件系统,Linux内核启动时使用的文件系统。对于同样的内核版本的不同Lunx发行版本,其bootfs是一样的。

引导文件系统包括:启动所需的映像文件引导加载程序(bootloader)。image.png
在 Linux 系统中,bootfs 通常是一个小型的文件系统,容纳了以下重要的组件:

  • 内核映像(vmlinuz):这是 Linux 内核的压缩形式,它是操作系统的核心部分。内核映像负责初始化系统硬件、加载其他驱动程序和模块,并启动用户空间进程。
  • 初始 RAM 磁盘(initrd)或初始 RAM 文件系统(initramfs):这是一个临时的文件系统,用于在 Linux 内核引导过程中提供额外的驱动程序和工具。它包含了用于引导过程中所需的必要文件和脚本。
  • 引导加载程序(bootloader):这是一个位于计算机固件和操作系统之间的软件,负责加载和启动操作系统。常见的引导加载程序包括 GRUB(GRand Unified Bootloader)和 LILO(LInux LOader)

bootfs 只是引导过程中的一个阶段,一旦 Linux 内核成功加载并初始化,它将卸载 bootfs 并切换到其他文件系统,如根文件系统(rootfs)。

通常,为了保证安全,引导文件系统一般是挂载为只读的。

rootfs(root file system)

rootfs 是 Linux 系统中的一个概念,它指的是根文件系统(Root Filesystem),也被称为根目录或根挂载点。这个文件系统在不同的Linux发行版本间是不一样的。
image.png
在 Linux 中,根文件系统是文件系统层次结构的顶级目录,包含了操作系统中所有文件和目录的根源。根文件系统是文件系统的起点,它是整个文件系统层次结构的起点。

典型的目录结构 /dev, /proc, /bin, /etc, /lib, /usr, and /tmp 等。

在启动完成之后,根文件系统改为读写模式,用户可以对其进行修改。

Docker镜像的基本原理

镜像的本质是文件系统,容器就是一个进程,进程被Namespace隔离,受到Cgroups 限制。

Docker 使用一种称为容器文件系统的技术来管理和组织容器中的文件。容器文件系统提供了容器内部文件和目录的隔离和管理。

在 Docker 中,每个容器都有自己的文件系统,这个文件系统是从一个基础镜像(Base Image)开始构建的。基础镜像是一个只读的文件系统模板,包含了操作系统和其他预装的软件。当你创建一个容器时,Docker 会在基础镜像上创建一个可写的容器层(Container Layer),用于保存容器内部的修改和新增的文件。
image.png

  • 基础镜像是只读的,Docker利用 union mount (联合挂载)增加更多只读的文件,看起来就像文件系统,即容器。
  • 所有 Docker 容器都共享主机系统的 bootfs 即 Linux 内核。

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

  • AUFS(Advanced Multi-Layered Unification Filesystem):AUFS 是 Docker 最早使用的容器文件系统之一。它通过将多个文件系统层堆叠在一起,形成一个可写的容器层和只读的基础镜像层。
  • OverlayFS:OverlayFS 是 Linux 内核提供的一种联合文件系统,也被广泛用于 Docker。它类似于 AUFS,通过将多个文件系统层叠在一起,并提供一个统一的虚拟文件系统。
  • Btrfs:Btrfs 是一个先进的复制文件系统,它也可以用作 Docker 容器的文件系统。与 AUFS 和 OverlayFS 类似,Btrfs 通过层叠多个文件系统来实现容器文件系统的管理。
Linux 发行版Docker 推荐使用的存储驱动
Docker on Ubuntuoverlay2 (16.04 +)
Docker on Debianoverlay2 (Debian Stretch), aufs, devicemapper
Docker on CentOSoverlay2
Docker on Fedoraoverlay2

表来源:https://yeasy.gitbook.io/docker_practice/underly/ufs

文件系统

AUFS

一种联合文件系统,就是把不同物理位置的目录通过mount到一个目录中。

DVD/CD

.
├── A
│ ├── a
│ └── x
└── B
├── b
└── x

mount -t aufs -o dirs=./A:./B none ./C

特点:

  • 默认只有第一层可写,其余只读。
  • 增加文件:默认情况,新增文件放在最上面的可写层中。
  • 删除文件:底下各层是只读的,AUFS 使用 whiteout 机制,它的实现是通过在上层的可写的目录下建立对应的whiteout隐藏文件来实现的。
  • 修改文件: AUFS 利用其 CoW (copy-on-write)特性来修改只读层中的文件 。修改文件时将文件拷贝到可写层再进行修改。
  • 节省空间:多容器之间,共享分层,减少物理空间占用。
  • 查找文件性能:层数越深,性能越低,制作镜像时,注意减少层数。
  • 写入性能: CoW特性在写入大型文件时第一次会出现延迟。

OverlayFS

OverlayFS 的发展分为两个阶段,2014 年,OverlayFS 第一个版本被合并到 Linux 内核 3.18 版本中,
此时的 OverlayFS 在 Docker 中被称为overlay文件驱动。由于第一版的overlay文件系统存在很多弊
端, Linux 内核在 4.0 版本对overlay做了很多必要的改进,此时的 OverlayFS 被称之为overlay2。

overlay2 和 AUFS 类似,它将所有目录称之为层(layer),overlay2 的目录是镜像和容器分层的基础,而把这些层统一展现到同一的目录下的过程称为联合挂载(union mount)。

存在的问题

  • 容器间数据共享不方便
  • 文件存储于联合文件系统中,不易于宿主机访问;
  • **对于修改、删除类操作,一般效率比较低,**比如 I/O要求较高的应用MySQL、Redis,不适合容器化。
  • 删除容器会使得数据丢失:容器关闭之后,保留在上层的数据会随容器生命周期完结而消失。

Docker提供了数据卷处理这些问题。

Docker网络模式

网络基本原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),容器启动时,根据Docker网桥的网段分配给容器一个IP地址。
容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
bridge模式
Docker网桥是宿主机虚拟出来的,不是真实存在,外部网络无法寻址到,外部网络无法通过容器ID直接访问到容器。
如果希望外部能访问到,则需要进行端口映射,映射之后的访问格式:[宿主机IP]:[映射的端口]

网络模式

模式配置描述
bridge–net=bridge默认
host–net=host容器和宿主机共享Network namespace
container– net=container:NAME_or_ID指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,比如共享 IP、端口范围等。注意不是跟宿主机共享。
none–net=none独立的Network namespace,没有进行任何网络设置(如分配veth pair、网桥连接、配置IP等),需要自行配置。
overlay– driver overlay

bridge模式

Docker启动的时候,会在宿主机上创建虚拟网桥Docker0,之后我们运行的容器默认会连接到这个网桥上。

在创建启动容器的时候,从Docker0分配一个IP给容器使用,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth*这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

veth pair 包括两个虚拟网络接口:veth0 和 veth1。这两个接口被创建成一对,形成一个虚拟网卡链路。数据从一个接口进入,通过虚拟链路传输,然后从另一个接口出去。

bridge模式

在这种模式下,我们可以看到Internet无法直接访问我们的容器,所以,需要通过端口映射-p才能让外部访问。

host模式

在此模式下,容器将不会获得一个独立的Network Namespace,而是 和宿主机共用一个Network Namespace,使用宿主机的IP和端口。

容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是宿主机上已经使用的端口就会被占用,网络的隔离性不好。

外部能直接访问到容器A。

host模式

container模式

新创建的容器和已经存在的一个容器共享一个 Network Namespace,比如 共享 IP、端口范围等。而不是和宿主机共享Network Namespace。
container模式

none模式

Docker 容器拥有自己的 Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等
none模式

overlay模式

一种容器网络模式,它可以在多个Docker主机之间创建一个虚拟网络,使得容器可以跨主机进行通信。

当使用Overlay模式时,Docker会创建一个覆盖网络(Overlay Network),该网络会跨越多个主机,并且容器可以通过该网络进行通信。Overlay网络使用VXLAN(Virtual Extensible LAN)技术来实现容器之间的通信。

适用于容器编排和集群管理工具,如Docker Swarm和Kubernetes,以实现容器的高可用性和弹性扩展。

Overlay网络的性能可能会受到网络延迟和带宽的影响,因此在设计和配置Overlay网络时需要考虑这些因素。
image.png
特点总结:

  • 容器多主机通信:使得运行在不同主机上的容器间的通信,就像在同一个网络中的一样。
  • 跨主机网络:在多台主机(计算机)上创建一个逻辑网络,使得这些主机上的容器或虚拟机可以互相通信和交互。
  • 路由和发现:使用 VXLAN(Virtual Extensible LAN)技术来实现容器之间的网络隔离和路由。

参考

https://www.qikqiak.com/k8s-book/docs/10.Docker%20Swarm.html
https://yeasy.gitbook.io/docker_practice/underly/ufs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/175177.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度富文本上传图片后样式崩塌

🔥博客主页: 破浪前进 🔖系列专栏: Vue、React、PHP ❤️感谢大家点赞👍收藏⭐评论✍️ 问题描述:上传图片后,图片会变得很大,当点击的时候更是会顶开整个的容器的高跟宽 原因&#…

C++之类型转换

目录 一、C语言中的类型转换 二、C的强制类型转换 1、 static_cast 2、reinterpret_cast 3、 const_cast 4、dynamic_cast 一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型…

idea的设置

1.设置搜索encoding,所有编码都给换为utf-8 安装插件 eval-reset插件 https://www.yuque.com/huanlema-pjnah/okuh3c/lvaoxt#m1pdA 设置活动模板,idea有两种方式集成tomcat,一种是右上角config配置本地tomcat,一种是插件,如果使用插件集成,则在maven,pom.xml里面加上tomcat…

openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema

文章目录 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema110.1 创建、修改和删除Schema110.2 搜索路径 openGauss学习笔记-110 openGauss 数据库管理-管理用户及权限-Schema Schema又称作模式。通过管理Schema,允许多个用户使用同一数据库而不…

XML教学视频(黑马程序员精讲 XML 知识!)笔记

第一章XML概述 1.1认识XML XML数据格式: 不是html但又和html有点相似 XML数据格式最主要的功能就是数据传输(一个服务器到另一个服务器,一个网站到另一个网站)配置文件、储存数据当做小型数据可使用、规范数据格式让数据具有结…

多线程---synchronized特性+原理

文章目录 synchronized特性synchronized原理锁升级/锁膨胀锁消除锁粗化 synchronized特性 互斥 当某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象的synchronized就会阻塞等待。 进入synchronized修饰的代码块相当于加锁 退出synchronize…

基于Qt 文本读写(QFile/QTextStream/QDataStream)实现

​ 在很多时候我们需要读写文本文件进行读写,比如写个 Mp3 音乐播放器需要读 Mp3 歌词里的文本,比如修改了一个 txt 文件后保存,就需要对这个文件进行读写操作。本章介绍简单的文本文件读写,内容精简,让大家了解文本读写的基本操作。 ## QFile 读写文本 QFile 类提供了读…

一个注解,实现数据脱敏-plus版

shigen坚持日更的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。坚持记录和分享从业两年以来的技术积累和思考,不断沉淀和成长。 当看到这个文章名的时候,是不是很熟悉,是的shigen之前发表了一个这…

【PC】特殊空投-2023年10月

亲爱的玩家朋友们,大家好! 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧!签到活动,每周一次的PUBG空投节,还有可以领取PGC2023免费投票劵的活动等着大家!…

聊聊统一认证中的四种安全认证协议(干货分享)

大家好,我是陈哈哈。单点登录SSO的出现是为了解决众多企业面临的痛点,场景即用户需要登录N个程序或系统,每个程序与系统都有不同的用户名和密码。在企业发展初期,可能仅仅有几个程序时,管理账户和密码不是一件难事。但…

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 (4G版) https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介: 通过局域网/广域网网组网的网络报警系统,改变传统局域网组网…

数据结构与算法解析(C语言版)--搭建项目环境

本栏目致力于从0开始使用纯C语言将经典算法转换成能够直接上机运行的程序,以项目的形式详细描述数据存储结构、算法实现和程序运行过程。 参考书目如下: 《数据结构C语言版-严蔚敏》 《数据结构算法解析第2版-高一凡》 软件工具: dev-cpp 搭…

HTML标题、段落、文本格式化

HTML标题&#xff1a; 在HTML文档中&#xff0c;标题是很重要的。标题是通过<h1> - <h6标签进行定义的&#xff0c;<h1> 定义最大的标题&#xff1b;<h6>定义最小的标题。 <hr> 标签在HTML页面中用于创建水平线&#xff0c;hr元素可用于分隔内容。…

IntelliJ IDEA 安装mybaits当前运行sql日志插件在线与离线安装方法

先安装好idear 去网上找找这个安装包下载下来&#xff0c;注意版本要完全一致&#xff01; 比如&#xff1a; https://www.onlinedown.net/soft/1233409.htm手动安装离线插件方法举例 提前下载好插件的安装包 可以去网上下载这个安装包 搜索离线安装包的资源&#xff0c;包…

公司电脑禁用U盘的方法

公司电脑禁用U盘的方法 安企神U盘管理系统下载使用 在这个复杂的数据时代&#xff0c;保护公司数据的安全性至关重要。其中&#xff0c;防止未经授权的数据泄露是其中的一个关键环节。U盘作为一种常用的数据传输工具&#xff0c;也成为了潜在的安全风险。因此&#xff0c;公司…

2011-2021年上市公司百度指数数据

2011-2021年上市公司百度指数数据 1、时间&#xff1a;2011-2021年 2、指标&#xff1a;股票代码、股票名称、年份、类型、PC移动、PC端、移动端 3、来源&#xff1a;百度指数 4、范围&#xff1a;上市公司 5、样本量&#xff1a;7.4W 6、指标解释&#xff1a;百度指数&a…

Qt 实现侧边栏滑出菜单效果

1.效果图 2.实现原理 这里做了两个widget&#xff0c;一个是 展示底图widget&#xff0c;一个是 展示动画widget。 这两个widget需要重合。动画widget需要设置属性叠加到底图widget上面&#xff0c;设置如下属性&#xff1a; setWindowFlags(Qt::FramelessWindowHint | Qt::…

爱写bug的小邓程序员个人博客

博客网址: http://www.006969.xyz 欢迎来到我的个人博客&#xff0c;这里主要分享我对于前后端相关技术的学习笔记、项目实战经验以及一些技术感悟。 在我的博客中&#xff0c;你将看到以下主要内容&#xff1a; 技术文章 我将会分享我在学习前后端技术过程中的一些感悟&am…

软件工程:小组开发过程技术(VS VSS UNIX C++)

&#xff08;注&#xff1a;这个东西是2007年写的&#xff0c;算是个缅怀&#xff0c;或是个吐槽。所有注都是本次发布新加的。&#xff09; 简介 本文讲述完全没有软件工程经验的软件小组如何借助VS VSS等工具为UNIX开发C程序&#xff0c;实现在小组规模的初级开发过程。这不…

回文链表Java

我们可以采用双指针的办法进行,如下图: 如果链表长度为偶数,则直接从第二个指针的位置开始对链表进行反转;如果是奇数,则从第二指针的下一位进行链表反转 代码实现: public static void main(String[] args) {ListNode next4 new ListNode(1, null);ListNode next3 new Lis…