Docker vs 虚拟机
Docker 和 虚拟机的区别 https://blog.fundebug.com/2017/05/31/docker-and-vm/
Linux 操作系统
- 内核层(Kernel Layer) 主要进程调度、文件系统、IO、内存管理
- 用户层 主要与系统内核进行交互
一般不同的linux版本,使用的是同一套内核代码,不同的是用户层的差异。
Docker 特点
- 容器环境配置,无需再关心操作系统层
- 多个容器之间相互隔离,可以共享宿主环境
- 轻量级,可以快速启动
- 支持自动缩扩容,可以主动释放、启动容器
Docker 架构
从底层技术来看的话,Docker 底层是依赖 Linux Kernel 的三项技术,分别是 Union FS
、CGroups
、 Namespaces
简单概括就是:
- 利用
Namaspces
做环境隔离限制 - 利用
CGroup
做资源大小限制 - 利用
Union FS
做容器的文件系统的轻量级虚拟化技术
具体分为:
Union File System
联合系统文件
主要是对文件系统进行分层。
Linux 中的文件系统有一个挂载(mount)功能,允许将一个外部系统(例如:usb、移动硬盘)以本地路径的形式去访问。
Union File System(Union FS),则类似上述 linux 的挂载机制。它是在挂载的基础上,可以将本地路径,挂载到多个目标目录。
Union FS 技术首先运用到镜像、容器中。当运行容器时,Docker 会自动挂载镜像中的文件目录,以及宿主机上的一个临时、可写的文件目录。容器中所有的文件修改,都会写入到宿主机的这个临时目录下,当容器销毁后,同时将这个临时文件也会删除。
$ docker run -d --name <container_name> --mount type=bind,source=$PWD,target=<container_dir> <image:tag>
Control Groups
这项技术可以限制应用程序使用的资源,可以让宿主同时运行多个容器而相互之间不受影响。CGroups 可以限定容器使用的硬件资源,比如内存数量,CPU数量。
Namespaces
Namespaces技术来隔离容器,当容器运行的时候,Docker创建了一系列的Namespaces。通过 Namespaces,容器运行在独立的命名空间中,而外层没有访问权限。
PID Namespaces -- 用于进程的隔离
NET Namespaces -- 用于管理网络接口
IPC Namespaces -- 用于管理进程间的通信
MNT Namespaces -- 用于管理 Mount 点
UTS Namespaces -- 用于隔离内核和版本信息
Libcontainer
: 是对上面三种技术进行封装的库
Docker engine
: 用来控制容器 container 的运行,以及镜像文件的拉取