命名空间
容器隔离环境,需要有一套虚拟的主机名、进程编号、网络地址、文件系统、用户系统等,这些是直接调用linux的命名空间实现的,而以下6个命名空间,是到内核3.8才全部实现。(centos7默认超过此内核版本,centos6-2.6-天然排除)
资源限制
主机虚拟化,在创建虚拟机时,就限定了给定多少内存、cpu等资源,虚拟机无法使用超过分配到的资源。
容器虚拟化,docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
容器最小化
在docker中,一个nginx容器,所有的linux环境只有为了运行nginx的最小化依赖组件,一个容器中,就是为了运行一个进程。
但在调试时,比如top、netstat、ps查看进程情况,看日志,就变得麻烦,需要进入容器去看。而且每个容器还必须包括这些调试工具。
分发和部署的简化
一个应用,以前可能在win下开发,上了linux还需要调试,甚至不同的centos版本还会不一样,因为底层环境不一样。现在都是一样的容器环境。
部署上,要安装一个java应用,必须先有java环境,还要关注时jdk8还是jdk7,现在只需要docker run。
分层构建&联合挂载
一个nginx镜像,由centos底层和nginx层组成,这个centos层,也可以同时用于httpd等其他。这叫分层构建
在启动一个nginx容器时,会使用centos底层,启动httpd时,也是这个centos底层,这叫联合挂载
底层是只读的,在nginx层下面有一个容器层,如果在这个nginx修改底层文件,实际上是在这个容器层修改。
容器生命周期
可以把容器看作进程,不需要时就停掉,甚至删掉。
而数据,比如nginx的静态资源,mysql的data,可以选择使用外部持久性存储。这样,当容器迁移时,可以方便的挂载。
容器编排
1 资源调度:把docker宿主机集群资源化,然后编排工具自己决定将容器运行在哪个空闲的宿主机上。
2 对于启动有依赖关系的多个服务,决定启动和停止的先后顺序