Docker镜像内有啥,存哪?

据说重要的事情要说三遍,那我再表述一下个人观点:Docker镜像是Docker的灵魂所在。

前两讲关于Docker镜像的描述,已经从宏观的角度涉及一二。一旦掌握Docker对于镜像的层级管理方式,以及Docker镜像大小的真实情况之后,再来了解Docker镜像包含的内容以及存储,就显得简单很多。

Docker镜像内容

对于Docker镜像的认识总会有第一次,自那时开始,当然也少不了成长,笔者本人的认识过程不妨和大家一起分享:

1.初次接触Docker:相信很多爱好者都会和我一样,有这样一个认识:Docker镜像代表一个容器的文件系统内容;

2.初步接触联合文件系统:联合文件系统的概念,让我意识到镜像层级管理的技术,每一层镜像都是容器文件系统内容的一部分。

3.研究镜像与容器的关系:容器是一个动态的环境,每一层镜像中的文件属于静态内容,然而Dockerfile中的ENV、VOLUME、CMD等内容最终都需要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那这部分内容Docker该如何管理?

另外,在上述第三个步骤中,还有一种情况,相信大家并不陌生:很多个镜像层大小为0,镜像层内部不存在任何文件内容。这又是怎么一回事?

大家可以回忆一下《一图看尽Docker容器文件系统内容》中,关于空镜像的生成部分,其中提到“更新镜像的 json文件”。其实,前文埋下的伏笔,即暗示了真相:Docker镜像内容由镜像层文件内容镜像json文件组成,不论静态内容还是动态信息,Docker均为将其在json文件中更新。

Docker每一层镜像的json文件,都扮演着一个非常重要的角色,其主要的作用如下:

1.记录Docker镜像中与容器动态信息相关的内容

2.记录父子Docker镜像之间真实的差异关系

3.弥补Docker镜像内容的完整性与动态内容的缺失

Docker镜像的json文件可以认为是镜像的元数据信息,其重要性不言而喻,本系列将在下一篇文章重点分析Docker镜像json文件。敬请期待。

Docker镜像存储位置

Docker镜像内容的理论分析,看着多少有些云里雾里,不论Docker镜像层的文件,还是json文件,读来都稍显乏味。倘若可以一窥Docker中的真实环境,相信对于镜像技术的理解定会有不少的帮助。

我们直奔主题,从Docker镜像的存储入手,看看这些镜像层文件内容镜像json文件分别存储于何处。(以下展示的实验环境:宿主机操作系统为ubuntu:14.04,Docker版本为1.7.1,graphdriver类型为aufs,仅包含ubuntu:14.04一个镜像)。

查看镜像层组成

我们可以通过命令docker history ubuntu:14.04查看ubuntu:14.04,结果如下:

图中显示ubuntu:14.04镜像共有4个镜像层。

镜像层文件内容存储

Docker镜像层的内容一般在Docker根目录的aufs路径下,为/var/lib/docker/aufs/diff/,具体情况如下:

图中显示了镜像ubuntu:14.04的4个镜像层内容,以及每个镜像层内的一级目录情况。需要额外注意的是:镜像层d2a0ecffe6fa中没有任何内容。

镜像json文件存储

对于每一个镜像层,Docker都会保存一份相应的json文件,json文件的存储路径为/var/lib/docker/graph,ubuntu:14.04所有镜像层的json文件存储路径展示如下:

除了json文件,大家还看到每一个镜像层还包含一个layersize文件,该文件主要记录镜像层内部文件内容的总大小。既然谈到了镜像json文件,为了给下文铺垫,以下贴出ubuntu:14.04中空镜像层d2a0ecffe6fa的json文件:

由于该镜像层的对应的Dockerfile指令为CMD,所以镜像层的内容为空,而改镜像层的json文件会更新Cmd域,获取新的Cmd值,以便后续通过该镜像运行容器时,使用更新后的Cmd。

总结

联合文件系统的使用,是Docker镜像技术的精髓,然而除此之外,对于镜像的元数据管理(即镜像json文件)打通了通过Docker镜像直接运行Docker容器的捷径。

欢迎关注[Docker源码分析]微信公众号,更多精彩即将呈现。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-13 14:51:44

Docker镜像内有啥,存哪?的相关文章

Docker镜像的创建、存出、载入

创建镜像的方法有三种:基于已有镜像的容器创建.基于本地模板导入.基于Dockerfile创建,本博文讲解前两种. 基于已有镜像的容器创建 该方法是使用docker commit命令,其命令格式为: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 主要参数选项包括: -a ,–author=”” 作者信息 -m,–message=”” 提交信息 -p,–pause=true 提交是暂停容器运行 比如,先创建一个运行bash的ubuntu容器

docker镜像存出与载入

尝试从官网上下载ubuntu镜像,太慢下载不下来. 使用daocloud加速器进行加速之后,由于公司网络不好,仍然下载不下来. 没办法,只能从别的环境上搞一个已经存在的ubuntu镜像,折腾到自己的虚拟机上. 这里就用到了Docker镜像的存储和载入的知识环节. ■Docker镜像存出: 例如:存储本地的ubuntu:latest镜像为文件ubuntu_latest.tar 命令:docker save 命令样例:docker save -o docker_io_ubuntu_latest.ta

Docker的centos镜像内无法使用systemctl命令的解决办法

在Docker官方的centos镜像内无法使用systemctl命令的解决办法, 使用该命令docker报错 Failed to get D-Bus connection: Operation not permitted 解决办法: 运行容器时添加参数 --privileged=true /usr/sbin/init 完成的启动命令为: docker run -itd --name centos7 --privileged=true centos /usr/sbin/init 原文地址:http

第四章 使用Docker镜像和仓库

第4章 使用Docker镜像和仓库 回顾: 回顾如何使用 docker run 创建最基本的容器 $sudo docker run -i -t --name another_container_mum ubuntu /bin/bash [email protected]:/# 这条命令会启动一个新的名为 another_container_mum 的容器,这个容器基于ubuntu镜 像并且会启动Bash Shell ----------------------------------------

Docker源码分析(九):Docker镜像

1.前言 回首过去的2014年,大家可以看到Docker在全球刮起了一阵又一阵的“容器风”,工业界对Docker的探索与实践更是一波高过一波.在如今的2015年以及未来,Docker似乎并不会像其他昙花一现的技术一样,在历史的舞台上热潮褪去,反而在工业界实践与评估之后,显现了前所未有的发展潜力. 究其本质,“Docker提供容器服务”这句话,相信很少有人会有异议.那么,既然Docker提供的服务属于“容器”技术,那么反观“容器”技术的本质与历史,我们又可以发现什么呢?正如前文所提到的,Docke

docker 四.使用docker镜像.

四.Docker镜像的使用 一.Docker 安装 1.1  查看系统版本 [[email protected] ~]# cat /etc/redhat-release CentOS release 6.6 (Final) 1.2 使用epel yum源 [[email protected]~]#rpm -ivh http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm 1.3安装docker [[email prote

Docker学习笔记(2)-docker镜像操作

本节将会涉及Docker的镜像操作. 1. 获取镜像 如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签],具体可通过docker pull --help命令查看. Docker镜像仓库地址的格式一般为<域名/IP>[:端口号],仓库名一般为两段式名称,即<用户名>/<软件名>,对于Docker Hub,默认的用户名为library

Docker 镜像操作

概念 image 镜像: 层叠的只读文件系统,比如有Linux针对于docker而创建的最小的镜像,和其他共享的镜像.简言之就是系统镜像文件.利用面向对象的思想,可以认为image就是一个类,而容器就该类的一个实例. Docker镜像的层次如下: 最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文 件系统.Dockei?用户几乎永远不会和引导文件系统有什么交互.实际上,当一个容器启动 后,它将会被移到内存中,而引导文件系统则会被卸载(unmount),以留出更多的

Docker教程系列二:Docker镜像操作

1什么是Docker镜像 Docker镜像是由文件系统叠加而成(是一种文件的存储形式).最底端是一个文件引导系统,即bootfs,这很像典型的Linux/Unix的引导文件系统.Docker用户几乎永远不会和引导系统有什么交互.实际上,当一个容器启动后,它将会被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供磁盘镜像使用.Docker容器启动是需要的一些文件,而这些文件就可以称为Docker镜像. 2列出镜像 列出docker下的所有镜像:docker images l  REPOSI