什么是docker(隔离的进程)
基于 Linux
内核的 cgroup
,namespace
,以及 AUFS
类的 Union
FS
等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
为什么用docker
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker
对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效
更快速的启动时间
Docker
容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。
一致的运行环境
Docker
的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性
更轻松的维护、扩展和迁移
Docker
使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单
基本概念
镜像(linux root
文件系统(rootfs
))
rootfs
其实就是针对特定的操作系统架构的一种实现形式。具体表现为,特定的文件夹,文件夹之间的关系,即组织架构,以及特定的各种文件。
Linux
中的rootfs
,就是那些文件夹和文件,包括根文件目录 /
,系统相关的配置文件目录/etc
,存放系统启动相关配置的/etc/init
,存放系统相关的工具 /sbin
,存放用户的工具/usr/bin
。
Docker
镜像是一个特殊的文件系统rootfs
,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
镜像充分利用 了Union FS
的技术,被设计为分层存储的架构。因此镜像并非是像一个 ISO
那样的打包文件。镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。
容器(镜像运行的实体)
容器的实质是进程,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID
空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。
每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
仓库(镜像集中存储)
Docker Registry
(集中的存储、分发镜像的服务)
一个 Docker Registry
中可以包含多个 仓库(Repository
);每个仓库可以包含多个 标签(Tag
);每个标签对应一个镜像。
底层实现技术
Namespaces
Linux namespace
实现了 6 项资源隔离,基本上涵盖了一个小型操作系统的运行要素,包括主机名、用户权限、文件系统、网络、进程号、进程间通信。
Control groups
Cgroup
是Linux
内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制。它是将任意进程进行分组化管理的Linux
内核功能。
cgroups
是基于内核的进程级资源等隔离工具。中的资源控制都是以为单位实现的。提供了以下功能:
限制进程组可以使用的资源数量。比如:
memory
子系统可以为进程组设定一个memory
使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发OOM
。进程组的优先级控制。比如:可以使用
cpu
子系统为某个进程组分配特定cpu share
记录进程组使用的资源数量。比如:可以使用
cpuacct
子系统记录某个进程组使用的cpu
进程组隔离。比如:使用
ns
子系统可以使不同的进程组使用不同的namespace
,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间进程组控制。比如:使用
freezer
子系统可以将进程组挂起和恢复。
Union File System
Docker
的存储驱动的实现是基于Union File System
,简称UnionFS
,他是一种为Linux
、FreeBSD
和NetBSD
操作系统设计的,把其他文件系统联合到一个联合挂载点的文件系统服务。它用到了一个重要的资源管理技术,叫写时复制。写时复制(copy-on-write
),也叫隐式共享,是一种对可修改资源实现高效复制的资源管理技术。对于一个重复资源,若不修改,则无需立刻创建一个新的资源,该资源可以被共享使用。当发生修改的时候,才会创建新资源。这会大大减少对于未修改资源复制的消耗。Docker
正式基于此去创建images
和containers
。