1.Docker镜像是什么?

  • Docker Image本质上是一个只读文件, 这个文件包含了文件系统、 源码、库文件、依赖、工具等一些运行application所必须的文件
  • 可以把Docker Image理解成一个模板, 可以通过这个模板实例化出来很多容器
  • Image里面是一层层文件系统Union FS(联合文件系统),可以将几层目录挂载到一起,形成一个虚拟文件系统

2.Docker镜像加载原理

1.bootfs

  • bootfs主要包含bootloader和kernel,Linux刚启动时会加载bootfs
    • 在Docker镜像的最底层就是bootfs,这一层与Linux是一样的,包含bootloader和kernel
  • 当boot加载完成之后,整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时OS也会卸载bootfs

2.rootfs

  • rootfs在bootfs之上,包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • rootfs就是各种不同的OS发行版
    • 如Ubuntu,CentOS

3.为什么CentOS镜像几个G,而Docker CentOS镜像才几百M?

1.CentOS

  • 一个完整的Linux OS会包含Linux内核和rootfs根文件系统
    • 即:/dev,/proc,/bin,/etc等目录。
  • 平时看到的CentOS除了rootfs,还会选装很多软件,服务等,所以CentOS镜像有几个G也很正常

2.Docker CentOS

  • 对于一个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了
    • 因为底层直接用Host的kernel,自己只要提供rootfs就可以了
    • 由此可见,对于不同的Linux发行版
      • bootfs基本是一致的,rootfs会有差别
      • 因此不同的发行版可以共用bootfs
  • 对于容器镜像而言,所有容器都是共享宿主机的Linux内核的
    • Docker镜像只需要提供一个很小的rootfs即可,只需要包含最基本的命令,工具,程序库即可,所以docker镜像才会这么小

3.镜像分层

1.Union FS

  • Union FS是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
  • 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统
    • 一层层往上叠加,上层的修改会覆盖底层该位置的可见性,就像上层把底层遮住了一样
    • 当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
  • Union FS是Docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像

2.分层理解

  • 所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层

  • 例子

    • 基于Ubuntu 16.04创建一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层
    • 如在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层
    • 如果继续添加一个安全补丁,就会创建第三个镜像层
      请添加图片描述
  • 在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合

    • 如下例子:每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件
      请添加图片描述
  • 下图展示了一个稍微复杂的三层镜像,在外部看来只有6个文件,这是因为最上层的文件7时文件5的一个更新版本

    • 这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件,这样就使得文件的更新版本作为一个新镜像层添加到镜像当中
      请添加图片描述

3.容器层 vs 镜像层

  • Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部
  • 这一层就是通常说的容器曾,容器层之下的都叫镜像层
    请添加图片描述

4.镜像命令

1.docker images

  • 功能:查看所有本地的主机上的镜像
  • 语法docker images [OPTIONS] [REPOSITORY][:TAG]]
  • 关键参数
    • -a, --all:列出本地所有的镜像
    • -q, --quiet:只显示镜像ID
    • digests:显示镜像的摘要信息
    • -f:显示满足条件的镜像
    • --format:指定返回值的模板文件
    • --no-trunc:显示完整的镜像信息

2.docker image inspect

  • 功能:查看镜像详细信息
  • 语法docker image inspect [OPTIONS] IMAGE [IMAGE...]
  • 注意docker inspect会自动检查是镜像还是容器然后显示详细信息
  • 示例docker image inspect nginx:1.23.3

3.docker tag

  • 功能:标记本地镜像,将其归入某一仓库
  • 语法docker tag SOUCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
  • 示例docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04

4.docker rmi

  • 功能:删除镜像
  • 语法:`docker rmi [OPTIONS] IMAGE [IMAGE…]
  • 关键参数
    • -f:强制删除
    • --no-purse:不移除该镜像的过程镜像,默认移除

5.docker save

  • 功能:将指定镜像保存成tar归档文件
  • 语法docker save [OPTIONS] IMAGE [IMAGE...]
  • 关键参数-o:输出到文件
  • 示例docker save -o SnowK.tar Die:v1.0

6.docker load

  • 功能:导入使用docker save命令导出的镜像
  • 语法docker load [OPTIONS]
  • 关键参数
    • -i, --input:指定导入的文件,代替STDIN
    • -q, --quiet:精简输出信息
  • 示例docker load -i SnowK.tar

7.docker history

  • 功能:显示镜像历史
  • 语法docker history [OPTIONS] IMAGE
  • 关键参数
    • -H, --human:大小和日期采用人容易读的格式展现
    • --no-trunc:显示全部信息,不要隔断
    • -q, --quiet:只显示镜像ID信息

8.docker import

  • 功能:从归档文件中创建镜像
  • 语法docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • 关键参数
    • -c:应用Docker指令创建镜像
    • -m:提交时的说明文字

9.docker image prune

  • 功能:删除不使用的镜像
  • 语法:`docker image prune [OPTIONS]
  • 关键参数
    • -a, -all:删除全部不使用的镜像
    • --filter filter:指定过滤条件
    • -f, --force:不提示是否删除

10.docker build

  • 功能:使用Dockerfile创建镜像
  • 语法:`docker build [OPTIONS] PATH|URL| -
  • 关键参数
    • --build-arg=[]:设置镜像创建时的变量
    • -f:指定要使用的 Dockerfile 路径
    • --label=[]:设置镜像使用的元数据
    • --no-cache:创建镜像的过程不使用缓存
    • -pull:尝试去更新镜像的新版本
    • --quiet, -q:安静模式,成功后只输出镜像 ID
    • --rm:设置镜像成功后删除中间容器
    • -t, --tag:镜像的名字及标签,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个标签
    • --network:默认default,在构建期间设置RUN指令的网络模式
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐