Docker简介


        Docker是一个开源的容器引擎 ,它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程

序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期


Docker的优点如下:

1,简化流程

2,避免选择恐惧症

3,节省开支


Docker的架构

Docker是什么?_docker

 Docker daemon( Docker守护进程)  

        Docker daemon是一个运行在宿主机( DOCKER-HOST)的后台进程。可通过 Docker客户端与之通信。


Client( Docker客户端)  

        Docker客户端是 Docker的用户界面,它可以接受用户命令和配置标识,并与 Docker daemon通信。图中, docker build

等都是 Docker的相关命令。

Images( Docker镜像)

        Docker镜像是一个只读模板,它包含创建 Docker容器的说明。它和系统安装光盘有点像 ,使用系统安装光盘可以安装系

统,同理,使用Docker镜像可以运行 Docker镜像中的程序。

Container(容器)

        容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系 。可通过 Docker API或者 CLI命令来

启停、移动、删除容器。

Registry

        Docker Registry是一个集中存储与分发镜像的服务。构建完 Docker镜像后,就可在当前宿主机上运行。但如果想要在其他

机器上运行这个镜像,就需要手动复制。此时可借助 Docker Registry来避免镜像的手动复制。

Docker虚拟化原理


        传统虚拟化和容器技术结构比较:传统虚拟化技术是在硬件层面实现虚拟化,增加了系统调用链路的环节,有性能损耗;容器虚拟化技术以共享宿主机Kernel的方式实现,几乎没有性能损耗。

        docker利用的是宿主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。避免了寻址、加载操作系统内核这些比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建

过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个过程,因此新建一个docker容器只需要几秒钟。

Docker是什么?_虚拟化_02

 联合文件系统

Docker是什么?_虚拟化_03


原理:overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息。在overlayfs中,底层的目录叫做lowerdir,顶层的目录称之为upperdir,对外提供统一的文件系统为merged。当需要修改一个文件时,使用COW(Copy-on-write)将文件从只读的Lower复制到可写的Upper进行修改,结果也保存在Upper层。在Docker中,底下的只读层就是image,可写层就是Container。

写时复制 (CoW) 技术详解

        所有驱动都用到的技术—写时复制,Cow全称copy-on-write,表示只是在需要写时才去复制,这个是针对已有文件的修改场 。比如基于一个image启动多个Container,如果每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁

盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才

从image里把要写的文件复制到自己的文件系统进行修改。所以无论有多少个容器共享一个image,所做的写操作都是对从

image中复制到自己的文件系统的副本上进行,并不会修改image的源文件,且多个容器操作同一个文件,会在每个容器的文件

系统里生成一个副本,每个容器修改的都是自己的副本,互相隔离,互不影响。使用CoW可以有效的提高磁盘的利用率。 所以容 器占用的空间是很少的。

用时分配 (allocate-on-demand)

        用时分配是针对原本没有这个文件的场景 ,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会因为这个容器分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间。


docker中的镜像分层技术的原理是什么呢?

        docker使用共享技术减少镜像存储空间,所有镜像层和容器层都保存在宿主机的文件系统/var/lib/docker/中,由存储驱动进行管理,尽管存储方式不尽相同,但在所有版本的Docker中都可以共享镜像层 。在下载镜像时,Docker Daemon会检查镜像中的镜像层与宿主机文件系统中的镜像层进行对比,如果存在则不下载,只下载不存在的镜像层,这样可以非常节约存储空间