0%

Docker镜像原理

image-20220404192342184

镜像

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

每个文件叠加过后就是我们的应用,虽然是叠加而来,但是对外却是一个整体的系统文件

镜像加载原理

UFS文件系统

下载时看到一层层的就是这个。

联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。联合文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。

特性:一次性同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

Docker镜像加载原理

  • bootfs(boot file system) 主要包含bootloader和kernel, bootloader 主要是 引导加载 kernel,当我们加载镜像的时候,会通过bootloader加载kernal,Docker镜像最底层是bootfs,当boot加载完成后整个kernal内核都在内存中了,bootfs也就可以卸载,值得注意的是,bootfs是被所有镜像共用的,许多镜像images都是在base image(rootfs)基础上叠加的 .
  • rootfs (root file system),在bootfs之 上.包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu, Centos等等 。所以说每个 docker 就是一个小的虚拟机环境。

image-20220404192342184

Linux 不同发行版之间,bootfs 都是一样的,只有 rootfs 不一样 。 所以当 Docker 镜像加载时, bootfs 直接使用宿主机的内核,只需要提供 rootfs ,这部分十分精简,所以 centos 镜像可以很小(才不到300M),并且加载速度很快(虚拟机启动分钟级,容器启动秒级)。

分层理解

镜像分层

docker inspect 观察下载下来的镜像:

image-20220404194829940

这里的 Layers 就是每一层的文件,UFS叠加以后成为整个镜像。

特性

以 tomcat 镜像为例,它是一个有6个层级的镜像,pull到本地,再创建一个新的容器,此时整个 tomcat 会作为一整个镜像层,而你做的所有操作都会记录在容器层。如果想保存新的镜像,镜像层和容器层会再次打包,形成一个新的镜像。

image-20220404194637448

commit镜像

1
2
3
4
docker commit 提交热熔器成为一个新的副本

# 命令和git类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

测试

1
2
3
4
5
6
7
# 1.启动一个默认的tomcat

# 2.发现这个默认的tomcat 是没有webapps应用,这是镜像的原因,官方的镜像默认 webapps下面是没有文件的

# 3.自己拷贝了一些基本文件

# 4.将修改过的容器通过commit提交为一个镜像!我们以后就是用修改过的镜像就可以,这就是我们自己的一个修改过的镜像

image-20220405183351927

入门Docker!接下来,容器数据卷!DokcerFile!Docker网络!

参考

以上是看 b 站教学视频记的笔记。

教程地址:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili