Docker - 镜像

镜像

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

我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多 容器。

image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到 一起,形成一个虚拟文件系统。

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

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

为什么需要镜像?

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

然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你 可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如 何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成 一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环 境用的操作系统一摸一样。

docker****最大的贡献就是定义了容器镜像的分层的存储格式,docker 镜像技术的基础 是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可 以减少存储空间占用。

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 rmi命令

功能删除本地镜像

语法

docker rmi OPTIONS IMAGE IMAGE...

别名 docker image rm, docker image remove

关键参数

**-f :**强制删除;

**--no-prune :**不移除该镜像的过程镜像,默认移除;

通过标签删除

通过id删除

当一个镜像被容器引用了,是不能被删除的。只能强制删除,加上 -f参数

但是并不建议强制删除,而是先删除引用镜像的容器,最后再删除镜像。删除容器命令为docker rm

docker sava命令

功能

将指定镜像保存成 tar 归档文件。

语法

docker save OPTIONS IMAGE IMAGE...

别名 docker image save

关键参数

**-o :**输出到的文件。

将镜像busybox:1.36.0 保存为myBusybox.tar文件

docker load命令

功能

导入使用 docker save 命令导出的镜像。就是将tar包导回成镜像

语法

docker load OPTIONS

别名 docker image load

关键参数

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

**--quiet , -q :**精简输出信息。

docker history命令

功能

显示镜像历史。就是查看镜像的分层

语法

docker history OPTIONS IMAGE

别名 docker image history

关键参数

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

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

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

docker image prune命令

功能

删除不使用的镜像。

语法

docker image prune OPTIONS

关键参数

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

**--filter filter:**指定过滤条件;

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

镜像操作

1、查找镜像

在hub.docker.com上去查找。在shell中运行命令 docker search busybox 查找,但是并不会显示tag

2、下载镜像

拉取镜像,执行命令 docker pull busybox:1.36.0

3、查看镜像及列表存储位置

镜像的存储位置在 /var/lib/docker/的位置。列表信息是存储在本地的overlay文件夹下的json文件中的

4、查看镜像详情

查看镜像详细信息,执行命令 docker image inspect busybox:1.36.0

5、查看镜像分层

查看镜像分层,执行命令 docker history busybox:1.36.0

6、打标签

打标签,执行命令 docker tag busybox:1.36.0 hzpxx/hzptest:v1.36.0

7、推送镜像

推送镜像,执行命令 docker push hzpxx/hzptest:v1.36.0

查看仓库

8、运行容器

执行命令 docker run -it hzpxx/hzptest:v1.36.0 sh

然后执行exit 退出容器

9、镜像删除

执行命令 docker rmi hzpxx/hzptest:v1.36.0

执行命令 docker ps -a 查看

可以看到刚刚退出的容器的镜像id为 9e2bbca07938

执行命令 docker images查看本地镜像

可以看到hzpxx/hzptest:v1.36.0 的镜像没有了,但是这个镜像id的其他镜像 依然存在

执行命令 docker ps -a | grep 9e2bbca07938,查看和这个镜像id关联的容器

然后 继续删除这个 镜像,执行命令

再次查看删除后的效果,刚刚的镜像id 已经完全不存在了

这里可以看到只要这个镜像存在,通过tag删除,只有起到一个去标签的作用,也就是容器的镜像并没有真正删除掉,并且在 docker ps -a中的信息,将原先为tag的image列信息改为了镜像id了。知道删除到最后一个tag的时候,才会报错和该镜像引用的容器。需要先删除引用的容器再删除镜像。

离线迁移镜像

1、将镜像保存为一个tar包

执行命令 docker save -o busybox.tar busybox

2、使用scp命令用于两台服务器之间的拷贝(通过ssh协议完成两台服务器之间的拷贝)

执行命令 scp busybox.tar root@43.138.218.166:/hzp/data

拷贝当前目录下的busybox.tar文件,到对端服务器43.138.218.166下的root用户下的/hzp/data

3、在目标服务器上恢复镜像

执行命令 docker load -i busybox.tar

4、执行docker run 检查镜像是否可以正常运行

执行命令 docker run -it --rm busybox:1.36.0 sh

镜像存储的压缩和共享

1、拉取nginxnginx:1.21.4

2、hub.docker.com上查找该镜像的大小为54.08M

但是拉取下来存在本地的镜像为60.1M,说明镜像在服务端做了一定的压缩的,而在本地拉取后进行了解压。

3、将本地的nginxnginx:1.21.4推送至仓库

打标签 docker tag nginx:1.24.0 hzpxx/hzptest:v1.24.0

推送 docker push hzpxx/hzptest:v1.24.0

查看仓库信息

可以看到推到仓库的镜像大小为54.39M,说明服务端做了压缩

4、拉取 nginx:1.21.3,然后对其打不同标签,在依次推送到仓库。

查看仓库

这里仓库不同的只是tag,而我们推送了3次,并没有一次一次的上传,而只存了一份。这也是镜像在远端存储的共享。

如果在远端发现有相同的镜像,就把这个镜像挂载过来,或者说起个别名。这样设计的目的就是节省服务端的空间,在使用的时候又会在本地快速解压提供使用。

相关推荐
大树8815 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠15 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质15 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush415 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52016 小时前
Linux 11 动态监控指令top
linux
Inhand陈工16 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn8616 小时前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智17 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩17 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_17 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化