镜像是什么

[post cid=“730” /]
√> 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,包含运行某个软件需要的所有内容,包括代码、库、环境变量和配置文件。

如何得到镜像

  • 朋友拷贝
  • 镜像仓库下载
  • 自己制作DockerFile

文件系统与分层原理

关于Docker,最重要的就是他的文件系统和分层原理

UnionFS(联合文件系统)

这是一种分层、轻量且高性能文件系统,支持对文件系统修改作为一次提交来层层叠加,同时将不同目录挂在到同一个虚拟文件系统下,Union文件系统是Docker 镜像基础。镜像可以通过分层来继承,基于基础镜像,可以制作各种具体镜像。

下面将从镜像加载步骤一步步解释这个概念

Docker镜像加载原理

镜像 - 实际由一层层的文件系统组成
UnionFS

  • bootfs(boot file system) :主要包括bootloader和kernel,bootloader主要引导加载kernel,linux刚启动会加载bootfs文件系统,最底层是bootfs。这一层和我们典型的Linux/Unix系统一样,包含boot加载器和内核,boot加载完成整个内核就在内存中,此时内存使用权由bootfs交给内核。
  • rootfs(root file system):在bootfs之上,包含的就是典型Linux系统中的/dev/proc/bin/etc 等标准目录和文件,rootfs就是各种不同的操作系统发行版。

x> 为什么虚拟机centos体量都几个G,而docker镜像只有200-300M

docker load镜像没反应 docker镜像加载原理_linux

!> 因为这是一个精简的OS,rootfs可以很小,只需要提供基本的命令、工具和程序库,底层直接使用Host的kernel,只要提供rootfs,对不同的linux发行,bootfs基本一致,rootfs有差别,共用bootfs。

镜像分层原理

!> 为什么使用分层原理?

最大的好处莫过于实现了资源的共享,有很多相同镜像基于不同的Base镜像构建而来,那么宿主机只用保存一份Base镜像,只需要把一个Base镜像加载到内存。就可以为所有镜像服务。

你可以查看你镜像的分层

docker inspect [镜像id] # 查看分层

下面是我查看tomcat的分层,Type:layers

docker load镜像没反应 docker镜像加载原理_docker_02

理解:
所有的Docker镜像起始于一个基础镜像层,进行修改和增加新的镜像层的时候,就会在当前镜像层上面添加一个新的镜像层。
下图就展示了一个3层镜像。

理解:

所有的Docker镜像起始于一个基础镜像层,进行修改和增加新的镜像层的时候,就会在当前镜像层上面添加一个新的镜像层。

下图就展示了一个3层镜像。

docker load镜像没反应 docker镜像加载原理_docker load镜像没反应_03


下面是2个镜像层,6个文件,每个镜像层有3个文件

docker load镜像没反应 docker镜像加载原理_docker_04


当我们想修改其中一个文件时:

docker load镜像没反应 docker镜像加载原理_docker load镜像没反应_05


上层文件系统中的文件覆盖了下层的文件,使得文件的更新版本,作为一个新镜像层添加到镜像中。

特点:

Docker镜像都是只读的,容器启动的时候,一个新的可写层被加载到镜像顶部

这层被称为容器层,容器层之下的都叫镜像层。

docker load镜像没反应 docker镜像加载原理_linux_06

Commit指令

如果我想对一个镜像进行修改,但拉取下来的镜像都是只读的,所以我们的操作就是创建一个容器,此时镜像上面新创建了一个容器层,此时我们将这个容器层和镜像打包生成一个全新镜像。

下面示例为tomcat修改后创建一个新的镜像

  • Docker commit 提交一个新的镜像
docker commit -m=“new tomcat app” -a=”lzl” [id] tomcat:02
[post cid=“744” /]