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

Docker文件系统

Linux基础

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

bootfs(boot file system)

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

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

在 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发行版本间是不一样的。

在 Linux 中,根文件系统是文件系统层次结构的顶级目录,包含了操作系统中所有文件和目录的根源。根文件系统是文件系统的起点,它是整个文件系统层次结构的起点。

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

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

Docker镜像的基本原理

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

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

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

  • 基础镜像是只读的,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 Ubuntu overlay2 (16.04 +)
Docker on Debian overlay2 (Debian Stretch), aufs, devicemapper
Docker on CentOS overlay2
Docker on Fedora overlay2

表来源:yeasy.gitbook.io/docker_prac...

文件系统

AUFS

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

DVD/CD

java 复制代码
.
├── 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直接通信。

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。

none模式

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

overlay模式

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

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

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

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

特点总结:

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

参考

www.qikqiak.com/k8s-book/do...
yeasy.gitbook.io/docker_prac...

相关推荐
追风林7 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
城南vision9 小时前
Docker学习—Docker核心概念总结
java·学习·docker
wclass-zhengge9 小时前
Docker篇(Docker Compose)
运维·docker·容器
梦魇梦狸º13 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
鬼才血脉13 小时前
docker+mysql配置
mysql·adb·docker
詹姆斯爱研究Java13 小时前
Docker 的基本概念和优势
docker
南猿北者15 小时前
docker镜像仓库常用命令
运维·docker·容器
杨浦老苏15 小时前
Docker可视化管理面板DPanel的安装
运维·docker·群晖
航月17 小时前
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
nginx·docker·mariadb
微刻时光17 小时前
Docker镜像分成
java·运维·开发语言·docker·容器·镜像