Docker基本概念和面试常见问题

Docker基本概念

由于不同机器不同的操作系统上,不同的库和不同的组件,如果要将一个应用部署到多台机器上就需要有大量的环境配置的操作。而且配环境是非常麻烦的事情,不同的系统下库版本可能不同或者有的机器是物理断网的很多环境配置上就很麻烦。

Docker主要解决了环境配置的问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主的操作系统和其他隔离进程。

Docker和虚拟机的比较

虚拟机也是一种虚拟化的技术,和docker最大的区别时,它通过模拟硬件,并在硬件上安装操作系统来实现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GjvhR2fT-1585938868332)(en-resource://database/902:0)]
从结构上看,左边需要GuestOS层,左边的Hypervisor层被右边的Docker Engine层代替了。
我们需要知道的是GuestOS层是虚拟机安装的操作系统,是一个完整的内核,Hypervisor是硬件虚拟化平台。

虚拟机实现资源隔离的方式是利用独立的GuestOS,以及利用Hypervisor虚拟化CPU、内存、IO设备等来实现的,因此Docker明显来的更加轻量。

Docker利用的是当前的namespace来实现不同容器之间的隔离,利用了cgroup实现了对资源的隔离,利用了镜像实例实现了和环境的隔离。

消耗的资源上来分析,docker除了运行的进程需要消耗资源外,系统的开销非常小。而传统的虚拟机就消耗就非常大,需要有多个操作系统。

传统虚拟机的实现是在硬件层面上进行虚拟化,因此需要在虚拟化的硬件上在安装操作系统,需要内核应用程序、库文件;
Docker是在操作系统层面上的虚拟化,如果是在linux上就可以直接用linux的内核,每个container就使用虚拟化出来的迷你linux操作系统,就不需要从操作系统开始安装。

优缺点,从启动速度、占用资源、迁移维护扩展效率上来谈。

Docker在windows上使用

docker在windows上使用的时候实际上是内置了一个迷你的linux系统,因此虚拟化的时候就是根据迷你系统虚拟化出来。

Docker的分层原理

Docker的层次结构是建立在images的内容是静态的基础上的,当把images设为静态之后之前的东西就都是不可改的了,要改就只能创建一个新的容器,在容器的基础上来修改; 创建容器的过程就相当于在原有静态内容上多加了一个层,把容器中的操作记录在这一层里。

为什么采用分层结构呢?
其实和动态链接库的概念有点像,就是想要达到镜像复用的目的。 对于某个基础镜像我们可以在其基础上不断更新不同的分支,但是内存里基础镜像只需要保存一个即可,其他的衍生镜像的底层都是基础镜像分出来的。

如果修改了系统配置信息,那么基础镜像会发生改变吗?
不会的,所有的操作都只会保留在新的容器层上,等运行镜像的时候会从基础镜像层一层一层往外走,所以容器层的操作最后能够顺利进行(如修改系统配置信息)。

修改文件的过程

添加文件:在容器中创建文件时,新文件被添加到容器层中。
读取文件:在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后打开并读入内存。
修改文件:在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件:在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章