之前因为最开始,考虑到大家对docker虚拟化的了解不多,所以前面博客,对docker的描述很浅显,而且很简单,只是谈了一下它的特性和它的用途,现在我们对docker有了一定的运用和实战了解,故本篇博客旨在对docker原理进行深入剖析!
一、Docker引擎架构
docker引擎是一个C/S结构的应用,组件如图所示:
Server端是一个常驻进程,注意服务端就是一个进程而已,并不是服务器!
REST API 实现了client和server间的交互协议;
docker CLI(docker命令行) 实现容器和镜像的管理,为用户提供统一的操作界面。
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布。client和server可以运行在同一台集群,也可以通过跨主机实现远程通信,架构如图所示:
注:Docker守护进程(服务端)实现了静态向动态的转变。
二、Docker镜像原理
一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。
Docker镜像作为docker中最基本的概念,有以下几个特性:
- 镜像分层,每个镜像都由一个或多个镜像层组成;
- 可通过在某个镜像加上一定的镜像层得到新镜像(此过程可通过编写dockerfile或基于容器Commit实现);
- 每个镜像层拥有唯一镜像ID;
- 镜像在存储和使用时共享相同的镜像层(根据ID),所以在pull镜像时,已有的镜像层会自动跳过下载;
- 每个镜像层都是只读,即使启动成容器,也无法对其真正的修改,修改只会作用于最上层的容器层;
最下面的镜像层:只能读,不能写,不能改动,一个命令算一层,尽量减少镜像层数
Init Layer(RO):初始化层,这一层主要是复用部分宿主机的配置文件,比如:resolv.conf,启动docker容器时会进入这一层。
Read_write Layer(RW):读写层(容器层),这一层当你进入docker容器的终端时,就处于这一层,且在这一层你做的所有修改都不会影响镜像,修改只对容器层起作用!