[Docker][Docker Image]详细讲解

DieSnowK 2024-08-18 12:37:06 阅读 87

目录

1.Docker镜像是什么?2.Docker镜像加载原理1.bootfs2.rootfs3.为什么CentOS镜像几个G,而Docker CentOS镜像才几百M?1.CentOS2.Docker CentOS

3.镜像分层1.Union FS2.分层理解3.容器层 vs 镜像层

4.镜像命令1.docker images2.docker image inspect3.docker tag4.docker rmi5.docker save6.docker load7.docker history8.docker import9.docker image prune10.docker build


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

功能:查看所有本地的主机上的镜像语法:<code>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指令的网络模式



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。