最近在研究Docker,总结了一些自己的理解,希望可以与大家分享。有错误的地方,也请大家不吝赐教,共同讨论。
1. docker是什么?
docker是一种轻量的、一次封装即可随处运行的虚拟化技术。
2. docker和 VM等虚拟机的区别是什么?
(1)虚拟化方式:
VM等传统的虚拟机技术,是基于硬件的虚拟化技术。将一个完整的物理机,分成多个子物理机,相互之间完全隔绝。
docker不会对底层硬件进行虚拟化,它的虚拟化是操作系统层级的。多个容器分享一个操作系统内核,不同的docker实例(也就是容器)内部有自己的应用依赖环境。
从外部看来,传统的虚拟化技术(比如VM)每个虚拟机内部的情况是不可见的。而docker则不然,由于是系统层级的虚拟化,所以每个容器在系统看来,都是一个线程(比如下图,一共启动了3个容器,就会出现三个container的线程)
同时,由于docker的虚拟化并不能实现真正的隔绝,所以docker容器中的应用,也同样会暴露在外部的操作系统上(如下图)
(2)操作系统体量:
系统上正常运行程序,离不开操作系统。一个完整的操作系统,包含两部分:内核+文件系统。
对于传统的虚拟机,需要完整的安装内核与文件系统,因此所占空间非常大,比如Ubuntu就需要20G+。
而就docker而言,虚拟化建立于操作系统以上,且不同版本的Linux内核都是基本相同的,因此不需要安装操作系统内核,只需要在引入相应操作系统的镜像即可,镜像中就包含了对应的文件系统。因此docker镜像的提及非常小,同样是Ubuntu,docker镜像,只有80M+。
(3)启动速度:
虚拟机在启动时,需要虚拟化硬件资源,启动完整的操作系统,因此耗时多
docker在启动时,由docker引擎直接在宿主机操作系统上调用硬件资源,以生成应用的方式生成容器,耗时很短
3. 为什么要使用docker?
开发角度:
(1)快速搭建:快速搭建开发环境
(2)提高开发效率:使最终的生产环境与开发环境尽可能的一致,避免因为环境问题导致上线错误
(3)提高利用率:避免使用虚拟机隔绝后造成的资源浪费,同时只使用同一个操作系统,减少了操作系统对内存的占用。
(4)避免冲突:多租户环境,不会造成冲突。
(5)统一管理:在docker仓库中,统一代码的管理
运维角度:
(1)快速部署:测试结果正常的程序,打包成镜像后,可以直接在生产环境上展开。
(2)高效迁移:减少了对于环境的依赖,可以实现一次部署,到处使用。
测试角度:
(1)提高测试准确率:避免因为环境区别导致测试结果误差。
(2)避免打包遗漏:测试成功直接将环境打包为镜像,还原时避免遗漏程序组件。
4. docker的优缺点有哪些?
优点:
(1)轻量:docker镜像体积小
(2)[endif]快速:可以快速生成容器
(3)[endif]一致性:开发->测试-运维上线系统环境完全一致
(4)统一管理:镜像统一上传至镜像库,方便追溯回滚
(5)低环境依赖:由于每个容器内部都有自己的文件系统,可以独立安装依赖环境。因此,对外部操作系统的依赖极低
(6)资源利用率高:避免虚拟机内各自系统对硬件资源的浪费
缺点:
(1)架构要求:必须是64位
(2)系统要求:内核3.8.0以上
(3)隔绝不彻底:由于是系统层级的虚拟化,内存溢出、高CPU占用可能会多docker稳定性造成影响