什么是镜像
理解
- 可以把镜像理解成一种软件(我们通过打包形成的一种可运行的交付环境)
- 也可以理解成一个类,而容器就是我们通过类 新建(new)出来的一个对象
分层的镜像
Copy-On-Write 策略
- 读取的时候,大家共同读取一份文件
- 如果需要修改,就复制一份进行修改
- 但是大部分是不需要修改的
- 这就节省了很大的空间
分层的优点
参照
Copy-On-Write 策略
,docker将镜像文件分为多个独立的层,当新建新的镜像的时候,只需要引用基础的镜像文件就可以,这样就会节省大量的空间
- 通过图片我们可以看到最顶层是容器层,只有容器层是可写的,容器层所记录的是所有的更改,如图
- 容器层往下的镜像层都是只读的,并不会被修改,当我们使用
docker ps -s
来查看的时候,结果如下,会有两列 size 和 virtual size
- size 表示读写层所占的大小
- virtual size表示读写层和只读层共同占的大小
最底层
我们可以看到docker的最底层是一个aufs
aufs
他是一种UnionFS(联合文件系统),他会将不同的目录挂载到同一个虚拟文件系统下
- docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统
UnionFS
- 其中bootfs(boot file system)主要包含bootloader和kernel
- bootloader主要是引导加载kernel
- Linux刚启动时会加载bootfs文件系统
- 当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
rootfs
- 包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件
- rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等
提交
提交之后会成为一个新的镜像,用新的镜像来新建容器,那么就会有新的镜像具有的功能
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
- 要创建的目标镜像名必须都是小写的英文字母
例子
docker下载的ubuntu是没有vim的,我们下载vim后将镜像进行提交
- 下载Ubuntu
docker pull ubuntu
- 运行,并使用vim命令,我们会发现他是没有相关的命令的
- 安装vim
apt-get update
apt-get install vim
- 提交镜像
- 注意这里容器id的查找是运行的容器
- 退出ubuntu
exit
- 提交
docker commit -m="add vim function" -a="csf" 5ee79702517 myubuntu
5. 查看镜像
我们可以看到增加vim的ubuntu的大小增加了不少
6. 运行myubuntu
我们就会发现我们可以编辑了