参考链接:
https://www.zhihu.com/question/331023021
https://www.zhihu.com/question/48174633/answer/616413576
别人说的话我就不复制粘贴了,挑一些我个人认为比较有意思的点和比较基础的点说一下。
docker的一些概念
image
image是一堆只读层的统一视角,UFS技术可以把这一对只读层整合成一个文件系统
container
容器就是在image上面加了一个可读可写层。
container=image+ R&W Layer
docker start=docker create & docker run
Repository
Repository意思为仓库,类似github上面有很多代码可以clone到本地,在docker中就相当于可以pull镜像到本地。官方的仓库是docker hub
Registry
Registry是私有仓库,Registry包含了一个或多个Repository,每个Repository可以有多个Tag,每个Tag对应一个image。
我理解的docker是”轻量级”虚拟机。这个概念应该不是正确的,因为虚拟机和docker的区别还是挺大的,再多抽象几层我感觉这么理解也可以
docker的方便之处在于不需要像虚拟机一样重新虚拟出来硬件和操作系统,docker只需要pull镜像直接用就行。
docker可以快速部署的另一个原因除了是分层可复用之外,就是可以”一键”安装所需依赖。我理解的是类似makefile。
dockerfile类似makefile,但是一个dockerfile对应一个容器或者说对应着一个服务(如MySQL)然后docker-compose.yml 包含一个个dockerfile文件形成了一个工程。
docker 进程会对每个容器的资源进行管理。
docker的镜像分层我认为是比较有意思的,有点类似面向对象编程思想的”继承”。
docker的基础镜像应该是最大的,但是从基础镜像新建一个镜像的话,并不需要复制所有内容,即不需要占用两倍的存储空间,只需要把不一样的保存下来就好。
这得益于Linux的COW策略。即:没写过文件的不用动,写过的文件保存成新的文件。
docker会在容器最上层创建一个读写层,用来保存对基础镜像的修改操作操作的文件。
docker与虚拟机的区别
首先是虚拟化层次不一样。虚拟机完整地虚拟了内核和用户空间,而docker仅仅是虚拟了用户空间,内核用的是操作系统的内核。每个容器只是说相互之间的应用、依赖不同,但其最底层的镜像应该是相同的。他们用共同一个基础镜像,对基础镜像有修改,这个修改保存到各个容器内部,docker进程对容器之间进行隔离。
docker启动速度快,占用资源少;而虚拟机启动速度慢,消耗资源多。
这里引用两句话,感觉说的非常好:
“其实最大的区别在于应用场景的不同:虚拟机最开始出现是为了模拟不同的硬件平台,但是现在云计算时代是为了提供的计算能力的虚拟化,这样可以快速灵活的划分和分配计算资源。容器则是随着应用程序的架构发展所自然衍生出来的东西。当软件越来越复杂,单体应用没法再发展下去了,每个功能逐渐独立出来,出现面向服务的架构,进而出现所谓微服务的架构。“