我眼中的 Docker(二)Image

Docker 安装

如何安装 docker 详见官网: installation 或者 中文指南. 不过 linux 上我推荐用 curl 安装,因为 apt-get 中源要么没有 docker,要么版本较低。

$ sudo apt-get install curl$ sudo curl -sSL https://get.docker.com/ | sh$ sudo docker run hello-world

最后一个命令成功的话说明 docker 可以正常运行。 然而因为中国显而易见的国情原因,推荐还是使用 DaoCloud 服务安装吧:

# curl -sSL https://get.daocloud.io/docker | sh

好了之后最好配置一下 DaoCloud 的加速服务(加速器),即设置 mirror:

$ echo “DOCKER_OPTS=\”\$DOCKER_OPTS –registry-mirror=http://f9495414.m.daocloud.io\”” | sudo tee -a /etc/default/docker$ sudo service docker restartImage 命令

Image 是 docker 的基石,命令的介绍可以直接看官方文档: doc 常用命令有:

sudo docker imagessudo docker pull hello-worldsudo docker tag hello-world myname/hello-worldsudo docker push myname/hello-worldsudo docker search ubuntusudo docker rmi hello-worldsudo docker images | grep “<none>” | tr -s ‘ ‘ | cut -f3 -d ” ” | sudo parallel docker rmi {}Image 组成

Image 是一个可运行的基本单元,那么当我们运行 docker images 时,显示出来的一个个 image 究竟是什么?

Image 里面是一层层文件系统,叫做 Union FS,联合文件系统,可以将几层目录挂载到一起,成为同一个虚拟文件系统。文件系统的目录结构就像普通 linux 的目录结构一样,docker 通过这些文件与宿主机的内核提供了一个 linux 的虚拟环境。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。

构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层修改,增加了一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。结构类似这样:

从基本的看起,一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成,bootfs(boot file system) 主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉。 rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件。见下图,就是 docker image 中最基础的两层结构:

不同的 linux 发行版(如 ubuntu 和 CentOS ) 在 rootfs 这一层会有所区别,体现发行版本的差异性:

传统的 Linux 加载 bootfs 时会先将 rootfs 设为 read-only,然后在系统自检之后将 rootfs 从 read-only 改为 read-write,然后我们就可以在 rootfs 上进行读写操作了。但 Docker 在 bootfs 自检完毕之后并不会把 rootfs 的 read-only 改为 read-write,而是利用 union mount(UnionFS 的一种挂载机制)将 image 中的其他的 layer 加载到之前的 read-only 的 rootfs 层之上,每一层 layer 都是 rootfs 的结构,并且是read-only 的。所以,我们是无法修改一个已有镜像里面的 layer 的!只有当我们创建一个容器,也就是将 Docker 镜像进行实例化,系统会分配一层空的 read-write 的 rootfs ,用于保存我们做的修改。一层 layer 所保存的修改是增量式的,就像 git 一样。

Image 结构

假如我们有一个 ubuntu:14.04 的镜像,那么我们可以把它保存成 tar 文件,观察一下:

~ sudo docker save -o ubuntu_image.tar ubuntu:14.04 ~ tar -tf ubuntu_image.tar 428b411c28f0c33e561a95400a729552db578aee0553f87053b96fc0008cca6a/428b411c28f0c33e561a95400a729552db578aee0553f87053b96fc0008cca6a/VERSION428b411c28f0c33e561a95400a729552db578aee0553f87053b96fc0008cca6a/json428b411c28f0c33e561a95400a729552db578aee0553f87053b96fc0008cca6a/layer.tar435050075b3f881611b0f4c141bb723f38603caacd31a13a185c1a38acfb4ade/435050075b3f881611b0f4c141bb723f38603caacd31a13a185c1a38acfb4ade/VERSION435050075b3f881611b0f4c141bb723f38603caacd31a13a185c1a38acfb4ade/json435050075b3f881611b0f4c141bb723f38603caacd31a13a185c1a38acfb4ade/layer.tar6d4946999d4fb403f40e151ecbd13cb866da125431eb1df0cdfd4dc72674e3c6/6d4946999d4fb403f40e151ecbd13cb866da125431eb1df0cdfd4dc72674e3c6/VERSION6d4946999d4fb403f40e151ecbd13cb866da125431eb1df0cdfd4dc72674e3c6/json6d4946999d4fb403f40e151ecbd13cb866da125431eb1df0cdfd4dc72674e3c6/layer.tar9fd3c8c9af32dddb1793ccb5f6535e12d735eacae16f8f8c4214f42f33fe3d29/9fd3c8c9af32dddb1793ccb5f6535e12d735eacae16f8f8c4214f42f33fe3d29/VERSION9fd3c8c9af32dddb1793ccb5f6535e12d735eacae16f8f8c4214f42f33fe3d29/json9fd3c8c9af32dddb1793ccb5f6535e12d735eacae16f8f8c4214f42f33fe3d29/layer.tarrepositories失败是成功之母

我眼中的 Docker(二)Image

相关文章:

你感兴趣的文章:

标签云: