容器技术是微服务的解决方案之一。
容器和虚拟机
以往的单体应用部署通常使用虚拟机创造出应用需要的操作系统和依赖环境,但是虚拟机消耗的硬件资源较大。当单体应用被拆解为体量较小的微服务时,使用虚拟机就不太划算了。所以硬件开销比虚拟机小的容器成为一种可选的微服务解决方案。
容器类似于虚拟机,可以创造出独立的运行环境。但和虚拟机不同的是,容器内的进程运行在宿主机的操作系统上,只是进程本身会觉得自己是操作系统内唯一的进程。而虚拟机需要自己的系统进程,会损耗更多的系统资源,所以通常会把多个单体应用分组部署在一个虚拟机内。容器技术允许每个微服务应用单独运行在一个容器内,最终使得同一台裸机上可以运行更多的应用程序。另外运行容器也不像虚拟机那样需要开机(运行自己的系统服务),所以容器中的进程可以更快的启动。
容器的隔离方案
容器可以通过Linux命名空间和Linux控制组这两种方案实现进程之间的隔离。
Linux命名空间
linux中,用多种资源类型:
- Mounf(mnt)
- Process ID(pid)
- Network(net)
- Inter-process communicaion (ipd)
- UTS
- User ID(user)
每种类型的资源都有命名空间用于隔离对应的资源,比如UTS命名空间决定了运行在命名空间里的进程能看见哪些主机名和域名。 通过分派两个不同的 UTS 命名空间给一对进程, 能使它们看见不同的本地主机名。
当创建了一个新的命名空间后,就可以在这个命名空间内组织这些资源。而在这个命名空间内运行的程序只能看到相同命名空间内的资源。
Linux控制组
Linux控制组/cgroups是一种Linux的内核功能,用于限制一个进程或一组进程可以使用的资源。
容器的限制
- 容器没有自己的内核,所以如果宿主机的内核和容器的内核模块不能匹配,那么容器时不能在这台宿主机上运行的
- 容器只能运行在和编译机器的架构具有相同硬件架构的宿主机上。比如x86架构便宜的应用容器不能运行在ARM架构的机器上。