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次,并没有一次一次的上传,而只存了一份。这也是镜像在远端存储的共享。

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

相关推荐
苹果醋33 小时前
java设计模式之责任链模式
java·运维·spring boot·mysql·nginx
m0_534875053 小时前
Ditto局域网同步功能实现宿主机和VMware虚拟机之间的复制粘贴共享
linux·运维·服务器
甲虫机4 小时前
超详细教程--电脑同时使用内网和外网上网
运维·服务器·网络
RisunJan4 小时前
Linux命令-hdparm命令(获取和设置硬盘参数)
linux·运维·服务器
骄傲的心别枯萎4 小时前
RV1126 NO.58:ROCKX+RV1126人脸识别推流项目之读取人脸数据库并保存到map
linux·数据库·计算机视觉·音视频·rv1126
维度攻城狮4 小时前
宿主机休眠后再启动,vmware虚拟机中Ubuntu系统无法联网问题解决办法
运维·服务器·ubuntu·vmware
羑悻的小杀马特4 小时前
【Linux篇章】再续传输层协议TCP:用技术隐喻重构网络世界的底层逻辑,用算法演绎‘网络因果律’的终极推演(通俗理解TCP协议,这一篇就够了)!
linux·网络·后端·tcp/ip·tcp协议
博语小屋4 小时前
Socket 编程TCP:多线程远程命令执行
linux·网络·c++·网络协议·tcp/ip
BAOYUCompany4 小时前
数字心脏|暴雨服务器再次成功交付永州市脑科医院
运维·服务器