Docker的前世今生
1、什么是容器?
容器是一种基础工具,泛指可以容纳其他物品的工具,可以部分或者完全封闭,用于容纳、储存、运输物品,物体可以被放置在容器中,而容器则可以保护内容物。人类使用容器的历史至少有十万年,甚至可能有数百万年的历史。
2、什么是Linux的容器(LXC-Linux Container)?
一种操作系统层虚拟化(Operating system–level virtualization)技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要引导任何虚拟机。
LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。软件Docker被用来管理LXC的环境。
3、容器的前世今生
发展历程:容器技术最早出现在FreeBSD上叫做 jail,将一个进程放入jail中运行,不管这个进程在其中发生怎样的错误都不会影响到系统上其他进程的运行jail技术在Linux中的实现叫做vserver,vserver所实现的功能体现为chroot。
FreeBSD jail,一种操作系统层虚拟化技术,在FreeBSD操作系统中运作。利用这个技术,FreeBSD的系统管理者,可以创造出几个小型的软件系统,这些软件系统被称为监狱(jails)。
这个技术被Poul-Henning Kamp采纳,加入FreeBSD系统中。2000年,伴随FreeBSD 4.0版的发布,正式对外公开。系统管理者可以使用jail(8)这个命令来调用这个服务。
这个技术的目标是:
A)虚拟化:每个软件监狱(jail)都是在主机机器上执行的一个虚拟环境,有它自己的档案系统,行程,使用者与超级使用者的账户。在软件监狱内运行的行程,它面对的环境,跟实际的操作系统环境几乎是一样的。
B)安全性:每个软件监狱都是独立运作,与其他软件监狱隔离,因此能够提供额外的安全层级。
C)容易删除及创建:因为每个软件监狱的运作范围有限,这使得系统管理者可以在不影响整体系统的前提下,以超级使用者的权限,来删除在软件监狱下运作的行程。
这个技术是基于类Unix系统下的chroot机制,进一步发展而来。chroot jail限制行程只能存取某个部分的档案系统,但是FreeBSD jail机制限制了在软件监狱中运作的行程,不能够影响操作系统的其他部分。也就是说,在软件监狱中的行程,是运作在一个沙盒上。
namespaces:容器技术出现的主要目的是为了"资源隔离",资源隔离包括:
名称 | 描述 | 内核版本 |
---|---|---|
UTS | 主机名和域名的隔离 | 2.6.19 |
Mount | 文件系统的隔离 | 2.4.19 |
IPC | 进程间通信隔离 | 2.6.19 |
PID | 进程编号隔离 | 2.6.24 |
User | 用户空间隔离 | 3.8 |
Network | 网络空间隔离 | 2.6.29 |
为了支持容器技术,Linux在内核中通过namespaces原生支持这6种资源隔离,并且直接通过系统调用对外进行输出
目前Linux上所谓的容器技术就是依靠namespaces技术实现的
cgroups:用于控制每个namespace中的资源分配:
blkio | 块设备io |
---|---|
cpu | cpu |
cpuacct | cpu资源使用报告 |
cpuset | 多处理器平台上的cpu集合 |
devices | 设备访问 |
freezer | 挂起或恢复任务 |
memory | 内存用量及报告 |
perf_event | 对cgroup中的任务进行统一性能测试 |
net_cls | cgroup中的任务创建的数据报文的类别标识符 |
LXC(LinuX Container):有了namespaces和cgroups那么Linux已经拥有了实现容器技术的前提,这时如果想要使用容器技术可以通过写代码调用系统调用实现容器技术。
但是有多少用户可以写代码实现容器技术那? 所以LXC应运而生,他使用户可以通过一组工具完成容器的创建。
lxc中有个命令叫做 lxc-create 用于根据模板创建容器,在模板中定义需要安装的容器系统发行版以及一系列的安装步骤。
LXC的问题:
1、迁移困难
2、持久化困了
3、批量创建容器困难
Docker:Docker在一定程度上是LXC的增强版,早期的Docker使用LXC作为容器引擎,所以也可以说Docker是LXC的二次封装发行版
目前docker使用的容器引擎为runC,其是容器运行时标准的实现之一。
Docker使用镜像的方式启动容器,解决了LXC所面临的问题。
目前市面上所说的容器通常指Docker,其以成为事实上的工业标准。
4)虚拟机与容器的区别
A)docker直接构建在Linux操作系统之上,其使用的内核为当前宿主机的内核;虚拟机一般构建在虚拟机管理软件之上,拥有独立的内核。
B)由于docker直接使用宿主机内核所以其性能接近宿主机性能;虚拟机使用自己的内核,但是其内核也是虚拟出来的所以需要进行两级调度性能相对较差。
C)docker使用内核的namespace进行用户空间隔离,虚拟机使用独立内核。虚拟机的隔离相对较好。
D)docker相对虚拟机更加轻量,其他和部署更加方便快捷。
E)每个docker容器一般只运行一个进程,一个虚拟机通常运行多个进程。
虚拟机技术
容器技术