Docker镜像讲解分层
一)镜像是什么?
镜像是一种轻量级、可执行的独立软件包、用来打包软件运行环境和基于运行环境开发的软件,它包含了某个软件所需的所有内容、包括代码、运行时、库、环境变量和配置文件。
所有的应用、直接打包docker镜像、就可以直接运行使用。
如何得到一个镜像?1.从远程仓库下载、2.制作一个dockerfile、3.从别的地方复制得到。
二)UnionFs联合文件操作系统
UnionFS(联合文件系统)
UnionFS(联合文件系统);Union文件系统。UnionFS是一种分层、轻量级且高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加。同时可以拷不同目录挂载到同一个虚拟文件系统下。Union文件是Docker镜像的基础。镜像可以通过分层来继承、基于基础镜像(没有父镜像)、可以制作各种具体的应用镜像。
其特性为:一次同时加载多个文件系统、但从外面看来、只能看到一个文件系统、联合加载会把各层文件系统叠加起来、这样最终的文件系统就包含所有的底层和目录。
三)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等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么到Docker这里才209M?

对于个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, bootfs基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。
四)分层理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。
如下下载redis时、第一层直接复用。其他几层分层下载。

分层详细:docker image inspect redis:latest

举一个简单的例子,假如基于 Ubuntu16.04创建一个新的镜像,这就是新镜像的第一层。如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层。如果继续添加一个安全补丁,就会创健第三个镜像层该像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。

所有镜像层堆并合井,对外提供统一的视图。

Docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部。这一层就是我们通常说的容器层,容器之下的都叫镜像层。

五)Commit镜像
docker重命名镜像:docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)
提交一个自己的镜像
docker commit 提交容器成为一个新的副本
命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
测试
1、启动一个默认的tomcat
docker run -d -p 8080:8080 tomcat
2、发现这个默认的tomcat是没有webapps应用,官方的镜像默认webapps下面是没有文件的
docker exec -it 容器id
3、拷贝文件进去
4、将操作过的容器通过commit提交为一个镜像。我们以后就使用我们修改过的镜像即可,这就是我们自己的一个修改的镜像。
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -a="jess" -m="add webapps app" 容器id tomcat02:1.0
eg:
[root@xiaozhang1999 ~]# docker run -d -p 9999:9999 tomcat
64357165e00e24d5ca3461677ca9bedc92f5faaeffda14605751190f09738d13
[root@xiaozhang1999 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
64357165e00e tomcat "catalina.sh run" 9 seconds ago Up 8 seconds 8080/tcp, 0.0.0.0:9999->9999/tcp, :::9999->9999/tcp zealous_almeida
[root@xiaozhang1999 ~]# docker exec -it 64357165e00e /bin/bash
root@64357165e00e:/usr/local/tomcat# cd webapps
pull过来的tomcat默认没有wabapps应用
root@64357165e00e:/usr/local/tomcat/webapps# ls
root@64357165e00e:/usr/local/tomcat/webapps# cd ..
递归复制
root@64357165e00e:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@64357165e00e:/usr/local/tomcat# cd webapps
root@64357165e00e:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
将我们操作过的容器通过commit提交作为一个镜像、以后就使用自己修改的镜像即可
[root@xiaozhang1999 ~]# docker commit -m="ztsqtomcat" -a="add webapps" 64357165e00e tomcattunc
sha256:276239fa14a32b471db8891d71f196894499932f800051bad730bed12c1a22ae
TAG版本一样时
[root@xiaozhang1999 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcattunc latest 276239fa14a3 9 seconds ago 672MB
tomcat 9.0 5505f7218e4d 6 days ago 667MB
tomcat latest 5505f7218e4d 6 days ago 667MB
redis latest fad0ee7e917a 3 weeks ago 105MB
mysql 5.7 2c9028880e58 6 weeks ago 447MB
mysql latest c0cdc95609f1 6 weeks ago 556MB
portainer/portainer latest 580c0e4e98b0 3 months ago 79.1MB
hello-world latest d1165f221234 3 months ago 13.3kB
centos latest 300e315adb2f 6 months ago 209MB
同REPOSITORY、tag时改tag需要两个都指明
[root@xiaozhang1999 ~]# docker tag 5505f7218e4d tomcat:ssss
[root@xiaozhang1999 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcattunc latest 276239fa14a3 About an hour ago 672MB
tomcat 9.0 5505f7218e4d 6 days ago 667MB
tomcat latest 5505f7218e4d 6 days ago 667MB
tomcat ssss 5505f7218e4d 6 days ago 667MB

浙公网安备 33010602011771号