1.3 容器虚拟化与Docker
1.3.1 容器虚拟化技术
容器化应用不是直接在宿主机上运行的应用,而是运行应用程序的传统方法,将应用程序直接安装在宿主机的文件系统上,并从文件系统运行它,其环境包括宿主机的进程表、文件系统、IPC设施、网络连接、端口及设备。
有时,应用程序迭代更新时,需要应用程序在系统上运行不同版本的应用。这就很容易引起应用程序间的冲突。比如,多个应用程序占用同一个端口的情况,如mysql的3306端口与网页的80端口,这些都是一台宿主机无法解决的问题。
容器化应用不是在虚拟机上运行的应用,虚拟机上的应用作为宿主机独立的操作系统运行,解决了应用直接在硬件上运行缺乏的灵活性,可以在宿主机上启动10个不同的虚拟机来运行10个应用程序,虽然每个虚拟机上的服务监听了同一个端口号3306,但是每个虚拟机有自己独立的IP,所以不会起冲突,但是一个虚拟机运行耗费了很多空间,占用大量的CPU,或者虚拟系统占用的CPU远比你的应用程序消耗的高得多。
容器化应用独立运行环境如下。
(1)文件系统。
容器拥有自己的文件系统,默认情况,它无法看到宿主系统的文件,该规则有一个例外,即有些文件(如/etc/hosts、/etc/resolv.confDNS服务文件)可能会被自动挂载到容器中。另一个例外是当容器运行镜像时,可以将显示的宿主机的目录挂载到容器中。
(2)进程表。
Linux宿主机上运行着成千上万的进程,默认情况下,容器内无法看到宿主机的进程表,因此,你的应用在容器启动时,pid为1。
(3)网络接口。
默认情况下,容器会通过DHCP从一组私有IP地址确定IP。
(4)IPC设备。
容器内运行的进程不能与宿主机系统上运行的进程通信设施交互,可以将宿主机上的IPC设备暴露给容器,每个容器都有自己的IPC设施。Linux IPC:Pipe Signal Message Semaphore Socket共享内存。
(5)设备。
容器进程无法直接看到宿主机的设备,可以设置特殊权限,在启动容器时授予权限。