docker原理
# Docker镜像分层
Docker使用分层的方式来组织镜像,实现文件的共享和重用。通过这种方式,可以减少存储空间的占用。
举例来说,假设我们有一个名为nginx
的镜像。它最底下的一层是一个封装好的Linux系统。在这个基础上,我们可以创建多个上层,每个上层可以包含不同的应用程序。这样,当有多个容器时,它们可以共享相同的底层Linux系统,大大减少了存储空间的占用。这种分层结构很巧妙地实现了环境与应用之间的隔离性。
# docker分层原理
具体的文件系统实现可能有多种方式,Docker默认使用的overlay driver。
在不更改其他文件的情况下,查看Docker容器中的内部文件,我们可以了解其分层结构:底层是lower层
,然后是merge层
,最上层是upper层
,还有worker层
。
- lower层主要用于存放最小的Linux系统,即
镜像层
。 - upper层用于存放容器内部的修改文件,例如diff文件夹,即
容器层
。 - merge层将upper层和lower层合并起来,用来映射这些文件,称作
映射层
,虚拟层
。
这种overlay存储方式依赖写时复制技术
来完成。当需要修改底层Linux系统中的文件时,不直接在那个文件上进行修改,而是在容器层添加一个文件,并优先调用这个容器层的文件,而非镜像层的文件。这种实现方法类似于JAVA中重写父类方法的原理。
因此,一个容器的运行是基于镜像层和容器层的关系。
# 更多内容
如果需要更多相关信息,可以访问Docker官网的存储部分(storage)查看详细内容。
Docker手册:https://docs.docker.com/storage/storagedriver/select-storage-driver/ (opens new window)
# Docker的三种挂载方式
卷挂载由Docker自动管理容器中的数据,绑定挂载将容器路径映射到宿主机上的路径
卷挂载(Volume Mounting):这是一种由Docker来自动管理容器中数据的挂载方式。卷是一个可被容器读写的特殊目录,它可以跨多个容器共享和重用。在卷挂载中,容器中的数据以镜像中的内容为基础。使用卷挂载时,Docker会自动处理数据的存储和管理。
绑定挂载(Bind Mounting):绑定挂载允许将容器中的路径直接映射到宿主机上的路径。在绑定挂载中,宿主机的内容优先于容器镜像中的内容。这种方式可能导致空挂载问题,因此在使用绑定挂载时需要确保绑定目录中的文件夹内容已经准备好再进行挂载。
内存挂载(Tmpfs Mounting):内存挂载是一种将容器中的路径挂载到内存上的方式。这意味着容器中的文件将完全存储在内存中,而不是写入到磁盘上。内存挂载通常用于需要在容器间快速共享数据或临时存储敏感数据的场景。
另外,关于集群方面,一般情况下不会使用Docker自带的集群功能,而是使用更为专业化的Kubernetes(简称K8s)进行容器的编排和管理。因此,关于Docker的集群内容可以不加深入地探讨。