概述
Docker镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含某个软件所需的所有内容,包括代码、库、环境变量、配置文件、运行时环境等。
所有的应用,直接打包成Docker镜像,然后通过镜像创建出容器,然后就可以直接跑起来。
如何得到镜像:
- 从远程仓库下载,比如docker hub、阿里云的镜像仓库等。
- 朋友拷贝给你。
- 自己制作一个镜像DockerFile。
- 通过对原有的镜像创建的容器进行一些修改(也可以不修改),然后通过Commit命令提交一个新的镜像。
Docker镜像加载原理
UnionFS(联合文件系统)
我们在下载某个镜像的时候,可能会看到下载了一层一层的多个镜像。

联合文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层叠加,联合文件系统是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像的镜像)比如centos镜像,可以制作出各种具体应用的镜像,比如mysql镜像。一个成型的应用进行都是由若干个镜像一层层组成的。
Docker镜像加载原理
docker镜像实际上是由一层层的文件系统组成,这种层级文件系统就是联合文件系统。
bootfs(boot file system)主要包含BootLoader和kernel,BootLoader主要负责引导加载kernel,Linux刚启动时会加载bootfs文件系统来引导内核的加载,Docker镜像的最底层就是bootfs。这一层与我们典型的unix系统是一样的,包含boot引导器和内核,当boot加载完成后整个内核就在内存中了,此时内存的使用权已经由bootfs转交给内核,此时系统会卸载bootfs。
rootfs(root file system)在bootfs之上,包含的就是典型的unix系统的/dev、 /proc、 /etc等标准目录和文件和一些命令,rootfs就是不同unix系统的发行版,比如Ubuntu、centos等。
我们平时安装的虚拟机centos镜像好几个G,Docker安装的才200多m,因为对于一个精简的OS,rootfs可以很小,只需包含最基本的命令,工具和程序库就行了,因为底层直接使用宿主机的内核,自己只需提供rootfs(相当于操作内核的客户端)就可以,由此可见不同发行版的bootfs基本是一致的,roorfs有差别,因此不同的发行版可以公有bootfs。

第一个图仅仅是bootfs+rootfs,然后如果要制作一个emacs环境的镜像,就在这个基础上新加一层emacs镜像,如图二。如果要在添加一个Apache环境,那就再图二基础上加一个apache镜像。如图三。图中的每一层镜像都能进行复用。
比如:上面的redis镜像。使用docker inspect redis镜像的ID 命令查看镜像的元信息,找到layer信息。

由上图可以看到下载的redis镜像是由6个镜像一层层组成的。

这些镜像都是一个个独立可复用的镜像,如果下载其他镜像是,某一层镜像是已经存在本地的了,就不用在下载,直接复用该镜像,节省空间。比如上面下载redis镜像时,提示某个镜像已经存在。

注意:
Docker镜像都是只读的,用镜像创建容器启动时,实际上是在原本的镜像上新建了一层可写层到原本镜像的顶部,这一层我们叫作容器层,容器层之下的叫作镜像层。

如上图,使用Tomcat镜像创建容器后,会在Tomcat镜像的基础上新建一个可写层,容器的写入是在可写层进行记录,然后使用commit命令把该容器创建一个新的镜像,实际上新的镜像是tomcat镜像+可写层镜像,以tomcat镜像为基础。通过下面介绍使用容器构建镜像,可以更好地理解。
commit镜像
命令:
docker commit -m="信息,类似git提交的信息" -a="作者" 容器Id 目标进行名:tag
以nginx镜像为例:
- 下载nginx镜像(最新版):
docker pull nginx

2. 使用该镜像创建并启动一个容器:
docker run -it 4bb46517cac3 /bin/bash

3. 修改该容器,比如添加一个文件

4. 退出该容器,可以停止退出,也可以不停止退出

5. 使用该容器提交一个镜像
docker commit -m="提交nginx容器,创建aaa.txt文件" -a="Yehaocong" 85fa4134c40a nginx1:1.0

打印的是新建的进行Id。
- 查看新建的镜像

这个就是新建的镜像,使用该镜像创建的容器,会有aaa.txt文件在里面。
此步骤结合上面的 Docker镜像是只读的那部分文件理解更佳。
2554

被折叠的 条评论
为什么被折叠?



