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