Docker容器技术(三)——镜像的分层结构及构建

本文深入解析Docker镜像的分层结构原理,介绍如何利用Docker从本地导入镜像、运行和修改容器,以及如何将修改后的容器保存为新镜像。探讨了镜像构建过程中的效率问题和安全隐患。

1. 镜像的分层结构

在这里插入图片描述

  • 共享宿主机的kernel
  • base镜像提供的是最小的Linux发行版
  • 同一docker主机支持运行多种Linux发行版
  • 采用分层结构的最大好处是:共享资源

比如当你已经拉取Nginx 1.17版本的镜像之后,若再次拉取Nginx 1.16 版本时,只需要下载不同的层即可,相同的层可以共享使用,这样就可以节省资源和网络带宽。当你删除其中某个镜像版本时,也只会删除掉不一样的层,因为其中共享的层另一个版本需要使用。

在这里插入图片描述

  • Copy-on-Write 可写容器层

  • 容器层以下所有镜像层都是只读的

  • docker从上往下依次查找文件

  • 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改

  • 一个镜像最多127层

2. 镜像的构建

docker commit 构建新镜像三部曲

  • 运行容器
  • 修改容器
  • 将容器保存为新的镜像

缺点:

  • 效率低、可重复性弱、容易出错
  • 使用者无法对镜像进行审计,存在安全隐患

2.1 导入本地已经下载好的镜像

docker load -i rhel7.tar

在这里插入图片描述

docker history rhel7:latest

在这里插入图片描述

2.2 运行容器

docker run -it --rm rhel7 bash		# --rm退出之后就会自动删除

在这里插入图片描述

docker ps		#显示运行容器
docker ps -a	#显示所有容器(包括停止的容器)
docker pull busybox   				#拉取一个bysybox镜像
docker history busybox:latest 		#查看busybox在开启的时候执行什么
docker run -it busybox				#运行容器

在这里插入图片描述

2.3 修改容器

上面在busybox容器中创建了几个文件,已经修改过容器,修改完毕后退出保存即可。

使用ctrl+d 退出容器,但是这样退出容器就被停止了

在这里插入图片描述

#可以通过容器ID再次启动
docker start 4b39bedf3340
docker ps
docker attach 4b39bedf3340 		#再次连接
ctrl+pq							#这样退出表示让容器在后台运行

在这里插入图片描述

在这里插入图片描述

2.4 将容器保存为新的镜像

docker commit 4b39bedf3340 busybox:v1		#保存新的镜像
docker images								#查看所有镜像
docker history busybox:latest				#查看原始镜像
docker history busybox:v1					#查看新的镜像

在这里插入图片描述
在这里插入图片描述

可以看出,新保存的V1镜像只是在原始镜像上面又追加了一层,其余镜像层和原始镜像是完全一样的,一层一层往上叠加。

docker rm -f 4b39bedf3340		#删除容器(正在运行的容器需要使用 -f 强制删除)
docker run -it --rm busybox:v1

在这里插入图片描述
可以看到,通过这种打包镜像的方法,可以将我们修改后的数据得以保存,但是这种方法不推荐,因为将数据存到镜像层里面,它的文件系统读取速度效率非常低下,将数据存储到宿主机物理磁盘中更加高效,这个后面会说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值