Docker镜像

Docker镜像

  • 什么是镜像
    • 为什么需要镜像
  • 镜像命令
    • docker rmi
    • docker save
    • docker load
    • docker history
    • docker image prune
  • 实战案例
    • 镜像跨服务器迁移
    • 镜像的压缩存储

什么是镜像

docker镜像是一个特殊的文件系统,它提供了容器运行时需要的操作系统环境,程序,库,资源,配置文件以及环境变量等。
docker镜像是分层存储的,所以docker镜像是由多层的文件系统功能构成。镜像在构建时是一层一层的构建的,下一层是上一层的基础,本层的修改只会影响到本层不会影响到下一层。并且分层的结构能够使得每一层的的文件系统得到复用,例如跑的两个应用对应的docker 镜像的最底层的文件系统都是Centos系统,在系统中这一层的文件只需存储一份就足够了。
docker镜像的多层文件系统都是只读的,在容器运行时会在docker 镜像的最上层新建一个容器层,这个容器层是可读可写的。

Docker镜像_第1张图片

为什么需要镜像

避免生产环境和开发环境不同而导致的一系列问题,在实际的开发中,经常遇到的一个问题就是在开发环境中写好的程序,到了线上就会出现各种奇怪的问题,这就是环境的不同引发的一系列问题。而docker恰好能够解决这个问题,我们可以将程序运行所需要的环境,库,资源,配置文件,统一打包成一个docker 镜像,实际程序在运行的时候是运行在这个docker 容器中的,把这个docker 镜像放到任何环境中启动成为一个docker 容器,容器中的程序所需的各种环境都是一样的,也就是说程序运行在docker容器中,docker容器提供了程序运行的所有必要条件,屏蔽了外部环境的差异。

镜像命令

docker rmi

docker rmi [OPTIONS] IMAGE [IMAGE...] 
#常用选项
-f : 强制删除
--no-trunc : 不移除该镜像的过程镜像,默认移除

删除没有使用的镜像
Docker镜像_第2张图片
删除正在使用的镜像
Docker镜像_第3张图片
可以看到docker rmi删除nginx:1.24.0时并没有将这个镜像删掉,而是将nginx:1.24.0这个标签删除了(Untagged),也就是说这个镜像还是存在的只是删除了它的一个标签,当删除该镜像的最后一个标签时如果有容器正在使用这个镜像,那么就会报错,像下面这样:
在这里插入图片描述

报错的信息是有容器正在使用这个镜像,不能删除。那终止使用此镜像的容器呢?

Docker镜像_第4张图片

仍然报错说,有容器正在使用该镜像,不能删除。

在这里插入图片描述
在这里插入图片描述
可以看到,曾经退出的许多容器使用了nginx:1.24.0的镜像,如果想删除此镜像就要把这些已经退出的镜像删除掉(docker rm)

Docker镜像_第5张图片

docker save

将docker镜像保存为tar归档文件。

docker save [OPTIONS] IMAGE [IMAGE...] 
#常用参数
-o : 指定输出文件

Docker镜像_第6张图片

docker load

将镜像的tar归档文件导出为镜像。

docker load [OPTIONS] 
#常用选项
-i : 指定导入文件
-q : 精简输出信息

将nginx-1.24.0.tar文件导出为一个nginx镜像
在这里插入图片描述

docker save 和docker load 通常用于跨主机的镜像的拷贝。

docker history

查看镜像的历史。

docker history [OPTIONS] IMAGE 
#常用选项
-H : 大小和时间采用人易读的方式 (默认方式)
--no-trunc : 显示全部信息,不隔断
-q : 静默模式,只显示id信息

Docker镜像_第7张图片
从上图就可以看出docker 镜像是分层的结构

docker image prune

删除全部悬空镜像。

docker image prune [OPTIONS] 
#常用选项
-a : 删除所有不适用的镜像
--filter : 加筛选条件
-f : 不提示是否删除

Docker镜像_第8张图片

删除96小时前创建的未使用的所有的镜像
Docker镜像_第9张图片

实战案例

镜像跨服务器迁移

在Ubuntu服务器上将busybox镜像使用docker save 形成tar归档文件,通过scp指令传输给另一台Centos服务器,在Centos服务器上恢复busybox镜像并运行busybox容器。

1.形成tar归档文件
在这里插入图片描述

2.使用scp指令将mybusybox.tar传输到Centos机器上
在这里插入图片描述
3.在Centos机器上进行镜像的恢复
Docker镜像_第10张图片
4.在Centos机器上运行busybox容器
Docker镜像_第11张图片

镜像的压缩存储

Docker镜像_第12张图片
Docker镜像_第13张图片

可以观察到同一个nginx镜像,在docker hub这个docker registry服务器上所占的空间是比较小的,这是因为镜像在docker registry上存储时是压缩存储的,这样可以提高服务器的资源利用率。当我们拉取镜像的时候,拉取到本地后会做一个解压操作,使得我们本地的镜像并不是压缩后的镜像。

同一个镜像在docker registry上只会存储一份

Docker镜像_第14张图片

在我的docker hub的testrepos仓库中已经有了一份nginx:1.24.0的镜像了,这次在push的时候显示将这个镜像从testrepos仓库挂载到testregistry仓库中,并没有做真正的上传操作。

Docker镜像_第15张图片

将这个nginx:1.24.0镜像的所有标签都push到testregistry仓库中,这里显示仓库中已经存在这个镜像了。

Docker镜像_第16张图片
这四个不同标签的nginx镜像,本质都是一个镜像,只是起了4个不同的名字而已。

你可能感兴趣的:(docker,docker,容器,运维)