Docker学习之路(五)镜像的基本操作

693 查看

什么是镜像

Docker镜像时由文件系统叠加而成,最底端是一个引导文件系统,即bootfs,这很像典型的Linux/Unix的引导文件系统。Docker用户几乎永远不会和引导文件系统有交互。实际上,当一个容器启动后,他将会被移到内存中,而引导文件系统则会被卸载(unmount),以流出更多的内存供initrd磁盘镜像使用。

目前,Docker看起来还很像一个典型的Linux虚拟化栈。实际上,Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上,rootfs可以是一种或多种操作系统(如Debian、Ubuntu)。

在传统的linux引导过程中,root文件系统会最先以只读的方式家长,当引导结束并完成完整性检查之后,他才会被切换成读写模式。但是Docker里,root文件系统永远只是只读状态,并且Docker利用联合加载(union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载指的是一次同时加载多个文件系统,但是在外面看起来只能看到一个文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有底层的文件和目录。

Docker将这样的文件系统成为镜像。一个镜像可以放到另一个京广线的顶部,位于下面的镜像称为父镜像(parent image),最底部的称为基础镜像(base image)。

简单来说,Docker 镜像就是一个只读的模板。例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。

镜像是Docker生命周期中的“构建”部分,可以用来创建 Docker 容器。

Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,可以当做容器的“源代码”,它体积很小,便于分享、存储、更新。用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

镜像是基于联合(union)文件系统的一种层式的结构,由一系列指令一步步构建处理。例如:

  • 添加一个文件
  • 执行一个命令
  • 打开一个端口

当从以镜像期待容器时,Docker会在该镜像的最顶层加载一个读写文件系统。想在Docker中运行的程序就是在这个读写层中执行的。

列出镜像

docker images命令:

$ sudo docker images

在列出信息中,可以看到几个字段信息:

  • 来自于哪个仓库,比如 ubuntu
  • 镜像的标记,比如 14.04
  • 它的 ID 号(唯一)
  • 创建时间
  • 镜像大小

其中镜像的 ID 唯一标识了镜像,注意到 ubuntu:14.04ubuntu:trusty 具有相同的镜像 ID,说明它们实际上是同一镜像。

TAG 信息用来标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,例如12.0412.1013.0414.04 等。

下面的命令指定使用镜像 ubuntu:14.04 来启动一个容器。

$ sudo docker run -t -i ubuntu:14.04 /bin/bash

如果不指定具体的标记,则默认使用 latest 标记信息。

本地镜像都保存在Docker宿主机的/var/lib/docker目录下。每个镜像都保存在Docker所采用的存储驱动目录下。也可以在/var/lib/docker/containers目录下面看到所有的容器。

拉取镜像

使用docker run命令启动一个镜像时,Docker会检查本地是否存在该镜像。如果本地没有该镜像的话,就好链接官方维护的Docker Hub Registy,查看Docker Hub中是否有该镜像,有的话就下载下来。如果没有指定具体的镜像标签,则会下载latest标签的镜像。例如:

$ sudo docker run -i -t ubuntu /bin/bash

也可以通过pull命令预先拉取镜像到本地,可以节省从一个新镜像启动一个容器的世界。

拉取一个Fedora基础镜像的例子:

$ sudo docker pull fedora

查找镜像

docker search命令查找所有Docker Hub上公共的可用镜像:

$ sudo docker search puppet

返回了以下信息:

  • 仓库名
  • 镜像描述
  • 用户评价(Stars)——反映镜像的受欢迎程度
  • 是否官方(official)
  • 自动构建(Automated)——表示这个镜像时由Docker Hub的自动构建流程(Automated Build)创建的。

也可以到Docker Hub网站上在线查找可用镜像。


【本人的学习笔记,主要是对《我的第一本Docker书》、《Docker —— 从入门到实践》的学习记录,引用了很多书上的话和例子,并结合其他各种资源的学习。我使用的是windows 7, docker 1.3.2。】