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

Docker文件系统

Linux基础

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

bootfs(boot file system)

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

引导文件系统包括:启动所需的映像文件引导加载程序(bootloader)。image.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值