1.Docker镜像加载原理
2.分层理解
3.commit镜像
镜像是一个轻量级、可执行的独立软件包,用于包装软件运行环境和基于运行环境开发的软件,包括代码、运行时间库、环境变量和配置文件。
直接将所有应用和环境打包成docker可直接操作镜像。
1.Docker镜像加载原理
联合文件系统(UnionFS)它是一个分层、轻量级、高性能的文件系统。它支持文件系统的修改作为提交层层叠加,可以将不同的目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。
联合文件系统是 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等等
对个精简OS,rootfs它可以很小,只需要包含最基本的命令、工具和程序库,因为底层直接使用Host的kernel,你只需要提供rootfs可以。由此可见,不同的Linux发行版, bootfs基本一致, rootfs会有差异,所以不同的发行版享bootfs。
虚拟机启动分钟级,容器秒级!
2.分层理解
我们可以下载一个镜像,注意下载的日志输出,可以看到一层一层地下载
[root@fedora ~]# docker pull redis Using default tag: latest latest: Pulling from library/redis a2abf6c4d29d: Already exists c7a4e4382001: Pull complete 4044b9ba67c9: Pull complete c8388a79482f: Pull complete 413c8bb60be2: Pull complete 1abfd3011519: Pull complete Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339 Status: Downloaded newer image for redis:latest docker.io/library/redis:latest
思考:为什么?Docker这种分层结构应该用于镜像?
我认为最大的好处是资源共享!例如,许多镜像来自同一个镜像Base镜像是建造的,所以宿主机 只需在磁盘上保留一份base镜像只需要在内存中加载一个base镜像可以用于所有容器 服务,镜像的每一层都可以共享。
通过检查镜像分层,可以查看镜像分层docker image inspect 命令
docker image inspect redis
[root@fedora ~]# docker image inspect redis [ { "Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631", "RepoTags": [ "redis:latest" ], ... ... "RootFS": { "Type": "layers", "Layers": [ "sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f", "sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb", "sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1", "sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372", "sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed", "sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952" ] }, "Metadata": { "LastTagTime": "0001-01-01T00:00:00Z" } } ]
所有的Docker镜像始于基本的镜像层。当修改或添加新内容时,将在当前镜像层上创建新的镜像层。
以一个简单的例子为基础Ubuntu Linux 16.04
创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加Python第二个镜像层将在基本镜像层上创建;如果继续添加安全补丁,将创建第三个镜像层。
目前,该镜像已包含三个镜像层,如下图所示(这只是一个非常简单的演示例子)。
在添加额外的镜像层的同时,镜像始终是所有镜像的组合,理解这一点非常重要。下图中有一个简单的例子,每个镜像层包含三个文件,而整个镜像包含两个镜像层的六个文件。
上图中的镜像层与上图中的镜像层略有不同,主要目的是便于显示文件。
下图显示了一个稍微复杂的三层镜像,外部只有6个文件,因为上层的文件7是文件5的更新版本。
在这种情况下,上镜像层中的文件覆盖了底镜像层中的文件。这使得文件的更新版本作为一个新的镜像层添加到镜像中。
Docker镜像层堆栈通过存储引擎(新版本采用快照机制)实现,多镜像层显示为统一的文件系统。
Linux可用的存储引擎有AUFS
,Overlay2
,Device Mapper
,Btrfs
以及ZFS
。顾名思义,每个存储引擎都是基于Linux对应的文件系统或块设备技术,每个存储引擎都有其独特的性能特性。
Docker在Windows上仅支持windowsfilter
基于存储引擎的存储引擎NTFS
在文件系统上实现了分层和Cow
。
如上边的三层镜像,Docker所有的镜像层最终都会堆叠合并,提供统一的视图,如下图所示。
Docker镜像只读。当容器启动时,将一个新的可写层加载到镜像的顶部,只能写在这个顶部。
而这一层就是我们通常所说的容器层,容器下的都叫镜像层。
如下图:
下面这张图更加形象:
3.commit镜像
docker commit # 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -a="作者" -m="提交的描述信息" 容器ID 目标镜像名:[Tag]
# 测试
# 1.启动一个默认的tomcat
# 2.发现这个tomcat没有webapps应用,(镜像的原因)官方的镜像默认webapps下是没有文件的
# 3.将基本文件拷贝进去
# 4.将我们操作过的的容器通过commit提交为一个镜像!
# 以后使用修改过的镜像即可,这就是一个我们自己修改过的镜像
[root@fedora ~]# docker run -it -p 8080:8080 tomcat /bin/bash
root@7389f7990e71:/usr/local/tomcat# ls
BUILDING.txt README.md conf temp
CONTRIBUTING.md RELEASE-NOTES lib webapps
LICENSE RUNNING.txt logs webapps.dist
NOTICE bin native-jni-lib work
root@7389f7990e71:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@7389f7990e71:/usr/local/tomcat# ls webapps/
ROOT docs examples host-manager manager
# CTRL + P + Q 退出容器
[root@fedora ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7389f7990e71 tomcat "/bin/bash" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp musing_davinci
[root@fedora ~]# docker commit -a="charlie" -m="add webapps app" 7389f7990e71 tomcat:1.0
sha256:90f6753a853b6f7a4188762aace702b5e131c94ba0b853121b1f5ec1ca8a6a47
[root@fedora ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat 1.0 90f6753a853b 14 seconds ago 684MB
tomcat latest fb5657adc892 6 months ago 680MB
Docker 入门成功 !!