文章目录

  • 一、镜像是什么
  • 1、unionFs 联合文件系统
  • 2、Docker镜像加载原理
  • 3、分层的镜像
  • 4、为啥使用分层的镜像
  • 5、docker镜像的特点
  • 二、docker镜像的commit操作
  • 1、操作解释
  • 2、案例演示
  • 1、pull tomcat镜像并运行
  • 2、做一些修改,该为我们的镜像
  • 3、提交我们正在运行容器为一个镜像
  • 4、测试


一、镜像是什么

1、unionFs 联合文件系统

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

就像一层层的花卷,里面包含其他的基础镜像,镜像是一层层的创建,对外暴露一个镜像。

docker文件丢失 docker的文件系统_文件系统

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

2、Docker镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

docker文件丢失 docker的文件系统_加载_02

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就行了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别, 因此不同的发行版可以公用bootfs。

这就解释了为哈我们centos镜像才200多兆,而我们虚拟机centos镜像需要4个多G
因为我们docker的centos镜像,只是一个轻量级的内核,值包含里面基本的指令
,不含其他的安装包,比如vim,config,curl。。。。。等等。

3、分层的镜像

我们在联合文件系统中分析过,我们的镜像就像是一个花卷,是一层层的,一层代表一个新的镜像,每个镜像都是由其他镜像组成的,而且当我们下载我们的镜像时我们可以看到我们的镜像都是一层层的下载。

docker文件丢失 docker的文件系统_docker_03


再比如我们的tomcat镜像

docker文件丢失 docker的文件系统_docker_04

4、为啥使用分层的镜像

最大的一个好处就是 - 共享资源,资源共享

比如:有多个镜像都从相同的 base 镜像构建而来,那么宿主机只需在磁盘上保存一份base镜像,
同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

5、docker镜像的特点

Docker镜像都是只读的,只读不写
只有当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xh62NUpw-1628555836540)(C:\Users\86175\AppData\Roaming\Typora\typora-user-images\image-20210808205454106.png)]

二、docker镜像的commit操作

1、操作解释

是在一个正在运行的镜像实例容器在运行时,我们对这个容器进行一些操作,修改一个内容,制作一个新的镜像,提交

docker commit提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

2、案例演示

1、pull tomcat镜像并运行

  1. docker pull tomcat
  2. docker run -it -p 8080:8080 tomact

2、做一些修改,该为我们的镜像

故意删除上一步镜像生产tomcat容器的文档
即让我们当前运行的容器为一个没有文档的容器,我们更具这个容器提交一个新的镜像

3、提交我们正在运行容器为一个镜像

docker ps 查看我们运行容器的id

CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
c4b416049339   tomcat    "catalina.sh run"   24 seconds ago   Up 23 seconds   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   optimistic_pascal

提交 docker commit -a=“作者” -m=“描述” [提交容器id] [提交镜像名字]:tag

docker文件丢失 docker的文件系统_加载_05

4、测试

启动我们镜像,刷新浏览器缓存,访问文档
docker run -p 8080:8080 -d nodocxtomcat