赞
踩
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
所有的应用,直接打包docker镜像,就可以直接跑起来
如何得到镜像:
UnionFS(联合文件系统)
UnionFS (联合文件系统):Union文件系统(UnionFS )是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtualfilesystem)。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性︰一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
docker 镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roots (root file system),在boots之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu , Centos等等。
平时我们安装到虚拟机的CentOS都是好几个G ,为什么Docker这里才200多M?
[root@wulei /]# docker images centos
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 8652b9f0cb4c 2 months ago 204MB
对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只
需要提供rootfs就可以了。由此可见对于不同的linux发行版, bootfs基本是一致的, rootfs会有差别,因此不同的发行版可以公用bootfs。
分层的镜像
我们去下载一个镜像,注意观察下载的日志输出,可以看到它是一层层下载,并且第一个已经存在,不需要下载了
思考:为什么Docker镜像要采用这种分层的结构呢?
最大的好处,我觉得莫过于资源共享了! 比如有多个镜像都是从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份Base镜像即可,同时内存中也只需要加载一份Base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。
查看镜像分层的方式可以通过docker image inspect redis:6.0.10
命令!
[root@wulei ~]# docker image inspect redis:6.0.10 [ //... "RootFS": { "Type": "layers", "Layers": [ "sha256:cb42413394c4059335228c137fe884ff3ab8946a014014309676c25e3ac86864", "sha256:8e14cb7841faede6e42ab797f915c329c22f3b39026f8338c4c75de26e5d4e82", "sha256:1450b8f0019c829e638ab5c1f3c2674d117517669e41dd2d0409a668e0807e96", "sha256:f927192cc30cb53065dc266f78ff12dc06651d6eb84088e82be2d98ac47d42a0", "sha256:a24a292d018421783c491bc72f6601908cb844b17427bac92f0a22f5fd809665", "sha256:3480f9cdd491225670e9899786128ffe47054b0a5d54c48f6b10623d2f340632" ] } } ]
理解:
所有的Docker镜像都起使于一个基础的镜像,当进行修改或增加新的容器时,就会在当前的镜像层之上创建新的镜像层。
举一个简单的例子,假如基于Ubuntu Linux 16.04创建一个新的镜像,这就是新的镜像的第一层;如果在该镜像中添加Python包,就会在基础的镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。
该镜像当前已经包含 3 个镜像层,如下图所示
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要,下图举例了一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版本。
这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
Docker通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
Linux上可用的存储引擎有AUFS、Overlay2、Device Mapper、Btrfs以及ZFS。顾名思义,每种存储引擎都基于Linux中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
Docker在Windows上仅支持windowsfiter一种存储引擎,该引擎基于NTFS文件系统之上实现了分层和CoW[1]。
下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
特点
Docker镜像都只是可读的,当容器启动时,一个新的可写层被加载到镜像的顶部!
这一层就是我们通常所说的容器层,容器之下的都叫镜像层
如何提交自己的一个镜像?
docker commit 提交容器为一个新的副本
# 命令和git原理类似
docker commit -m="提交的信息" -a="作者" 容器ID 目标镜像名[:tag]
测试
# 启动一个默认的Tomcat 现在启动完毕访问不了,因为没有webapps [root@wulei wulei]# docker run -d -p 3366:8080 --name tomcat01 tomcat 05c036135c85d57526a1b637c25d2423d52b2fd4e366acbecdd734c8818cfd71 [root@wulei wulei]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05c036135c85 tomcat "catalina.sh run" 4 seconds ago Up 3 seconds 0.0.0.0:3366->8080/tcp tomcat01 # 进入Tomcat容器 [root@wulei wulei]# docker exec -it 05c036135c85 /bin/bash # 删除 webapps 空文件夹 root@05c036135c85:/usr/local/tomcat# rmdir webapps # 重命名webapps.dist 文件夹为 webapps root@05c036135c85:/usr/local/tomcat# mv webapps.dist webapps root@05c036135c85:/usr/local/tomcat# cd webapps/ root@05c036135c85:/usr/local/tomcat/webapps# ls ROOT docs examples host-manager manager # 以上的步骤做完之后,我以后不想这么麻烦,直接用改好的容器。 [root@wulei ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05c036135c85 tomcat "catalina.sh run" 15 hours ago Up 5 minutes 0.0.0.0:3366->8080/tcp tomcat01 # 将哦我们修改过的容器通过commit提交成一个新的镜像,我们以后就可以使用自己的镜像即可 [root@wulei ~]# docker commit -m="add webapps" -a="wl" 05c036135c85 mytomcat:1.0 sha256:6ad64d57c483c7a9f73e6c6cfa183aa70436a475ce119cc1270ebbc18df6d203 [root@wulei ~]# docker images mytomcat REPOSITORY TAG IMAGE ID CREATED SIZE mytomcat 1.0 6ad64d57c483 11 seconds ago 654MB # 现在只是把它提交到本地,后面会说到提交到仓库
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。