什么是镜像

理解

  1. 可以把镜像理解成一种软件(我们通过打包形成的一种可运行的交付环境)
  2. 也可以理解成一个类,而容器就是我们通过类 新建(new)出来的一个对象

分层的镜像

docker file copy 文件夹 忽略git docker copy on write_容器


Copy-On-Write 策略

  1. 读取的时候,大家共同读取一份文件
  2. 如果需要修改,就复制一份进行修改
  1. 但是大部分是不需要修改的
  2. 这就节省了很大的空间

分层的优点

参照Copy-On-Write 策略,docker将镜像文件分为多个独立的层,当新建新的镜像的时候,只需要引用基础的镜像文件就可以,这样就会节省大量的空间

  1. 通过图片我们可以看到最顶层是容器层,只有容器层是可写的,容器层所记录的是所有的更改,如图
  2. 容器层往下的镜像层都是只读的,并不会被修改,当我们使用docker ps -s来查看的时候,结果如下,会有两列 size 和 virtual size
  1. size 表示读写层所占的大小
  2. virtual size表示读写层和只读层共同占的大小

最底层

docker file copy 文件夹 忽略git docker copy on write_容器_02

我们可以看到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后将镜像进行提交

  1. 下载Ubuntu
docker pull ubuntu
  1. 运行,并使用vim命令,我们会发现他是没有相关的命令的
  2. 安装vim
apt-get update
apt-get install vim
  1. 提交镜像
  1. 注意这里容器id的查找是运行的容器
  2. 退出ubuntu exit
  3. 提交
docker commit -m="add vim function" -a="csf" 5ee79702517 myubuntu

docker file copy 文件夹 忽略git docker copy on write_vim_03


5. 查看镜像

docker file copy 文件夹 忽略git docker copy on write_ubuntu_04


我们可以看到增加vim的ubuntu的大小增加了不少

6. 运行myubuntu

docker file copy 文件夹 忽略git docker copy on write_linux_05


我们就会发现我们可以编辑了