docker镜像是容器的基础,当每次执行docker run时就是在对docker说现在我需要哪个镜像。如果在你的docker主机上没有这个镜像,docker会自动从一个registry上下载这个镜像(默认为docker hub)

 在这一节,我们将会探讨更多的关于docker镜像的内容:

  • 管理和使用本地镜像

  • 创建基础镜像

使用docker images命令列出本地的docker镜像

[root@docker-1 ~]# docker images 
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
docker-whale          latest              05bfcfec1909        7 days ago          252.7 MB
docker/docker-whale   latest              05bfcfec1909        7 days ago          252.7 MB
nginx                 latest              e43d811ce2f4        2 weeks ago         181.4 MB
ubuntu                latest              f753707788c5        3 weeks ago         127.1 MB

你可以看到所有之前用过的镜像,同时通过列出所有镜像,我们可以知道三个很重要的信息

  • 每个镜像来自于那个仓库(repository)

  • 每个惊喜的标签是什么(tag)

  • 每个镜像的IMAGE ID

一个镜像仓库中对于一个镜像可能有多个不同的变体,比如说对于ubuntu来说,我们可能会找到Ubuntu 10.04, 12.04, 12.10, 13.04, 13.10 and 14.04这么多不同的变体,所以我们会通过一个标签(tag)来区分不同的变体,如下所示

ubuntu:14.04

所以,当你要创建一个容器时,你可以参考下面来标记镜像

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

如果你想创建一个Ubuntu 12.04的容器,请参考下面:

$ docker run -t -i ubuntu:12.04 /bin/bash

如果你没有指定标签,我们还用ubuntu举例,docker会默认使用ubuntu:latest镜像

Tip:我们应该尽量指定镜像标签,例如ubuntu:14.04,那样我们就能精确地知道我们使用的是哪个镜像,对我们后期的排查和调试会有很大帮助

现在获取一个新的镜像

$ docker pull centos

Using default tag: latest
latest: Pulling from library/centos
f1b10cd84249: Pull complete
c852f6d61e65: Pull complete
7322fbe74aa5: Pull complete
Digest: sha256:90305c9112250c7e3746425477f1c4ef112b03b4abe78c612e092037bfecc3b7
Status: Downloaded newer image for centos:latest

查找一个镜像

$ docker search sinatra
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
training/sinatra                       Sinatra training image                          0                    [OK]
marceldegraaf/sinatra                  Sinatra test app                                0
mattwarren/docker-sinatra-demo                                                                  0. . .

如果这其中有你需要的镜像,你就可以把它pull到本地了

$ docker pull training/sinatra

创建一个我们自己的镜像

我们从docker hub上下载的镜像可能不能完全满足我们的实际需要,这时候我们就需要对他做一些更新或修改了,我们主要更新或修改一个镜像的方式主要有以下两种:

  • 先用镜像创建出一个容器,然后对容器做修改,最后将容器提交(commit)为一个新的镜像

首先创建一个容器
$ docker run -t -i training/sinatra /bin/bash

root@0b2616b0e5a8:/#

在容器内安装一些需要的软件包
root@0b2616b0e5a8:/# apt-get install -y ruby2.0-dev ruby2.0

将这个容器提交为新的镜像
$ docker commit -m "Added json gem" -a "Kate Smith" \
0b2616b0e5a8 ouruser/sinatra:v2

之后通过这个镜像创建的容器就会有上面安装的软件包了
  • 可以用Dockerfile去创建一个指定的镜像

首先创建一个目录和一个Dockerfile
$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

向Dockerfile中写入指令
# This is a comment
FROM ubuntu:14.04
MAINTAINER Kate Smith <ksmith@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra

然后就可以通过build命令创建自己定制的镜像
$ docker build -t ouruser/sinatra:v2 .

Note:一个镜像最多不能超过127层,这是为了使镜像的整体大小处在一个最佳状态的全局设置