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 |
表来源: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直接通信。
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。这两个接口被创建成一对,形成一个虚拟网卡链路。数据从一个接口进入,通过虚拟链路传输,然后从另一个接口出去。
在这种模式下,我们可以看到Internet无法直接访问我们的容器,所以,需要通过端口映射-p
才能让外部访问。
host模式
在此模式下,容器将不会获得一个独立的Network Namespace,而是 和宿主机共用一个Network Namespace,使用宿主机的IP和端口。
容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是宿主机上已经使用的端口就会被占用,网络的隔离性不好。
外部能直接访问到容器A。
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)技术来实现容器之间的网络隔离和路由。
参考
https://www.qikqiak.com/k8s-book/docs/10.Docker%20Swarm.html
https://yeasy.gitbook.io/docker_practice/underly/ufs