随着dotcloud的越发走红,Docker开始浮出水面,这个用Go语言开发的基于LXC的容器引擎,为应用提供了轻量级的环境。
我们在日常的开发和运维中可能会遇到以下的环境部署和管理问题:
- 当开发人员想去构建自己的开发环境,而该环境需要和生产环境尽可能相近,如何快速有效构建?
- 当开发人员专注于开发,运维人员需要更新软件,如何保证开发者方便地获取更新?
- 运维人员从分配机器到装机再到装环境,太多的人肉工作,通常发现开发或许只要2,3天,环境准备和部署需要个2,3天。
- 在企业中,应用成百上千,应用的部署、迁移、弹性伸缩等如何做?
Docker正是用来解决这些问题的,下面就来简单介绍下Docker用到的三个核心组件
namespaces、cgroups和AUFS。
下一期通过实践的方式来介绍如何在阿里云上使用Docker。
1. namespaces
namespace在一般的编程领域里我们称为命名空间,用来避免命名冲突,在容器世界似乎也可以这么称呼,因为它提供了资源隔离。
有多种不同类型的namespaces,pid、net、ipc、mnt、uts、user等,每种类型都和特别的资源挂钩。拿最常用的pid namespace来说,由于不同namespace有自己的空间,进程id是可以重复的,因此它可以隔离不同用户的进程,不仅如此,不同的pid namespace可以有等级制度,内核会跟踪他们之间的关系。
2. cgroups
cgroups让你能够对进程分配资源,以及实现资源的度量。从概念上说和ulimit有点像,和ulimit不同的是,cgroups是对一组进程做资源配额限制。各个cgroups子系统在此就不做详细介绍了,大家有兴趣可以查官方文档。
3. AUFS
AUFS是一种可堆叠的联合文件系统,能将多个目录整合成单一目录。从下图中可以看出Docker是如何使用AUFS的。
上层的image依赖下层image,下层image称为父(parent)image,parent没有指向的image就是base image。当要从一个image启动一个容器时,Docker会从parent中找到该image的层级关系,并一层层加载,用户的进程运行在最上面的可写层中。