镜像

概念:Docker 镜像(Image)本质上是一个只读的文件集合,其中包含了运行软件所需的全部依赖资源:文件系统、源代码、库文件、运行依赖、系统工具等。
我们可以将镜像类比为 “包含完整运行环境的压缩包”,也可将其理解为创建容器的 “模板”, 基于同一个镜像,能够实例化出多个独立运行的容器。

Docker 镜像的文件系统基于 Union FS(联合文件系统)实现分层存储,构建镜像时,从最基础的系统镜像(如 Ubuntu)开始,每一步构建操作(如安装依赖、拷贝代码)都会新增一层只读的文件系统,最终所有层叠加形成完整镜像。需要注意的是,上层文件系统的修改会覆盖底层对应位置的文件,底层内容并不会被真正修改。

原因:之所以需要 Docker 镜像,核心是解决环境不一致和应用部署繁琐的问题,本地开发环境与云端生产环境的配置往往存在差异,导致应用 “本地能跑,云端报错”,而手动为每个应用适配环境,打包部署的过程也效率极低。Docker 镜像会封装完整的操作系统文件和目录结构,确保镜像内的运行环境与本地 / 测试环境完全一致。
此外,Docker 的分层存储机制还能实现层共享:例如两个 Python 应用镜像若依赖相同的基础系统层和 Python 依赖层,只需存储一份公共层即可,无需重复存储,大幅节省磁盘空间和传输带宽。

命令

docker images:用于列出本地镜像。

docker images [options] [Repository[:Tag]]

-a:用于列出本地所有的镜像,含中间映象层
-digests:显示镜像的摘要信息
-f:显示满足条件的镜像
–format:指定返回值的模板文件
–no-trunc:显示完整的镜像信息
-q:只显示镜像id
docker tag:标记本地镜像,将其归入某一个仓库。

docker tag source_image[:tag] target_image[:tag]

docker rmi:用于删除镜像。

docker rmi [options] image1 [image..]

-f:表示强制删除
–no-prune:不移除该镜像的过程镜像,过程镜像是指在docker构建镜像的过程中,每一条构建指令都会生成临时只读层镜像。
不删除这些只读层镜像,比如说我们只修改了顶层镜像的一部分代码,在重新构建的时候,会使用缓存,而不会重新下载依赖,构建的速度会快很多。
docker save:用于将指定的镜像保存成tar归档文件。

docker save [options] image1 [image..]

-o表示输出到文件
docker load:导入使用docker save命令导出的镜像。

docker load [options]

–input:指定导入的文件,代替stdin标准输入流
–quiet表示精简输出信息
docker image inspect:用于查看镜像的详细信息,会自动检查是镜像还是容器然后显示相关信息。

docker image inspect [options] image1 [image..]

docker history:可以查看镜像历史。

docker history [options] image

-H:大小和日期哦采用人容易读的格式展现
–no-trunc:显示全部信息,不要截断
-q:只显示镜像信息
docker import:从归档文件中创建镜像。

docker import [options] file|URL|repository[:tag]

-c:应用docker指令创建镜像,在使用归档文件创建镜像的同时,给镜像附加dockerfile配置
-m:表示提交时候的说明文字
docker image prune:用于删除不使用的镜像(没有被任何容器或者镜像依赖的镜像)

docker image prune [options]

-a:删除全部不使用的镜像
-filter:指定过滤条件
-f:不提示是否删除
docker build:用于使用dockerfile创建镜像(dockerfile是一个纯文本文件,包括用什么操作系统,安装哪些依赖,复制哪些代码等)

docker build [options] path|url|-

–build-arg=[]:设置镜像创建时候的变量
-f:指定要使用的dockerfile路径
–label=[]:设置镜像使用的元数据
–no-cache:创建镜像的过程不使用缓存
–pull:尝试去更新镜像的新版本
–quiet:成功后只输出镜像id
–tag:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签
–network:默认为default,在构建期间设置run指令的网络模式

实操

镜像存储的压缩共享

  • 拉取nginx镜像,如果本地不存在此镜像,就从仓库拉取。
docker pull nginx:1.21.1
  • 使用docker image查看镜像,可以看到此镜像的大小为200MB,而我们在dockerhub镜像仓库可以看到镜像没有那么大,说明发生了压缩。
    在这里插入图片描述
  • 把一个镜像打多个tag,然后同时推送仓库,可以看到提示说层已经存在,不会重复存储。
    在这里插入图片描述
    如果是docker hub,在推送的时候发现我们推送上去的镜像的中间只读层在docker hub的其他仓库也存在,那么docker hub就不会让你本地上传这一层,而是挂载(mount)引用官方仓库里的已有层。

更多推荐