谈到容器,咱们就必须得谈谈虚拟化,咱们通常使用的虚拟机都是主机级别的虚拟化,主机级的虚拟化通常是在硬件上安装操做系统,操做系统上安装一个Hypervisor,而后hypervisor上在安装虚拟操做系统,又或者直接在硬件上安装Hypervisor。而容器技术与虚拟化技术的区别就在于宿主机上跑的是一个个的容器。所以在架构上少了一个hypervisor和许多的客户机,在性能上提高了许多。可是在资源隔离性方面没有主机级别的虚拟化好。以下图所示:linux
Virtualization and Containernginx
每一个容器在自身看来都是独立运行在操做系统之上的,不然何谈隔离性,so,每一个容器都须要隔离如下资源才能最小化运行:
1.UTS:主机名
2.Mount,挂载点、根文件系统
3.IPC,信号量、消息队列和共享内存
4.PID:每一个docker容器内都有本身独立的进程号
5.Net,每一个docker都有本身的网络设备、网络栈、端口等。
6.User,用户和用户组(内核 3.8支持)docker
以上名称空间在kernel 3.8后原生支持,固然还有其余一些可选的隔离资源,如:CPU、内存等经过Control Groups(cgroups)实现。而linux 容器(LXC)就是chroot+namespaces+cgroups等技术实现的,docker就是实现以上技术的工具。windows
docker经过事先制做好的镜像(如:nginx镜像),直接从仓库中拉去镜像并启动,因而一个nginx的docker就建立并成功启动了。那么,docker是如何能使nginx独立运行的呢?你们知道,docker一次打包,处处运行。他又如何屏蔽linux和windows底层的差异呢?docker的镜像底层是经过分层构建,联合挂载来实现的。就拿构建一个nginx镜像来讲,首先它会在底层构建一个最小的centos镜像,而后上一层构建一个ngxin镜像,而且每一个镜像都是只读的。centos