0


[Docker][Docker Image]详细讲解

目录


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指令的网络模式
标签: docker 容器 运维

本文转载自: https://blog.csdn.net/qq_37281656/article/details/140787451
版权归原作者 DieSnowK 所有, 如有侵权,请联系我们删除。

“[Docker][Docker Image]详细讲解”的评论:

还没有评论