文章目录
镜像的概念
容器解决应用开发、测试和部署的问题,而镜像解决应用部署环境问题。镜像是一个只读的容器模板,打包了应用程序和应用程序所依赖的文件系统以及启动容器的配置文件,是启动容器的基础。镜像所打包的文件内容就是容器的系统运行环境——rootfs(根文件系统或根目录)。容器与镜像类似对象与类的关系。
Docker镜像原理
- 分层: Docker镜像采用分层的方式构建,每一个镜像都由一组镜像组合而成。每一个镜像层都可以被需要的镜像所引用,实现了镜像之间共享镜像层的效果。这样的分层设计在镜像的上传与下载过程当中有效的减少了镜像传输的大小,在传输过程当中本地或注册中心只需要存在一份底层的基础镜像层即可,真正被保存和下载的内容是用户构建的镜像层。而在构建过程中镜像层通常会被缓存以缩短构建过程。
- 写时复制:底层镜像层在多个容器间共享,每个容器启动时不需要复制一份镜像文件,而是将所有需要的镜像层以只读的方式挂载到一个挂载点,在只读层上再覆盖一层读写层。在容器运行过程中产生的新文件将会写入到读写层,被修改过的底层文件会被复制到读写层并且进行修改,而老文件则被隐藏。
- 联合挂载:docker采用联合挂载技术,在同一个挂载点同时挂载多个文件系统,从而使得容器的根目录看上去包含了各个镜像层的所有文件。
LowerDir:被引用的镜像层,该层所有内容均为只读。
UpperDir:容器启动之后,创建的读写层。
Merged:容器启动后,会将LowerDir的所有条目的所有文件连同UpperDir的内容,一起挂载到Merged,从而形成一个完成的根目录。 - 内容寻址:根据镜像层内容计算校验和,生成一个内容哈希值,并使用该值来充当镜像层ID、索引镜像层。内容寻址提高了镜像的安全性,在pull、push和load、save操作后检测数据的完整性。另外基于内容哈希来索引镜像层,对于来自不同构建的镜像层,只要拥有相同的内容哈希值,就能被不同的镜像所引用。
Docker镜像关键概念
registry:注册中心,用来保存docker镜像,其中包括镜像的层次结构和关于镜像的元数据。
repository:仓库,即由具有某个功能的Docker镜像的所有迭代版本构成的镜像组。
manifest:Docker镜像元数据文件,在pull、push、save和load中作为镜像结构和基础信息的描述文件。在镜像被pull或者load到Docker宿主机时,manifest被转化为本地的镜像配置文件config。
image:镜像,用来存储一组相关的元数据信息,主要包括镜像的架构(如amd64)、镜像默认配置信息、构建镜像的容器配置信息、包含所有镜像层的rootfs。
layer:镜像层,是docker用来管理镜像的中间概念,镜像是由镜像层组成的,单个镜像层可以被多个镜像和容器共享。
dockerfile:是一个镜像制作过程的定义,文档包含了镜像制作的所有命令和完整操作流程。
Docker镜像分层和联合挂载
nginx 镜像为例。
运行一个nginx容器 :
docker run -d -p 81:80 --name mynginx1 nginx:latest
以shell终端访问该容器,目的直观的看到该容器下的文件目录 :
docker exec -it mynginx1 /bin/bash
docker save 保存镜像到宿主机归档文件 :
docker save -o nginx/nginx.tar nginx:latest
解压归档文件 :
tar vxf nginx/nginx.tar
查看manifest:
vim manifest.json
查看每一层的文件内容,json等 ,将运行的容器提交为镜像,重复以上的动作,对比两个镜像的差别,可以看出镜像层被复用的现象。
示例:
fly@fly:~$ docker run -d -p 81:80 --name mynginx nginx:latest
da4147207506f72e4f55e60a3689cc49d056872d953625738d3f6393e6af06a2
fly@fly:~$ docker exec -it mynginx /bin/bash
root@da4147207506:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@da4147207506:/# exit
exit
fly@fly:~$ docker save -o mynginx.tar nginx:latest
fly@fly:~$ tar vxf mynginx.tar
26550d9930d0bdd2810a51691f8c542a911ddb05aabd0698367d594e4901cbc1/
26550d9930d0bdd2810a51691f8c542a911ddb05aabd0698367d594e4901cbc1/VERSION
26550d9930d0bdd2810a51691f8c542a911ddb05aabd0698367d594e4901cbc1/json
26550d9930d0bdd2810a51691f8c542a911ddb05aabd0698367d594e4901cbc1/layer.tar
4088c9d8c670d11ccdfac71d5ee7413ed9