# 容器基础
容器其实是一种沙盒技术。应用可被装进沙盒里,这样应用与应用之间能不相互干扰,方便在各种环境移动部署,这是PASS最理想状态。
利用Namespace技术进行环境隔离,使用Linux Cgroups进行进程资源的控制。
一个正在运行的 Linux 容器,其实可以被“一分为二”地看待:
- 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜 像”(Container Image),是容器的静态视图;
- 一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行 时”(Container Runtime),是容器的动态视图。
# 容器的优势
- 容器是基于Namespace 技术实现隔离的进程,本质上还是操作系统上的进程,额外开销小。
- Hypervisor 实现的虚拟机需要运行完整的Guest OS,虚拟机本身需要占用内存,应用运行在虚拟机里,对宿主机操作系统的调用要经过虚拟化软件的拦截和处理,会损耗性能。容器化后的应用还是宿主机上的普通进程,几乎不带来性能损耗。
- 运行容器速度相对快一些,比较敏捷,高性能。
# 容器劣势
- 隔离不彻底,容器是运行在宿主机上的一种特殊进程,所以多个容器之间使用的还是同一个宿主机的系统内核,对内核的相关操作会有影响。
- 操作系统的版本会有兼容性问题,Windows宿主机运行Linux容器,或者低版本Linux宿主机运行高版本Linux容器会有问题。
- 在Linux内核中,有很多资源和对象不能被Namespace化。如容器中的程序使用settimeofday系统调用修改了时间,整个宿主机的时间都会被修改。
# 安全性问题
共享主机内核的容器给应用暴露出来的攻击相当大,攻击难度比虚拟机容易多。
实践中可以使用Seccomp等技术,对容器内部发起所有系统调用进行过滤和甄别来进行安全加固,但因为多了一层系统调用的过滤,会拖累容器的性能。