千锋云计算培训老师在刚刚过去的2017年,做了一个月的免费Docker公开课,受到了广大朋友的一致好评。错过的朋友也没有关系,这里有文字版。
Docker依赖Linux LXC技术,轻量容器概念,其上实际运行的程序是在宿主机上的,本身不是完整的程序系统,也正是其特别之处。
根据Docker布道师Jerome Petazzoni的说法,Docker约等于LXC+AUFS(之前只支持ubuntu时)。其中LXC负责资源管理,AUFS负责镜像管理;而LXC又包括cgroup、namespace、chroot等组件,并通过cgroup进行资源管理。所以只从资源管理这条线来看的话,Docker、LXC、CGroup三者的关系是:cgroup在最底层落实资源管理,LXC在cgroup上封装了一层,Docker又在LXC封装了一层。
Docker是Linux下应用容器引擎,提供一种比LXC高级的API。Docker使用Go语言开发,利用了Linux提供的LXC,AUFS,namespace和cgroup技术。实现了文件系统,资源和网络的隔离,最终目标实现类似PaaS平台的应用隔离。
LXC——Linux容器工具,容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。与虚拟化相比,这样既不需要指令级模拟,也不需要即时编译。容器可以在核心 CPU 本地运行指令,而不需要任何专门的解释机制。此外,也避免了准虚拟化(paravirtualization)和系统调用替换中的复杂性。
容器在提供隔离的同时,还通过共享这些资源节省开销,这意味着容器比真正的虚拟化的开销要小得多。
我们都知道Linux有一个进程号为1,名字为init的进程,系统服务的父进程都是init进程。
Docker容器中进程号为1的进程是bash,而不是init,一个运行的Linux竟然没有init进程,简直太不思议了。这其实得益于强大的Linux提供的LXC功能。宿主机器中运行的docker服务就是该容器中ubuntu系统的init进程。其实每个运行的容器仅仅是宿主机器中运行的一个进程而已,在容器中运行的任何程序其实也是运行在宿主机器中的一个进程。Docker通过cgroup将属于每个容器的进程分为一组进行资源(内存,cpu,网络,硬盘)控制;通过namespace将属于同一个容器的进程划分为一组,使分属于同一个容器的进程拥有独立的进程名字和独立分配的进程号,比如宿主机器存在一个进程号为1的进程,容器中也存在一个进程号为1的进程。
如果对同一台服务上的少数应用需要控制资源的直接使用 cgroup 是较好的选择,可以按用户或用户组控制系统资源。如果服务需要指出多种环境,那么 Docker 就是最好的。
相关文章
了解千锋动态
关注千锋教育服务号
扫一扫快速进入
千锋移动端页面
扫码匿名提建议
直达CEO信箱