声明: 本文转自: https://baijiahao.baidu.com/s?id=1594187941922400728&wfr=spider&for=pc
感谢作者!

1.镜像

docker pull ubuntu:15.04

使用上面的命令可以下载一个ubuntu镜像,这里我没有指定仓库,默认是从Docker Hub下载。

使用下面命令查看本地镜像的信息

docker images
有一个问题:为什么docker下载的镜像只有131.3MB,而通常我们在虚拟机中安装ubuntu的镜像一般都有3个G多?

这里需要说明一个概念,传统虚拟机上面安装的镜像包含两个部分,一个是Linux内核的发行版(比如Linux3.13内核),一个是操作系统的发行版(比如说ubuntu15.04),这部分内容不包含Linux内核,但是包含Linux之外的软件管理方式,软件驱动,如 apt-get软件管理包等。内核和发行版是相对独立的,我们可能都做过这样的事:升级发行版中的内核。同样的道理相同的内核也可以对应不同的发行版,docker的镜像就是利用了这个技术。

使用docker pull ubuntu:15.04命令下载镜像时系统会出现这样的消息

在这里插入图片描述

给人的第一感觉就是镜像并不是铁板一块,好像是分成4个部分,一个一个的下载。事实也确实如此,下面就要介绍镜像的分层概念。

首先在说一下docker镜像的存储位置/var/lib/docker/,在aufs/layer/下可以看到ubuntu15.04镜像的分层,正是这四层组成了ubuntu15.04镜像。
在这里插入图片描述

在aufs/diff目录下使用 ls | xargs ls命令,下图所显示的内容相信大家都已经很熟悉了
在这里插入图片描述

有人可能已经观察到了下载时所显示的层标识和在aufs/layer/下看到的不一样,首先说一下下载时显示的ID
在这里插入图片描述

在docker 1.10之前镜像和分层数据通过一个随机产生的UUID标识,到1.10版本时docker引入了哈希值的方式,而且在1.10之前层ID与aufs/layer/下的目录名是相同的,1.10之后也变得不一样了。

镜像分层的可以使得镜像的规模变小了很多,这里通过自己创建一个镜像来说明。下面用一个简单的Dockerfile来创建镜像,将Dockerfile放到当前目录下。

Dockerfile内容:

FROM ubuntu:15.04RUN echo “hello world” > /tmp/newfile

执行docker build命令

docker build -t changed-ubuntu .

在这里插入图片描述

生成的镜像ID为769951131a6a,使用docker images查看

在这里插入图片描述

使用docker history命令查看创建了那些镜像层

docker history changed-ubuntu

在这里插入图片描述

这里可以看出新创建的changed-ubuntu镜像并不是所有的东西的是新的,它只是在原有的ubuntu15.04上增加了一层,这个层只有12B。一个镜像可以被重复利用创建新的镜像,这会使得镜像可以被高效的存储和创建。

2.容器

下面介绍一下创建一个容器的过程。

镜像是静态的,镜像的每一层都只是可读的,而容器是动态的里面运行着我们指定的应用,容器里面的应用可能会新建一个文件,修改一个目录,这些操作所带来的改变并不会作用到镜像里面,因为镜像只是可读的。所以通过镜像创建容器就是在镜像上加一个可读写的层。下面的图引用自docker docs,ID上有些不同。
在这里插入图片描述

一个镜像可创建多个容器,每个容器都有各自的一个可读写层,这些层相互独立共享下面的镜像
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐