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
posted @ 2021-07-07 11:02  LanceYa  阅读(340)  评论(0)    收藏  举报