[Docker][Docker Image]详细讲解
[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个文件
- 如下例子:每个镜像层包含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指令的网络模式
更多推荐
已为社区贡献6条内容
所有评论(0)