原文出自:http://blog.csdn.net/anxpp/article/details/52464806

123

    上一篇文章也说了,镜像是Docker三大核心概念之一。

    Docker运行容器前需要本地存在对应的镜像,如果本地不存在,会尝试从默认(Docker Hub)的镜像仓库获取,也可以配置使用自定义的镜像仓库。

    1、获取镜像

    镜像是Docker的基础,运行容器的前提。

    可以使用命令从网络上下载镜像,命令如下(如果不是Root用户需要在命令前加上sudo命令):

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker pull NAME[:TAG]  

    如果不显示的指定TAG,会默认选择latest标签的镜像下载。

 

    比如要下载一个最新的ubuntu镜像:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker pull ubuntu  

    这里实际上下载的是latest标签的镜像,上面的命令等同于:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker pull ubuntu:latest  

    下载过程会看到镜像文件实际是又多个层组成的,每行最前面的内容就是这层的ID。

 

    层(Layer)是AUFS(一种联合文件系统)中的重要概念,是实现增量保存于更新的基础。

    如果需要下载指定版本的镜像,可以如下:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker pull ubuntu:14.04  

    如果想从指定的注册服务器的仓库下载镜像,可以像下面这样:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker pull registry.hub.docker.com/ubuntu:latest  

    下载完成后就可以启动了:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker -t -i ubuntu /bin/bash  

    这里的命令后面会解释。

 

   2、 查看镜像信息

    docker image命令可以列出本地已有的所有镜像:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker inages  

    显示的字段分别表示:

 

    1、来自于哪个仓库

    2、镜像的标签信息

    3、镜像的唯一ID

    4、创建时间

    5、镜像大小

    其中镜像的ID比较重要,经常会用到。

    标签TAG用于标示同一仓库不同版本的镜像。

    为了使用方便,还可以通过docker tag命令为本地镜像添加新的标签:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker tag ubuntu:latest ubuntu:newtag  

    这时查看镜像列表会多出来一个镜像,但是其ID还是一样的。

 

    使用docker inspect命令可以获取镜像的详细信息:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker inspecct 镜像ID  

    这里返回的是一个json格式的字符串,如果只想获取其中指定的内容,可以通过-f指定参数:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker inspect -f {{".Architecture"}} 550  

    此时返回的就是Architecture信息。

 

    任何时候,在指定ID时都可以只指定前几个字符来代替完整的ID字符串,前提是能唯一标示。

   3、 查找镜像

    docker search命令可以搜索远程仓库中的公共镜像,默认为Docker Hub仓库。

    用法为:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker search TERM  

    支持的参数如下:

 

    1、--automated=false:仅显示自动创建的镜像

    2、--no-trunc=false:输出信息不截断显示

    3、-s, --stars=0:指定仅显示评论为指定星级以上的镜像

    比如要搜索带lamp关键字的镜像:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker search lamp  

    之后返回的信息包括:镜像名字、描述、星级、是否官方创建和是否自动创建等。

 

    默认的输出结果将按星级排序,官方镜像说明是官方项目组创建和维护的,automated资源允许用户验证镜像的来源和内容。

    4、删除镜像

    可以使用镜像的标签和ID删除镜像。
    命令格式为:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker rmi IMAGE[IMAGE...]  

    IMAGE可以为标签或者ID。

 

    当同一个镜像有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中指定的标签,并不影响镜像文件。

    如果镜像只剩下一个标签的时候,使用docker rmi命令会彻底删除该镜像。

    如果docker rmi后面跟上ID删除时,会尝试删除该镜像的所有标签后删除镜像文件本身。

    如果要删除逇镜像创建的容器存在时,镜像文件默认试试无法被删除的。如果直接执行删除命令,会提示有容器正在运行(即使容器已经Exit)。但是可以加上参数-f强行删除:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker rmi -f ID或标签  

    不过并不推荐这么做,因为这可能会导致一些遗留问题,如果一定要删除,推荐先删除该镜像的所有容器,然后再删除镜像,如果有容器不能删除,那么这个镜像也不应该直接被删除。

 

    删除镜像时会输出类似于获取镜像时一样的各层信息。

    5、创建镜像

    创建镜像有三种方式:

    1、基于已有镜像创建

    2、基于本地模板导入

    3、基于Dockerfile文件创建

    其中在大规模应用场景,一般使用第三种方式,所以在此处不会详谈(后续文章会详细介绍),这里主要介绍前两种。

 

   5.1、 基于已有镜像创建

    该方法主要使用docker commit命令,格式为:

 

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]  

    其中的选项:

 

 

  • -a、--author="":作者信息
  • -m\--message="":提交消息
  • -p、--pause=true:提交时暂停容器运行。

 

    下面是一个例子:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker commit -m "message" -a "anxpp" 容器ID 新的容器TAG 新的容器ID  

    之后就可以通过docker images命令查看到创建的容器了。

 

 

    5.2、基于本地模板导入

    可以直接从一个操作系统模板文件导入一个镜像。比如OpenVZ提供的模板(http://openvz.org/Download/templates/precreated)

 

    比如要导入下载好的ubuntu模板为镜像:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04  

    然后使用docker images就可以看到镜像了。

 

    6、镜像的导入导出(文件)

    可能有时候我们想直接导出镜像为文件供其他地方使用,docker提供了这样的功能。

    6.1、导出镜像为文件

    使用docker save命令将镜像保存为文件,如:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker save -o ubuntu.tar ubuntu:14.04  

    6.2、从文件导入镜像

 

    使用docker load命令将文件导入为镜像,如:

 

[plain] view plain copy
 
 print?在CODE上查看代码片派生到我的代码片
  1. docker load < ubuntu.tar  

    此时会导入镜像以及相关的元数据信息,如标签等。

 

 

    7、上传镜像

    上传镜像到仓库使用docker push命令,默认会上传到DockerHub官方仓库(需登录),命令格式为docker push NAME[:TAG]。

 

 

 

小结

    镜像是使用Docker的前提,使用过程中可以一边收集一些比较有用的镜像,目前网上流行的镜像仓库已经存在了大量稳定好用的镜像,我们可以拿来即用的。