从总体的角度来说,一个完整的Docker镜像能够支撑一个Docker容器的运行,在 Docker容器运行过程当中主要提供文件系统视角。例如一个ubuntu:14.04的镜像,提供了一个基本的ubuntu:14.04的发行版,固然此 镜像是不包含操做系统Linux内核的。mysql
说到此,可能就须要注意一下,linux内核和ubuntu:14.04Docker镜像的区别了。传统虚拟机安装ubuntu:14.04会包含两部分,第一,某一个Linux内核的发行版本,好比Linux 3.8版本的内核;第二,第一个特定的Ubuntu发行版,这部份内容不包含Linux内核,可是包含Linux以外的软件管理方式,软件驱动,如 apt-get软件管理包等。linux
理解以上内容以后,就能够理解,为何在一个Linux内核版本为3.8的ubuntu:14.04基础上,能够把Linux内核版本升级到3.18,而ubuntu的版本依然是14.04。最主要的就是:Linux内核版本与ubuntu操做系统发行版之间的区别。golang
Linux内核+ubuntu操做系统发行版,组成一台工做的机器让用户体验。那么灵活替换ubuntu操做系统发行版,那是否是也能够实现呢。那么Docker很方便的利用了这一点,技术手段就是Docker镜像。sql
Docker的架构中,Docker镜像就是相似于“ubuntu操做系统发行版”,可 以在任何知足要求的Linux内核之上运行。简单一点有“Debian操做系统发行版”Docker镜像、“Ubuntu操做系统发行版”Docker镜 像;若是在Debian镜像中安装MySQL 5.6,那咱们能够将其命名为Mysql:5.6镜像;若是在Debian镜像中安装有Golang 1.3,那咱们能够将其命名为golang:1.3镜像;以此类推,你们能够根据本身安装的软件,获得任何本身想要的镜像。docker
那么镜像最后的做用是什么呢?很好理解,回到Linux内核上来运行,经过镜像来运行时咱们经常将提供的环境称为容器。json
以上内容是从宏观的角度看看Docker镜像是什么,咱们再从微观的角度进一步深刻 Docker镜像。刚才提到了“Debian镜像中安装MySQL 5.6,就成了mysql:5.6镜像”,其实在此时Docker镜像的层级概念就体现出来了。底层一个Debian操做系统镜像,上面叠加一个 mysql层,就完成了一个mysql镜像的构建。层级概念就不难理解,此时咱们通常debian操做系统镜像称为mysql镜像层的父镜像。ubuntu
层级管理的方式大大便捷了Docker镜像的分发与存储。说到分发,你们天然会联想到 Docker镜像的灵活性,传输的便捷性,以及高超的移植性。Docker Hub,做为全球的镜像仓库,做为Docker生态中的数据仓库,将全世界的Docker数据汇聚在一块儿,是Docker生态的命脉。架构
Docker有两方面的技术很是重要,第一是Linux 容器方面的技术,第二是Docker镜像的技术。从技术自己来说,二者的可复制性很强,不存在绝对的技术难点,然而Docker Hub因为存在大量的数据的缘由,致使Docker Hub的可复制性几乎不存在,这须要一个生态的营造。spa
大体介绍了Docker镜像是什么,咱们来看看Docker镜像中有哪些内容?操作系统
介绍以前,我先分享一下,我我的在接触Docker的两年时间中,对Docker镜像内容认识的变化。
第一阶段:初步接触Docker。相信不少爱好者都会和我同样,有这样一个认识:Docker 镜像表明一个容器的文件系统内容;
第二阶段:初步接触联合文件系统。联合文件系统的概念,让我意识到镜像层级管理的技术,每一层镜像都是容器文件系统内容的一部分。
第三阶段:研究镜像与容器的关系:容器是一个动态的环境,每一层镜像中的文件属于静态内 容,然而 Dockerfile 中的 ENV、VOLUME、CMD 等内容最终都须要落实到容器的运行环境中,而这些内容均不可能直接坐落到每一层镜像所包含的文件系统内容中,那此时每个Docker镜像还会包含 json文件记录与容器之间的关系。
所以,Docker镜像的内容主要包含两个部分:第一,镜像层文件内容;第二,镜像json文件。
既然是说镜像存储的位置,那么应该包含:镜像层文件和镜像json文件。如一个ubuntu:14.04镜像,包含4个镜像层,在aufs存储驱动的状况下,在磁盘上的状况能够如如下图所示:
咱们能够经过命令 docker history ubuntu:14.04 查看 ubuntu:14.04,结果以下:
Docker 镜像层的内容通常在 Docker 根目录的 aufs 路径下,为 /var/lib/docker/aufs/diff/,具体状况以下:
图中显示了镜像 ubuntu:14.04 的 4 个镜像层内容,以及每一个镜像层内的一级目录状况。须要额外注意的是:镜像层 d2a0ecffe6fa 中没有任何内容,也就是所谓的空镜像。
对于每个镜像层,Docker 都会保存一份相应的 json 文件,json 文件的存储路径为 /var/lib/docker/graph,ubuntu:14.04 全部镜像层的 json 文件存储路径展现以下:
除了 json 文件,你们还看到每个镜像层还包含一个 layersize 文件,该文件主要记录镜像层内部文件内容的总大小。既然谈到了镜像 json 文件,为了给下文铺垫,如下贴出 ubuntu:14.04 中空镜像层 d2a0ecffe6fa 的 json 文件: