docker操作

容器技术概述

虚拟化技术的发展背景

在追求服务器资源最大化利用的过程中,我们发现将多个应用部署在同一台服务器上虽然提高了利用率,但也增加了系统故障的风险。因此,为了确保服务的隔离性和可用性,人们开始将应用分类部署到不同的服务器上。然而,这种做法牺牲了资源利用率。为了平衡资源隔离和利用率,虚拟化技术应运而生。

虚拟化技术实例

  • Windows平台的VMware Workstation
  • Linux平台的KVM模块
  • 虚拟化系统如ESXi、Proxmox VE等

容器技术的兴起

虚拟化技术虽然解决了资源隔离的问题,但虚拟机的重量级特性(每台虚拟机都包含完整的操作系统)使得资源消耗较大。为了实现更轻量级的应用虚拟化,容器技术应运而生。

容器技术的三大核心技术

1. 名称空间(Namespaces)

名称空间技术通过将机器的相关资源(如CPU、内存、磁盘、主机名、进程ID、网络等)隔离在一个小空间内,实现了容器的基础隔离功能。

2. 控制组(Cgroups)

控制组技术用于限制容器对资源的使用:

  • 可压缩资源:如CPU,超出限制时会降低CPU时间片的频率。
  • 不可压缩资源:如内存,超出限制时会触发容器级别的OOM(Out of Memory)机制,可能导致容器进程被杀掉。

3. 联合文件系统(Union File Systems)

联合文件系统技术允许容器共享宿主机的内核,而只需复制必要的文件到容器目录中,从而“欺骗”应用认为它运行在一个独立的操作系统上。容器内的操作系统只包含rootfs(文件系统),而不包含bootfs(引导信息和内核)。

容器与操作系统的关系

  • bootfs:引导信息和内核,对于不同的Linux发行版基本相同。
  • rootfs:文件系统,不同的Linux发行版有不同的rootfs。
  • 容器共享宿主机的内核(bootfs),而每个容器有自己的rootfs。

通过这种方式,容器技术实现了应用的轻量级虚拟化,同时保持了资源的高效利用和隔离性。

总结

1. 容器使用场景更广

虚拟机里通常不会再跑虚拟机,但是虚拟机里可以跑容器。

虚拟化技术依赖的是物理CPU和内存,是硬件级别的;

容器技术是构建在操作系统层面的,是进程级别;

2. 容器更加轻量

一个虚拟机需要具备三要素:虚拟硬件、bootfs、rootfs,而一个容器的启动只需要一个rootfs。

容器不需要虚拟硬件、不需要安装操作系统,只有一个rootfs,所以更加轻量。

3. 容器可移植性/跨平台性更强

容器本身就是一个进程,不依赖硬件,只要硬件之上的操作系统支持容器技术,那么容器就可以跑起来,所以可移植性强,但是虚拟机依赖硬件,可移植性差。

补充: 对于Linux系统,不同的发行版bootfs基本一致,主要不同就是rootfs,也就是容器镜像,所以如果一个容器的镜像打包的是Linux系统的rootfs,那么它可以在不同的发行版上运行良好,别问能不能在windows上跑这么愚蠢的问题,当然不能了,你心里反复默读几遍,Linux系统-bootfs:rootfs。容器镜像打包的是rootfs,windows系统的内核与Linux的bootfs肯定不一样啊。当然你如果在windows系统里装个虚拟机工具vmware workstation然后创建出一台虚拟机装个Linux系统,然后在这个Linux系统里跑我们此处提到的容器,那么肯定是可以跑起来的。

容器技术分析

名称空间(Namespaces)

Linux Namespace是Linux提供的一种内核级别环境隔离的方法。关于隔离的概念其实大家早已接触过:比如在光盘修复模式下,可以用chroot切换到其他的文件系统,chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上又提供了很多其他隔离机制。

当前,Linux 支持6种不同类型的命名空间。它们的出现,使用户创建的进程能够与系统的资源更加彻底,从而不需要使用更多的底层虚拟化技术。

分类 系统调用参数 相关内核版本
Mount namespaces(挂载资源) CLONE_NEWNS Linux 2.4.19
UTS namespaces(主机名) CLONE_NEWUTS Linux 2.6.19
IPC namespaces(进程间通信) CLONE_NEWIPC Linux 2.6.19
PID namespaces(PID) CLONE_NEWPID Linux 2.6.24
Network namespaces(网络) CLONE_NEWNET 始于Linux 2.6.24 完成于Linux 2.6.29
User namespaces(用户名) CLONE_NEWUSER 始于Linux 2.6.23 完成于Linux 3.0

联合文件系统(Union File Systems)

容器内的rootfs根文件系统类型,并不是在普通linux节点上看到的EXT4或者XFS之类的常见文件系统,而是Overlay。Overlay是一种联合文件系统UnionFS(OverlayFS简称overlay)是UnionFS的一种具体实现),联合文件系统顾名思义,可以把文件系统上多个目录(分支)内容联合挂载到同一个目录下,使用者也就是容器看起来认为是一个目录,而实际上在物理机里是由多个目录构成的。

OverlayFS使用两个目录,把一个目录置放于另一个之上,并且对外提供单个统一的视角。这两个目录通常被称作层,这个分层的技术被称作union mount,术语上,下层的目录叫做lowerdir,上层的叫做upperdir。对外展示的统一视图称作merged。

overlay

lowerdir ——> 镜像层,挂载的系统文件,只读
upperdir ——> 容器层,修改文件的相关内容都在这里放着
merged ——> 容器映射层,我们在容器里看到的就是这一层,所以该层也可以称之为展现层
针对这三层,我们从下往上看,看到的merged里的内容来自superdir与lowerdir的组合,以及upperdir里的内容。