Linux容器

容器

简单点说,容器就是一个或多个进程以及他们所能访问的资源的集合。

容器技术的本质是对计算机系统资源的隔离和控制,让原来全局的资源变得只能部分进程之间共享,这跟我们常说的虚拟机这种虚拟化技术没有关系,最新的标准在制定过程中,包括镜像的格式,容器运行时的一些规范具体见Open Container Initiative(OCI)

容器和虚拟机

对于一个接触虚拟机很久的人来说,因为用的 MAC ,所以从大一开始我就安装了 windows 的虚拟机,当然很大一部分原因是因为要用 VS 开始学习编程,但是更多的还是用来打撸了哈哈,后来大二我安装了 Ubuntu ,这是我第一次接触Linux系统,虽然感觉和 macOS 差不多的样子,但是还是让我深深地爱上了 Linux

扯得有点远了,其实虚拟机和容器是完全不同的技术,虽然他们都是为了让我们有一个不同的系统来安装我们需要的环境或者是其他,但是从本质上来说容器例如 Docker 是一个使用了 Linux NamespaceCgroups 的虚拟化工具,而虚拟机则是一套完整的系统环境。

我们接下来的学习也是围绕这容器使用到的
NamespaceCgroups 这两个经典的 Linux 功能来进行的。

容器特点

不同的Linux发行版可以共享内核

当进程开始运行后,进程和内核的交互就是系统调用,当进程需要访问由内核管理的资源时,采用软件中断的方式和内核交互,每个系统调用都有一个中断号,并且这个号不会随着内核版本变化而变化。

并且Linux内核和应用层进程之间的关系是松耦合的,只要保证两个条件:

  • 内核能识别应用层程序的格式
  • 应用层需要的系统调用内核能支持

由于Linux下可执行文件和动态库的格式以及系统调用的接口都比较稳定,所以不同的Linux发行版在大部分情况下都可以共享同一个内核

启动迅速

容器的本质是一个或多个进程以及他们所能访问的资源的集合。启动一个容器的步骤大概就是:

  • 配置好相关资源,如内存、磁盘、网络等配置资源就是往系统中添加一些配置,非常快

  • 初始化容器所用到的文件目录结构由于Linux下有COW(copy on write)的文件系统,如Btrfs、aufs,所以可以很快的根据镜像生成容器的文件系统目录结构。

  • 启动进程和启动一个普通的进程没有区别,对Linux内核来说,所有的应用层进程都是一样的

从上面可以看出启动容器的过程中没有耗时的操作,这也是为什么容器能在毫秒级别启动起来的原因

Docker在各平台上的运行机制

内核是否共享

Docker在Linux上共享内核,无需虚拟化,完全支持native功能
Docker在Windows上,启用Hyper-V或者虚拟化技术,通过虚拟机来实现,不共享windows内核。

Docker在macOS上,同样用虚拟化技术xhyve或者virtualbox来实现,不共享macOS内核。

Docker类型

  • Docker在Linux上共享内核,只能创建Linux类Docker。

  • Docker在Windows上,可以创建Linux类Docker和Windows类Docker。

  • Docker在macOS上,只能创建Linux类Docker,不能创建Mac OSX的Docker。

接下来我们就先来学习 Namespace 的相关知识