🌈 个人主页:Zfox_
🔥 系列专栏:Docker

一:🔥 Docker Image 概述

🦋 docker镜像是什么

定义:Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。

  • 特性:可以理解为一个模板,通过该模板可以实例化出多个容器。镜像内部采用分层文件系统(Union FS),这样既可以充分利用共享层,又可以减少存储空间占用。

  • 分层:每一层文件系统称为一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但 docker 镜像中每层文件系统都是只读的,联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。

构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的 可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。

类比了解

img

  • 镜像:类似于 Java 或 C++ 中的类,可以方便地构建出不同的对象。
  • 分层:类似房屋装修,最底层是钢筋水泥,依次添加保温层、采暖管、水泥层,最后用户铺设木地板或地砖,每一层都可以独立修改,但最终呈现为一个整体。

🦋 为什么需要镜像?

背景:在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。

然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。它是如何解决 Paas 时代所面临的云端和本地一致性问题?

  • 很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构(本质:Docker 镜像就是个压缩包),这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。

  • 一致性:解决云端和本地环境的一致性问题,确保应用在不同环境中运行一致。

  • 便捷性:提供了一种打包应用程序和预配置服务器环境的便捷方式,便于个人使用或与他人共享。

二:🔥 镜像命令详解

以下是常用的 Docker 镜像命令清单表格:

命令别名功能
docker imagesdocker image ls/docker image list列出本地镜像
docker tagdocker image tag给镜像打标签,可用于推送镜像仓库
docker pulldocker image pull从镜像仓库拉取镜像
docker pushdocker image push推送镜像到仓库
docker rmidocker image rm/ docker image remove删除本地镜像
docker builddocker image build通过 dockerfile 制作镜像
docker savedocker image save将指定镜像保存成 tar 归档文件
docker loaddocker image load导入使用 docker save 命令导出的镜像
docker image inspect查看镜像详细信息
docker historydocker image history查看镜像历史
docker import从归档文件 docker export 中创建镜像
docker image prune删除不使用的镜像

🦋 docker rmi

功能:删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

参数

  • -f:强制删除
  • --no-prune:不移除该镜像的过程镜像,默认移除

通过镜像ID进行删除

image.png

也可以通过名称 +tag 进行删除操作

  • rm: 删除容器
  • rmi: 删除镜像

注意:如果镜像被容器引用了,那么我们需要先把容器停止退出,然后将容器删除掉

如果存在镜像正在被使用,如果需要删除的话,可以加一个-f 参数进行强制删除操作

🦋 docker save

功能:将指定镜像保存成tar归档文件

docker save [OPTIONS]IMAGE [IMAGE...]
  • 别名docker image save

  • 参数

    • -o:输出文件路径

示例:这里我们目前存在几个镜像,然后对其中一个镜像进行保存:

image-20251219221152466

docker save -o mynginx1.tar nginx:1.23.4

将镜像保存了之后,我们查看当前目录发现多了一个压缩文件

image-20251219222556563

🦋 docker load

功能:导入使用 docker save 命令导出的镜像

docker load [OPTIONS]
  • 别名docker image load

  • 参数

  • -input,-i:指定导入的文件,代替STDIN

  • --quiet,-q:精简输出信息

示例:指定tar包进行加载操作

docker load -i mybusybox1.tar

image-20251219222649047

如果后面参数是 -q 的话,会将具体的加载数据进行精简化

🦋 docker history

功能:显示镜像历史

docker history [OPTIONS] IMAGE
  • 别名docker image history

  • 参数

    • -H,--human:大小和日期采用人容器读的格式展现

    • --no-trunc:显示全部信息,不要隔断

    • -q,--quiet:只显示镜像id信息

docker history nginx:1.23.4

image-20251219222845093

🦋 docker import

功能:从归档文件中创建镜像。

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
  • 别名:docker image import
  • 参数
    • -c:应用 Docker 指令
    • -m:提交说明

样例

docker import my_ubuntu_v3.tar maxhou/ubuntu:v4

🦋 docker image prune

功能:删除不使用的镜像

docker image prune [OPTIONS]
  • 语法docker image prune [OPTIONS]

  • 关键参数

    • -a,-all:删除全部不使用的镜像

    • -filter filter:指定过滤条件

    • -f,--force:不提示是否删除

示例

docker image prune -a	# 这个是一个危险操作,会将我们所有的镜像全部清理掉

image.png

🦋 docker build

功能:使用 Dockerfile 创建镜像。

docker build [OPTIONS] PATH | URL | -
  • 参数
    • --build-arg=[]:设置镜像创建时的变量
    • -f:指定 Dockerfile 路径
    • --label=[]:设置镜像元数据
    • --no-cache:不使用缓存
    • --pull:尝试更新镜像
    • --quiet, -q:安静模式
    • --tag, -t:镜像名称及标签
    • --network:设置网络模式

样例

docker build -t mynginx:v1 .

三:🔥 docker操作实战

🦋 查找以及下载镜像

① 查找镜像(一般可能会出现网络问题,这个出错也不影响后面的下载)

docker search busybox

image.png

② 拉取镜像

docker pull busybox:1.36.0

image.png

注意:下载镜像时,可以看到镜像是分层下载的。

③ 检查是否拉取成功了

docker images

image.png

镜像过滤

① 根据仓库名列出镜像

docker image ls nginx # 或者docker images busybox

② 列出特定的某个镜像(指定仓库名和标签)

docker image ls nginx:1.23.4

③ 查看某个位置之前的镜像,使用过滤器参数 --filter 或 -f

docker image ls -f before=nginx:1.23.4

④ 查看某个位置之后的镜像

docker image ls -f since=nginx:1.23.4

image-20251219225818868

🦋 查看镜像及列表存储位置

① 查看镜像

docker images busybox

image-20251219224505422

② 查看镜像仓库在本地的存储信息

  • Docker 镜像的存储位置默认在 /var/lib/docker 目录下。可以通过修改配置文件来更改存储位置。
  • 进入var/lib/docker/image/目录
cd /data/var/lib/docker/image/
cd overlay2/	# overlay2 是 docker 的存储驱动
cat repositories.json

image-20251219225229093

然后将这段 json 数据在线格式化得到如下内容:

{
	"Repositories": {
		"busybox": {
			"busybox:1.35.0": "sha256:95f45f955052d6485b34fb167a1b938e3dd684b4fc43115a77faf23593d4c513",
			"busybox@sha256:98ad9d1a2be345201bb0709b0d38655eb1b370145c7d94ca1fe9c421f76e245a": "sha256:95f45f955052d6485b34fb167a1b938e3dd684b4fc43115a77faf23593d4c513"
		},
		"nginx": {
			"nginx:1.23.4": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4",
			"nginx@sha256:f5747a42e3adcb3168049d63278d7251d91185bb5111d2563d58729a5c9179b0": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4"
		}
    }
}

③ 查看本地镜像, 发现和 repositories.json 文件记录的信息相同

docker image inspect busybox:1.35.0

🦋 打标签并且推送到个人仓库

① 打标签: 先将我们的镜像进行标签的修改

docker tag busybox:1.35.0 island/mybusyboxby:v1.0

② 推送镜像:执行推送命令

docker push island/mybusyboxby:v1.0

image-20251218230547743

🦋 运行镜像

我们启动镜像的时候通过一个交互式的方式进行启动

docker run -it busybox:1.36.0

image.png

在另一个终端输入命令可以查看我们的镜像是否启动了

docker ps

image.png

测试下效果
image.png

我们最后通过exit进行退出操作

我们可以在ps后面加上-a参数来查看镜像运行数据

docker ps -a
#带上参数-a可以查看到已经停止的容器

image.png

删除镜像

docker rmi IMAGEID

image.png

🦋 离线迁移镜像

# 步骤1:保存镜像为tar文件
docker save -o mytest.tar busybox:1.35.0
# 步骤2:拷贝镜像到第二台服务器
scp mytest.tar root@123.60.26.220:/docker_test
#通过scp命令将mytest.tar文件拷贝到123.60.26.220root用户下的/docker_test路径中

# 步骤3:从tar文件中恢复镜像
docker load -i mytest.tar
# 步骤4:检查镜像是否正常运行(启动镜像)
docker run -it busybox:1.35.0

image-20251219230647935

🦋 压缩共享实战

nginx在服务端是50多MB

image.png

但是当我们拉取到客户端上,大小就是142MB

image.png

我们先登录上腾讯仓库

docker login ccr.ccs.tencentyun.com --username=100038760726

我们现在将本地镜像进行打标签操作

docker tag nginx:1.23.3 ccr.ccs.tencentyun.com/undoom/busybox:v1.0

打完了标签就能看到本地存在了这个镜像了

image.png

现在我们开始进行推送操作

docker push ccr.ccs.tencentyun.com/undoom/busybox:v1.0

image.png

在远端仓库可以看到我们的镜像,这里可以发现进行了一个压缩操作

image.png

image.png
如果仓库中已经存在了相同的镜像的话,我们仓库中只是多了一个tag,其他的并不会变

image.png

四:🔥 共勉

😋 以上就是我对 【Docker#5】Docker Image(镜像) 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉
在这里插入图片描述

更多推荐