Docker---联合文件系统和commit补充操作

x33g5p2x  于2021-10-07 转载在 Docker  
字(2.4k)|赞(0)|评价(0)|浏览(331)

探究联合文件系统

1 Docker镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境的开发软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2 UnionFS(联合文件系统)

Union文件系统(UnionFS) 是一种分层、轻量级并且高性能的文件系统他支持对文件系统的修改作为一次提交来层层的叠加同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行集成,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层文件和目录。

3 Docker 镜像加载原理

docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是联合文件系统(UnionFS)。

bootfs(boot file system—>boot文件系统) 主要包含bootloader(boot加载器)和kernel(内核),其中boot加载器主要是用来引导加载内核。Linux刚启动时会加载bootfs(boot文件系统),在Docker镜像的最底层是bootfs(boot文件系统)。这一层与典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs(boot文件系统)转交给内核,此时系统就会卸载bootfs(boot文件系统)。

roorfs (root file system—>root文件系统),在bootfs(boot文件系统)之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etc 等标准的目录和文件。rootfs(root文件系统)就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

对于一个精简的OS(操作系统),rootfs(root文件系统)可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel(内核),自己只需要提供rootfs(root文件系统)就行了,由此可见对于不同的Linux发行版,bootfs(boot文件系统)基本是一致的,rootfs(root文件系统)会有差别,因此不同的发行版(如Ubuntu,Centos等)可以公用bootfs(boot文件系统)。

4 Docker 镜像联合文件系统分层,Tomcat镜像示例

采用这种分层结构最大的一个好处就是共享资源,比如有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。 比如,多个java程序镜像都可以共享同一个jdk镜像(base镜像),而不用每个java程序镜像都自己包含一个jdk镜像,这样虽然jdk镜像有百兆左右,比较大,但是可以共享,因此不会占用很大空间。

5 镜像和容器的关系

Docker的镜像都是只读的,当容器启动时,一个新的可写层被加载到这个镜像的顶部。这一层我们通常称之为“容器层”,容器层之下的层叫“镜像层”。

图中的顶上两层,是Docker为容器新建的内容,而这两层属于容器范畴。 这两层分别为Docker容器的初始层(Init Layer)与可读写层(Read-Write Layer)。

(1) 初始层:大多是初始化容器环境时,与容器相关的环境信息,如容器主机名,主机(host)信息以及域名服务文件等。

(2) 读写层:Docker容器内的进程只对可读写层拥有写权限,其他层对进程而言都是只读的(Read-Only)。 另外,关于VOLUME以及容器的hosts、hostname、resolv.conf文件等都会挂载到这里。

6 总结

为了节省空间和性能消耗,在docker中进行操作时,一般是首先下载一个最基本的基础镜像,然后我们以这个镜像为基础建立容器,这时就是在基础镜像层上面添加了容器层,此时镜像层+容器层成为了我们要使用的一个新的应用。如果有需要,我们可以将刚刚配置好的镜像层+容器层再打包融合为一个新的镜像(一个新的层级),进而在之后有需要时再在这个新的镜像上面进行操作。
一般,最基本的镜像层是无法被修改的,这一般是远程pull下来的。

镜像层与容器层的关系图如下图所示:
镜像层是无法被修改的,这一般是远程pull下来的。
镜像层与容器层的关系图如下图所示:

Docker镜像commit操作补充

  • docker commit 提交容器副本使其成为一个新的镜像
  • docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

实例演示

首先docker pull tomcat 通过阿里巴巴镜像加速器,从仓库中拉取最新的tomcat镜像

创建新的tomcat容器并运行: docker run -it -p 8080:8080 tomcat

  • -p 主机端口:docker容器端口
  • -P 随机分配端口
  • -i 交互
  • -t 终端

由tomcat镜像生成的容器实例已经运行了,现在访问验证一下:

端口映射

端口随机分配

commit操作演示

首先创建并运行一个tomcat容器,然后删除当前tomcat容器内部的docs,即文档

删除webapps下面的docs,即文档目录

此时访问tomcat的文档也,显示404,表示删除成功

将当前删除文档的tomcat,提交成为一个新的镜像

以我们刚才提交的镜像为模板,创建并运行一个tomcat实例:

文档页面访问404,成功

Docker方式启动tomcat,访问首页出现404错误的解决办法

Docker方式启动tomcat,访问首页出现404错误

相关文章