网络隔离
自行设定的网络
lxc采用veth技术,每次虚拟机建立时,都会产生一对veth。虚拟机内的一般叫做eth0,虚拟机外的叫做vethXXX。这张网卡可以以任何linux许可的方式进行配置。
- dnsmasq所产生的dhcp封包无法被debian guest的dhcp client承认,因此无法使用dnsmasq自动部署网络。
使用iptables配置访问
在开启br-nf后,所有bridge的包都会经过iptables的过滤。因而可以用iptables的FORWARD规则限制guest堆外网的访问。
Docker的本质是Container,很多人疑惑Container与VM的区别,Container作为一种应用封装容器,在表象上类似于虚拟机VM,但在实现的原理和应用上与虚拟机VM其实有着巨大的区别:
VM一般指系统虚拟化,每个虚拟机的运行环境由VMM(虚拟化管理器)仿真而成,每个VM运行各自的内核;而Container仅仅是应用封装容器,它在应用态封装了一个rootfs,多个Container共享同一个内核。VM和Container的总体架构图对比如上所示。从使用者的角度,Container和VM一样也拥有独立虚拟机这个假象,这正是底下内核的namespace和cgroup所努力达到的。不过由于Container的内核是共享的,这个假象虚拟机无法像VM虚拟机一样任意安装操作系统。在Docker Container用到的技术,除了namespace和cgroup,还用到了AUFS(联合文件系统)。这些是Docker Container在内核原理上主要的技术点。Namespace用做进程组的虚拟化,一组进程如果放入共同的namespace即产生没有资源限制的Container。一个进程的运行环境通常包括:pid,父pid;uid,gid;VFS mount(rootfs),net协议栈,hostinfo, IPC, /proc, /sys等。在有Container之前,所有应用程序的rootfs都是一样的,即整个操作系统的根目录;所有进程涉及到的网络环境都是一样的,即同样的IP地址,同样的路由,同样的网络接口。namespace的功能,允许多个进程组成一个container拥有独立的运行环境,不同container有不同的rootfs,不同的网络协议栈,不同的IPC。这就是namespace,进程运行环境所涉及的方方面面都有相应的namesapce。总的来说,Namespace可以制造一种虚拟机的假象,可以实现独立的mnt;独立的pid空间;独立的网络协议栈;独立的IPC;独立的/proc /sys。
但Container如果只有Namespace,资源无法根据需求QoS配置,因此这里需要借助Cgroups。cgroup用于进程组的资源隔离,我们能想到的方方面面的资源都可以通过cgroup来控制,比如控制一组进程总计使用多少CPU、总计使用多少内存;一组进程只能访问哪些设备;一组进程的IOPS最大只能多少。Container天然包含一组进程,Container就是借助cgroup来限制资源使用,使得不同Container用到的资源正确隔离。
在提供了类似虚拟机的环境,且资源得到保证之后,这时我们又会考虑另外一个问题:如何使Container变得更精简。假设:一个Container的rootfs大小是1G,100个Container要100G,这不但占用大量空间,而且传输起来相当费事。这里我们就会使用AUFS技术,以递进的方式创建"Container" —— 一个Container的rootfs叠在另一个上面,就像使用git增量开发一样。这样的话极大的节省了对存储的需求,也能加速容器的启动。 目前AUFS还有不太完善之处,例如,进行一个写的操作会需要导致整个文件的拷贝,AUFS本身的参数、细节太多,不可推理也不可预测,但整体上来说AUFS还是可以起到精简、提高性能的的作用。
在实际工作中,会有哪些场景适合Container或者VM呢?先来比较一下他们各自的优劣:Container运行开销小;部署速度;启动速度快,不需要走整个系统流程;VM运行开销大,因为多了一层Guest Kernel;启动速度较慢;但Container不能做在线迁移。我们以实际应用场景来说明,UCloud在一些内部的业务使用了docker,但没有像云主机一样像客户售卖Container。这是因为客户对虚拟机隔离性要求非常高,他们希望我们的虚拟机绝对安全,就目前为止,Container因为内核共享,无法做到彻底的隔离,也就没有令人放心的安全性。从资源切割的角度,个人认为,Container更适用于大公司的内部云平台,同一台物理机通过Docker Container部署不同的业务并相互隔离,提升资源利用率,简化业务管理和部署。特别是,Docker Container有着较完善的管理工具,可实现Container的一键打包、一键部署、一键运行,在业务迁移、部署方面很有优势。
我们相信Docker Container应用封装容器对开发、测试和运维能起到积极作用,对于云平台意义重大。让我们拭目以待未来Docker的发展!