4.镜像和容器的

镜像

镜像可以理解为一个包含应用程序和其相关依赖的一个基础文件系统,在Docker容器启动的过程中,以只读的方式被用于创建容器的运行环境。

Docker镜像是由一组镜像层依次挂载而的来的,每个镜像层对应上一个镜像层的修改,这样修改其实是发生在容器运行过程中的,所以反过来理解的话,镜像是对容器运行环境进行持久化存储的结果

对于每一个记录文件系统修改的镜像层来说,都有一个由Docker生成的Hash码,是一个64长度的字符串,全球唯一。通过唯一编码能够区分不同的镜像层并能保证它们的内容和编码是进行对应的,这带来了另外一个好处就是运行在镜像之间共享镜像层。举⼀个实际的例⼦,由 Docker 官⽅提供的两个镜像 elasticsearch 镜像和 jenkins 镜像都是在 openjdk 镜像之上修改⽽得,那么在我们实际使⽤的时候,这两个镜像是可以共⽤ openjdk 镜像内部的镜像层的。这样一来就可以让共用一些存储空间,达到1+1<2的效果。

查看镜像
查看当前Docker服务存储的镜像。通过此命令可以看到镜像的 ID ( IMAGE ID)、构建时间 ( CREATED )、占⽤空间 ( SIZE ) 等数据,需要注意的是ID并不会显示全部的64个字符,而是只显示前12个

docker images

容器的生命周期

在这里插入图片描述
容器的状态分为:Created、Running、Paused、Stopped、Deleted。
Created:容器已经被创建,容器所需的相关资源已经准备就绪,但容器中的程序还未处于运⾏状态。
Running:容器正在运⾏,也就是容器中的应⽤正在运⾏。
Paused:容器已暂停,表⽰容器中的所有程序都处于暂停 ( 不是停⽌ ) 状态。
Stopped:容器处于停⽌状态,占⽤的资源和沙盒环境都依然存在,只是容器中的应⽤程序均已停⽌。
Deleted:容器已删除,相关占⽤的资源及存储在 Docker 中的管理信息也都已释放和移除。

主进程
容器的生命周期其实与容器中PID为1的进程息息相关。当启动容器时,容器会按照镜像中的定义启动相关的程序,并将这个程序的主进程设置为容器的主进程(也就是PID为1的进程),当要停止容器时,容器会向主进程发送信号,通知程序停止。虽然在Docker中,一个容器也可以运行不同类型的程序,但这么做的话容器就无法跟踪不同应用的生命周期,容易造成应用的非正常关闭。最佳方式就是遵循Docker的设计理念,容器即应用,应用即容器的虚拟化方式。
写时复制机制
在编程,写时复制通常发生在对象或者数组的拷贝中,当我们要拷贝时候,复制的过程并不是马上发生在内存中,而是先把两个变量指向同一个内存空间,当要对对象或者数组修改时,才发生拷贝。

Docker的写时复制和编程相似,也就是在通过Docker运行容器时,并不是把镜像中所有内容马上复制到容器所运行的沙盒文件系统中,⽽是利⽤ UnionFS 将镜像以只读的⽅式挂载到沙盒⽂件系统中。只有在容器中发⽣对⽂件的修改时,修改才会体现到沙盒环境上。也就是说容器的创建和启动不需要进行任何文件系统的复制操作,也不需要单独开辟大量的硬盘空间。Docker的写时复制既保证了镜像在创建容器以及容器在运行的过程中不会对自身造成修改,又避免了常见虚拟化在初始时需要从镜像中复制整个文件系统,从而大幅度提高了容器的创建和启动速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值