Docker Image(镜像)

"脚印会旧而梦还在走"


Docker 镜像介绍

(1) 如何理解镜像?

🎯 docker image本质就是一个 read-only(只读)文件,这个文件包含了文件系统、源码、库文件、依赖文件、工具等一些运行 application 所必须的文件。

🎯 我们也可以把docker image理解成一个模板,根据这个模板可以实例化出很多 "容器"。至于容器是什么?这里我们就简单理解成一个 "独立的操作系统+应用程序" 即可。

🎯 在image中是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。每一层文件系统就叫做当前层的 "layer"。例如,我们可以在docker hub随意举例一个镜像文件:

注: 联合文件系统可以对每一层文件系统设置三 种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的

镜像分层

在构建镜像的时候,都是从一个最基本的操作系统开始的。每个构建的操作都相当于做一层的修改,增加了一层文件系统。于是,一层层往上叠加,上层的修改会覆盖底层该位置的可见性。

这种构建的过程就类似于装地暖。我们人仅仅是能感受到表层木板,但不知道模板下还填了钢筋水泥层、加保温层,采暖管等。

为什么需要镜像?

Docker镜像本质就是一个"可读文件",所以Docker镜像天然就具有 "打包"的功能。

往往我们的生产环境与研发环境是不一样的,为了正确地迁移、部署,我们需要做很多麻烦的工作。Docker镜像就像一个压缩包一样,它自身内部就具有一个完整的操作系统所有文件和对应的目录结构,与本地环境没有任何的关联性,从而屏蔽掉了环境的差异性。

docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式可以很方便地将其用于个人用途或与其他 Docker 用户公开共享。

Docker 镜像命令

docker 镜像命令清单:

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

Docker 命令详解:

🧩 docker images

语法:

bash 复制代码
# 列出本地镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS:
-a :列出本地所有的镜像
--digests :显示镜像的摘要信息
-f :显示满足条件的镜像
--format :指定返回值的模板文件
--no-trunc :显示完整的镜像信息
-q :只显示镜像 ID

🧩 docker tag

语法:

bash 复制代码
# 标记本地镜像,将其归入某一仓库
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

🧩 docker rmi

语法:

bash 复制代码
# 删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]

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

如果是删除标签,仅仅是将这个标签借关联。直到删除镜像,才会真正将这个镜像删除。

🧩 docker save

语法:

bash 复制代码
# 将指定镜像保存成 tar 归档文件
docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS:
-o :输出到的文件

我们想要将这两个镜像打包归档:

通过命令生成.tar文件

🧩 docker load

语法:

bash 复制代码
# 导入使用 docker save 命令导出的镜像
docker load [OPTIONS]

OPTIONS:
--input , -i : 指定导入的文件,代替STDIN
--quiet , -q : 精简输出信息

我们将之前的本地镜像删除。

我们再通过指定导入.tar包,加载镜像文件。

🧩 docker image inspect

bash 复制代码
# 查看镜像详细信息
docker image inspect [OPTIONS] IMAGE [IMAGE...]

注:
docker inspect 会自动检查是镜像还是容器然后显示相信信息    

🧩 docker history

语法:

bash 复制代码
# 显示镜像历史
docker history [OPTIONS] IMAGE

OPTIONS:
-H , --human :大小和日期采用人容易读的格式展现
--no-trunc :显示全部信息,不要隔断
-q, --quiet: 只显示镜像 id 信息

这些镜像历史通常就是显示出这个镜像文件历史 layer层。

🧩 docker image prune

语法:

bash 复制代码
# 删除不使用的镜像
docker image prune [OPTIONS]

OPTIONS:
-a , --all : 删除全部不使用的镜像
--filter filter:指定过滤条件
-f, --force :不提示是否删除

这些镜像没有被使用过,所以就会被删除。这个命令需小心谨慎地使用,以防误删。

至于docker build与镜像制作有关 、docker import本质就是生成当前容器的快照版本,则不是本篇要细说的。


镜像操作案例

我们已经习得docker镜像命令的使用。所以本小节就是以使用busybox镜像对这些命令操作进行使用、回顾。

什么是busybox?

BusyBox是一个集成了三百多个最常用Linux命令和工具的软件。

拉取镜像

bash 复制代码
docker pull busybox:1.36.0

成功拉取下来。

查看镜像详情

bash 复制代码
docker image inspect busybox:1.36.0

查看镜像分层

bash 复制代码
docker history busybox:1.36.0

打标签

bash 复制代码
docker tag busybox:1.36.0 registry.cn-chengdu.aliyuncs.com/wgzzs/test_registry:v1.0

推送镜像

bash 复制代码
docker login registry.cn-chengdu.aliyuncs.com

首先需要登录认证。

bash 复制代码
docker push registry.cn-chengdu.aliyuncs.com/wgzzs/test_registry:v1.1

完成推送

运行容器

bash 复制代码
docker run -it --rm busybox:1.36.0

我们可以再容器中的命令行输入 busybox为我们打包的linux命令。

镜像删除

镜像的删除:可以根据 id 和名字删除,对于使用的镜像需要先清理容器再删除镜像

bash 复制代码
docker rmi busybox:1.36.0

本篇到此结束,感谢你的阅读。

祝你好运,向阳而生~

相关推荐
RisunJan1 小时前
Linux命令-rlogin(远程登录)
linux·运维
大飞记Python4 小时前
Linux命令速查手册(测试开发4年实战总结,附PDF)
linux·网络·pdf
顾喵6 小时前
PetaLinux 2017.4 实操指南:PREEMPT_RT实时补丁移植+Zynq PL中断UIO用户态配置(超完整避坑版)
linux
小樱花的樱花6 小时前
Linux 线程的创建
linux·c语言·开发语言
donoot6 小时前
一次 Nginx 502 问题的深度排查:从 SELinux 到容器网络
nginx·docker·selinux·反向代理·502 bad gateway
mounter6256 小时前
BPF 的进化史:从网络过滤器到 AI 时代的 Linux 核心引擎
linux·网络·人工智能·ebpf·linux kernel·kernel
YMWM_7 小时前
video.preset的值为null和ultrafast的区别
linux·video
Sagittarius_A*8 小时前
Docker:渗透前置容器化核心基础
运维·安全·docker·容器
代码AC不AC9 小时前
【Linux】线程池
linux·线程池
网络小白不怕黑10 小时前
12.DHCP服务搭建
linux·运维·服务器·网络