当前位置:   article > 正文

02.一切从Image开始_容器镜像是容器的模板,容器是镜像的运行实例

容器镜像是容器的模板,容器是镜像的运行实例

1.容器镜像

容器镜像是容器的模板,容器是镜像的运行实例, runtime根据容器镜像创建容器;容器镜像挂载在容器根目录下,是为容器中的应用提供隔离后执行环境的文件系统。

  • base镜像

我们希望能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件,这样的镜像我们称作base镜像;能称作base镜像的通常都是各种Linux发行版的Docker镜像,比如 Ubuntu、Debian、CentOS等,其他镜像可以以之为基础进行扩展。Linux内核空间和用户空间

注:base镜像从scratch构建,不依赖于其他镜像;scratch是Docker官方提供的一个空镜像。
①、实现机制:
Ⅰ. Linux操作系统由内核空间和用户空间组成,其中内核空间是kernel, Linux在刚启动时会加载bootfs文件系统,启动完成之后bootfs会被卸载掉;用户空间的文件系统是rootfs, 包含/dev、/proc等目录。不同Linux发行版的区别主要就是rootfs,所以可以在同一台host上部署不同Linux发行版的base镜像。
Ⅱ. 对于base镜像来说,底层直接用Host的kernel, 自己只需要提供rootfs就行了(即打包应用及其运行所需要的所有依赖包),所以相对于虚拟机来说更加轻便。
注:base镜像在用户空间与发行版一致,但是内核的版本和Docker host主机的kernel版本一致;容器只能使用host的kernel,但是不能修改。

  • 镜像分层结构

Docker支持通过扩展现有镜像来创建新的镜像,也就是说所有镜像层联合在一起,即为一个联合文件系统,这类文件系统会把多个目录(可能对应不同的文件系统)挂载到同一个目录,对外呈现这些目录的联合,也就是说用户在容器层中只能看到最上层的文件,最终呈现出一个分层的结构;
注:联合文件系统UnionFS将所有的镜像层联合挂载到一个统一的挂载点(镜像层文件系统中不同的目录进行“合并”),最终表现为一个Linux操作系统供容器使用。
可以最大化实现资源共享:当多个镜像都是从同一个base镜像构建而来,内存中只需加载一份base 镜像,就可以为所有容器服务;通过写前拷贝COW技术来实现资源共享。
原理简单阐述就好比:当父进程 fork 子进程时,内核并没有为子进程分配内存(当然基本的进程控制块、堆栈还是需要的),而是让父子进程共享内存;当两者之一修改共享内存时,会触发一次缺页异常导致真正的内存分配(此时才会为父子进程分配独享内存)。联合文件系统架构

1、联合文件系统实现机制:
①、首先需要内核支持OverlayFS特性;

$ cat /proc/filesystems | grep overlay nodev overlay
  • 1

②、创建分层的工作目录(相当于除了容器层以外的其他层);

$ mkdir base 
$ echo "layer 1" > base/metadata 
$ echo "hello,docker!" > base/data 
$ mkdir overlay 
$ echo "layer 2" > overlay/metadata 
$ echo "hello,k8s!" > overlay/data2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

③、创建顶层目录(相当于容器层),以及OverlayFS所必需的work工作目录、文件系统挂点;

$ mkdir top work point
  • 1

④、将分层以overlay文件系统类型挂载到挂载点;

$ mount -t overlay overlay \ -o lowerdir=overlay:base,upperdir=top,workdir=work point 
#-t:指定文件系统类型 
#-o:指定挂载选项,lowerdir指定底层目录(从高层向低层指定),upperdir指定顶层目录 (也就是容器层),workdir指定工作目录 
#最后指定挂载点
  • 1
  • 2
  • 3
  • 4

⑤、在挂载点目录下可以看到联合目录,目录所处的层级是很重要的,上层的文件会覆盖同名的下层文件;

#可以看到挂载点处显示出的联合目录 
$ ll */* 
-rw-r--r-- 1 root root 14 ... base/data 
-rw-r--r-- 1 root root 10 ... base/metadata 
-rw-r--r-- 1 root root 11 ... overlay/data2 
-rw-r--r-- 1 root root 10 ... overlay/metadata 
-rw-r--r-- 1 root root 14 ... point/data 
-rw-r--r-- 1 root root 11 ... point/data2 
-rw-r--r-- 1 root root 10 ... point/metadata 
#查看具有同名的上下层文件metadata 
$ cat point/metadata 
layer 2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/80745
推荐阅读
相关标签
  

闽ICP备14008679号