概述
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。通过镜像运行得到容器后,会在镜像上添加一层读写层,所有对于容器的修改都保存在这一层,所以容器的运行不会修改镜像,同时保证可以利用同一个镜像运行多个容器不会相互干扰。
原理
Docker是如何做到把应用所有的依赖项全部打包,将应用运行在一个隔离的环境里面?先来看看一个应用运行的整个生命周期的依赖是什么:
- 文件系统(进程的代码文件,配置文件,运行中读写文件等信息)
- 权限(主要由用户控制进程的访问权限)
- 进程间通信(进程之间的相互数据交互,常用信号量,消息队列,共享内存等)
- 网络(进程通过网络进行通信)
- 进程树(进程启动后,会形成进程树)
- 主机名和域名(进程所在机器的主机名)
Linux如何做到以上的所有的资源的隔离?主要是利用Linux namespaces实现程序的隔离,包括
- mount namespace, 实现文件系统隔离
- user namespace 实现用户隔离
- network namespace 实现隔离网络设备、网络协议栈
- IPC namespace 实现进程间交互的隔离
- pid namespace 实现进程树的隔离
- uts namespace 实现主机名和域名的隔离