Docker---联合文件系统和commit补充操作
联合文件系统
探究联合文件系统
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容器网络
- docker探索-CentOS7中配置Docker的yum源并升级安装docker1.13(十)
- 【Docker异常】docker-compose up throw UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 97: ordinal not in range(128)
- centos ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
- 【1】ubuntu 安装docker
- 运维基础之Docker(2)通过docker部署zookeeper nginx tomcat java redis kibana/elasticsearch/logstash mysql kafka mesos/marathon ftp git
- Docker docker部署以及运行你的第一个容器
- [ELK] Docker 运行 Elastic Stack 支持 TLS 的两种简单方式
- Docker 入门 到部署Web 程序- (阿里面试常用的docker命令和优点)
- 一步步在Docker里运行Web应用
- docker从零开始网络(六)Macvlan
- 018-docker-docker-compose定义和运行多容器 Docker 应用程序的工具
- 78.第十七章 企业级容器技术docker -- Docker 镜像制作和管理(六)
- 【云原生之Docker实战】使用docker部署PicUploader图床工具
- Docker技术----docker-compose实战----快速搭建WordPress博客系统
- 使用docker-compose 快速搭建Percona XtraDB Cluster(pxc集群)
- 【Docker】之docker-compose的介绍与命令的使用
- 【最全最详细Docker】用docker部署mysql、tomcat、nginx、redis 环境部署
- 【服务器安装系列】CentOS7 安装及配置 Docker
- a15.ansible 生产实战案例 -- docker基于二进制安装harbor roles