一、镜像的分层结构
docker共享宿主机内核,镜像中共享的是根文件系统,而镜像的分层结构则是为了共享资源
1. docker采用镜像分层的目的
- 每个软件都是基于某个镜像去运行的,因此一旦某个底层环境出现问题,就不需要去修改全部基于该镜像的软件的镜像,只需要修改底层环境的镜像。
- 共享资源,其它相同环境的软件镜像都共同去享用同一个环境镜像,而不需要每个软件镜像要去创建一个底层环境。
2. docker共享主机的内核
hostnamectl #查看宿主机版本
docker load -i ubuntu.tar
docker run -it --name vm2 ubuntu #创建并运行容器,-it交互式运行
uname -r #查看创建容器的内核,与宿主机一致
3. 镜像层的生成
docker rm -f vm1 #删除容器
docker run -it --name vm1 ubuntu #交互式运行vm1容器
touch file{1..10}
ctrl+d退出交互环境
docker commit vm1 ubuntu:v1 #将此容器重新打包为一个镜像(起别名)
docker history ubuntu #查看镜像构造历史
docker history ubuntu:v #多一层镜像层
在底层环境的基础上,通过commit命令可以使docker容器继续在底层环境上构建镜像层。容器以下的所有镜像层都是只读的,docker查找文件时是从上往下依次查找,容器层用来保存镜像变化的部分,并不会对镜像本身进行任何修改,一个镜像最多可以有127层,docker容器进行可写时,是在可写容器层进行可写动作,经底层镜像层的文件会复制到可写层在执行删除、创建等动作
二、Dockerfile实现镜像的封装
构建镜像的过程:运行容器、修改容器和将容器保存为新的镜像
构建镜像的缺点:效率低、可重复性弱、容易出错;使用者无法对镜像进行审计,存在安全隐患
1. 简单镜像的构建