当前位置:   article > 正文

Docker镜像讲解_运行的容器 应用程序文件在镜像中还是roots中

运行的容器 应用程序文件在镜像中还是roots中

Docker镜像讲解

镜像是什么?

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

所有的应用,直接打包docker镜像,就可以直接跑起来

如何得到镜像:

  • 从远程仓库下载
  • 朋友拷贝给你
  • 自己制作一个镜像 DockerFile

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
  • 1
  • 2
  • 3

对于一个精简的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"
            ]
        }
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

理解:

所有的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镜像都只是可读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常所说的容器层,容器之下的都叫镜像层

在这里插入图片描述

如何提交自己的一个镜像?

commit镜像

docker commit 提交容器为一个新的副本

# 命令和git原理类似
docker commit -m="提交的信息" -a="作者" 容器ID 目标镜像名[:tag]
  • 1
  • 2
  • 3
  • 4

测试

# 启动一个默认的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
# 现在只是把它提交到本地,后面会说到提交到仓库
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/73891
推荐阅读
相关标签
  

闽ICP备14008679号