🎬慕斯主页:修仙—别有洞天
♈️今日夜电波:秒針を噛む—ずっと真夜中でいいのに。
0:34━━━━━━️💟──────── 4:20
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
首先理解几个概念
Docker 镜像(image)是什么?
为什么需要镜像 ?
镜像命令详解
docker rm
docker save
docker load
docker history
docker image prun
docker import
Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
镜像与容器的理解:可以理解为类和对象的关系。镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。
下面看看官方给出的Docker 架构,可以结合此图来理解镜像的概念:
Docker镜像的重要性在于它们为软件开发和部署提供了几个关键优势,以下是几个主要原因:
总而言之,docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
前面的文章已经解析过了最常见的images、tag、pull、push、image inspect了,这里不多解析。至于build在理解完后续知识再详细介绍。
docker rmi
命令用于从本地删除一个或多个 Docker 镜像。当不再需要某个镜像,或者想要清理磁盘空间时,这个命令就非常有用。下面是对 docker rmi
命令的详细解析:
命令语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS
可以是以下选项之一或多个:-f, --force
:强制删除正在被容器使用的镜像。通常情况下,如果镜像被正在运行的容器使用,则无法删除。--no-prune
:默认情况下,Docker会尝试删除所有未被其他镜像引用的中间镜像层。使用此选项可以阻止这种行为,只删除指定的镜像。IMAGE
是要删除的镜像的名称或ID。可以指定一个或多个镜像,以空格分隔。注意事项
-f
选项。docker stop
和 docker rm
命令停止并删除容器,然后才能删除镜像。针对前面两点的例子:通常我们run了一个镜像会生成对应的容器,而这些容器可能会存在很多个,而此时我们如果要删除镜像,则需要先把对应的容器给全部先删除掉才能删除镜像。那你这时又会问了,不是有个-f选项吗?为什么不直接强制删除呢?这种方式是不推荐的,一般的流程则是前面所提到的。
--no-prune
选项。例子
docker save
命令用于将一个或多个 Docker 镜像保存为一个 tar 格式的存档文件。这个功能对于需要在不同的 Docker 环境之间迁移镜像,或者备份镜像来说是非常有用的。下面是 docker save
命令的详细解释:
命令语法
docker save [OPTIONS] IMAGE [IMAGE...]
-o, --output
:用于指定输出的 tar 文件的路径和文件名。如果没有提供这个选项,docker save
命令会将输出重定向到标准输出(stdout),通常这会直接输出到控制台,所以一般在实际使用中会配合 -o
选项使用。IMAGE
:你要保存的镜像的名称或 ID。可以指定一个或多个镜像,多个镜像之间用空格分隔。注意事项
docker save
命令保存镜像时,Docker 会递归地保存镜像的所有层,这意味着如果多个镜像共享某些层,那么这些层只会被保存一次,即使它们属于不同的镜像。docker load
命令恢复,将镜像重新加载到 Docker 中。例子
docker load
命令用于从一个 tar 格式的存档文件中恢复 Docker 镜像。这个命令与 docker save
命令是互补的,后者用于将镜像保存为 tar 文件,而前者则是用来将 tar 文件中的镜像数据加载回 Docker 环境中。下面详细介绍 docker load
命令的用法:
命令语法
docker load [OPTIONS]
--input, -i
:指定要加载的 tar 文件的路径。如果没有提供此选项,docker load
命令会从标准输入(stdin)中读取数据。--quiet, -q
:精简输出信息。注意事项
docker save
命令导出的格式,否则可能无法成功加载。docker load
命令会检查 tar 文件中的镜像数据,并重建镜像的元数据和层。这个过程可能需要一些时间,具体取决于镜像的大小和复杂度。docker load
命令会一次性加载所有这些镜像。docker images
命令查看已加载的镜像列表。例子
从 tar 文件加载镜像
docker load --input test.tar
这条命令将从 my_image.tar
文件中加载镜像到当前的 Docker 环境中。
--input
选项,直接使用标准输入:cat my_image.tar | docker load
或者从远程下载后立即加载:
curl -L https://example.com/my_image.tar | docker load
docker history
命令用于显示 Docker 镜像的构建历史,包括每一层的详细信息。这对于理解和调试镜像的构建过程特别有帮助,可以查看每一层是由什么命令创建的,以及各层的大小和其他元数据。下面是关于 docker history
命令的详细说明:
命令语法
docker history [OPTIONS] IMAGE
--format
:指定输出格式。可以使用 Go 的模板语言来定制输出的格式。--no-trunc
:如果设置,命令将不会截断长输出,而是显示完整的值。--quiet, -q
:只输出每一层的 ID。IMAGE
:要查询历史的镜像的名称或 ID。输出格式
默认情况下,docker history
命令将输出以下信息:
注意事项
RUN
可能会在单个层中执行多个命令。--format
选项时,可以使用的字段包括 .ID
, .Created
, .CreatedBy
, .Size
, 和 .Comment
。使用示例
查看镜像历史
docker history ubuntu:latest
这将列出 ubuntu:latest
镜像的构建历史。
只显示层 ID
docker history -q ubuntu:latest
这个命令将只输出每一层的 ID,常用于脚本中进一步处理。
使用自定义格式
docker history --format '{{.ID}} - {{.CreatedBy}}' ubuntu:latest
通过自定义格式,可以按照个人需求调整输出的信息。
docker image prune
命令用于清理 Docker 环境中不再需要的镜像,特别是那些没有被任何容器引用的“悬空”(dangling)镜像。这有助于释放磁盘空间,保持 Docker 系统的整洁。下面是关于 docker image prune
命令的详细解析:
命令语法
docker image prune [OPTIONS]
-a, --all
:删除所有未被使用的镜像,而不仅仅是悬空的镜像。悬空镜像是指没有被任何容器关联且没有被赋予任何标签的镜像。--filter, -f
:使用过滤器来选择要删除的镜像。例如,--filter until=
可以用来删除在指定时间之前创建的镜像。--force, -f
:强制执行操作,不询问确认。--help
:显示帮助信息。注意事项
docker image prune
命令之前,最好确认哪些镜像是可以安全删除的,尤其是使用 -a
选项时。可以先使用 docker images
命令查看所有镜像的列表。-a
选项,该镜像也不会被删除。使用示例
仅删除悬空镜像
docker image prune
这个命令将删除所有悬空的镜像。
删除所有未被使用的镜像
docker image prune -a
使用 -a
选项将会删除所有未被任何容器引用的镜像,不仅仅是悬空的。
强制删除所有未被使用的镜像
docker image prune -a --force
这个命令将不询问确认,直接删除所有未被使用的镜像。
根据时间过滤并删除镜像
docker image prune -a --filter "until=2023-01-01"
这个命令将删除所有在2023年1月1日之前创建的未被使用的镜像。
docker import
命令用于从一个归档文件或远程 URL 创建一个新的 Docker 镜像。这个命令特别有用,当你需要将一个文件系统快照或一个预先构建的文件结构转换成 Docker 镜像时。与 docker build
命令不同,docker import
不使用 Dockerfile,而是直接从提供的文件或目录结构中创建镜像。
命令语法
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
file
: 本地文件系统上的归档文件路径,可以是一个 .tar
或者压缩过的 .tar.gz
, .tgz
, .bzip
, .tar.xz
, 或 .txz
文件。URL
: 一个远程 URL,通常指向一个可通过 HTTP(S) 访问的归档文件。-
: 表示从标准输入(stdin)读取归档数据,这通常用于管道操作。REPOSITORY[:TAG]
: 指定新创建的镜像的仓库名称和可选的标签。如果省略了标签,将使用默认的 latest
标签。-c
或 --change
: 用于在创建镜像时应用 Dockerfile 指令,例如改变工作目录、设置环境变量等。这可以通过逗号分隔的列表形式提供,每个项看起来类似于 Dockerfile 的指令,例如 WORKDIR=/path,ENV VAR=value
。-m
或 --message
: 设置提交信息,这将在镜像历史中显示。注意事项
docker import
命令不支持多阶段构建或构建缓存,因为它不使用 Dockerfile。-c
或 --change
选项时,你应该熟悉 Dockerfile 的语法,因为这里使用的语法非常相似。通过 docker import
,你可以方便地将现有的文件系统快照或归档文件转化为 Docker 镜像,便于后续的部署和分发。
示例
假设你有一个名为 myapp.tar.gz
的归档文件,其中包含了你的应用程序及其依赖,你可以使用以下命令将其转换为 Docker 镜像:
docker import myapp.tar.gz myimage:latest
这将创建一个名为 myimage
并带有 latest
标签的新镜像。
如果你想从一个远程 URL 导入一个归档文件,可以这样做:
docker import https://example.com/downloads/myapp.tar.gz myimage:latest
如果你想要从标准输入读取数据,可以使用管道操作:
cat myapp.tar.gz | docker import - myimage:latest
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~