联合文件系统
- 探究联合文件系统
-
- 1 Docker镜像是什么
- 2 UnionFS(联合文件系统)
- 3 Docker 镜像加载原理
- 4 Docker 镜像联合文件系统分层,Tomcat镜像示例
- 5 镜像和容器的关系
- 6 总结
- Docker镜像commit操作补充
-
- 实例演示
-
- 端口映射
- 端口随机分配
- commit操作演示
- Docker方式启动tomcat,访问首页出现404错误的解决办法
探究联合文件系统
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错误