镜像
• 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次,并没有一次一次的上传,而只存了一份。这也是镜像在远端存储的共享。
如果在远端发现有相同的镜像,就把这个镜像挂载过来,或者说起个别名。这样设计的目的就是节省服务端的空间,在使用的时候又会在本地快速解压提供使用。