Docker镜像

镜像(image)是docker三大核心概念中最为重要的,docker运行容器(container)前需要本地存在对应的镜像(image),如果本地不存在对应的镜像,docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

 

获取镜像

镜像是运行容器的前提,docker hub网站已经提供了数十万镜像供大家下载使用。

获取(下载)镜像的命令格式如下:docker pull NAME[:TAG]

其中,NAME是镜像仓库的名称(用来区分镜像),犹如git仓库名一样;TAG是镜像的标签(一般用于表示版本信息),犹如git仓库中对应的版本号,如果不显示指定TAG,则默认会选择lastest标签,也即是下载该镜像仓库中最新版本的镜像。因此,在同一镜像仓库服务器的情况下,可以说NAME + TAG可以唯一确定一个镜像。

例如,获取一个ubuntu 14.04系统的基础镜像可以使用如下命令:

例如,获取一个最新的ubuntu操作系统镜像可以使用如下命令:

实际上,docker pull ubuntu等同于docker pull ubuntu:latest。

另外,严格地讲,镜像的仓库名称中还应该添加仓库地址(registry,注册服务器)作为前缀,只是在这里我们默认使用的是docker hub服务,该前缀可以忽略。前面命令:docker pull ubuntu:14.04等同于docker pull registry.hub.docker.com/ubuntu:14.04,即从默认的注册服务器docker hub registry中获取ubuntu仓库且标记为14.04的镜像。当然,可以从一些非官方的仓库服务器下载镜像,例如网易蜂巢的镜像源下载ubuntu 14.04镜像,命令如下:docker pull hub.c.163.com/public/ubuntu:14.04。

 

查看镜像

使用docker images命令可以列出本地主机上已有镜像的基本信息。

如上图所示,红色区域就是前面获取的镜像,包括ubuntu:14.04,ubuntu:latest,还有从网易蜂巢镜像源下载的hub.c.163.com/public/ubuntu:14.04等镜像。

1、Repository,表示来自于哪个仓库,例如ubuntu仓库用于保存ubuntu系统的基础镜像;

2、Tag,表示镜像标签,等同于版本号;

3、Image ID,镜像的ID号,唯一标识镜像;

4、Created,表示镜像最后的更新时间;

5、Size,表示镜像大小,一般好的镜像往往体积都较小;镜像大小一般指的是该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,因此,物理上占用的存储空间会小于各镜像的逻辑体积之和。

 

使用docker tag命令为本地镜像任意添加新的标签,例如为ubuntu:latest镜像添加一个新的myubuntu:latest镜像标签:docker tag ubuntu:latest myubuntu:latest 

如上图所示,新的标签myubuntu:latest和ubuntu:latest的image id是相同的,说明它们都是指向一个镜像文件,myubuntu:latest只是起到一个类似链接的作用。

 

使用docker inspect命令可以获取该镜像的详细信息,包括制作者,适应架构,各层的数字摘要等,例如查看ubuntu:14.04镜像的详细信息,docker inspect ubunut:14.04

 

搜索镜像

使用docker search命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。例如搜索评价为50+星级的带nginx关键字的镜像,docker search -s 50 nginx,默认输出结果是按照星级评价进行降序排序。

 

删除镜像

使用docker rmi命令可以删除本地镜像,格式:docker rmi <标签名>或者<image id>。其中镜像文件存在多个标签,根据标签删除镜像只会删除该标签,不会影响到镜像文件;但是镜像文件如果只存在一个标签,根据标签删除镜像会删除到该镜像文件。此外,根据image id删除镜像,将会直接删除掉镜像文件。

目前,ubuntu:latest镜像有三个标签,分别是ubuntu,myubuntu,myubuntu2。

采用根据标签名的方式删除本地镜像,docker rmi myubuntu2。可以看出,还存在ubuntu,myubuntu标签。

采用根据image id方式删除本地镜像,docker rmi 452a96d81c30。其中452a96d81c30是ubuntu:latest镜像ID号。

 

可以看出,镜像文件存在多个标签时,会提示存在多个标签,可以使用dokcer rmi -f 452a96d81c30命令进行强制删除,不推荐这样处理。

此外,如果通过该镜像创建的容器存在时,镜像文件默认是无法被删除的,也可以采用强制删除的方式删除,但是不推荐这样处理。正常处理是先删除依赖该镜像的所有容器,再来删除镜像,后续容器部分再进行说明和操作。

 

创建镜像

目前创建镜像主要有三种方式,分别是:基于已有镜像的容器创建;基于本地模板导入;基于Dockerfile创建(后续详细说明)。

1、基于已有镜像的容器创建

使用docker commit命令,命令格式为docker commit [OPTIONS] container [Repository[:Tag]],其中可选参数如下:

-a,--author="":作者信息;

-c,--change=[]:提交的时候执行Dockerfile指令;

-m,--message="":提交消息;

-p,--pause=true:提交时暂停容器运行。

首先,启动一个镜像生成容器,然后在该容器内创建一个test文件;

此时,该容器跟原来的ubuntu:14.04镜像相比,发生了改变,使用docker commit命令提交一个新的镜像,docker commit -a "limin" -m "add a new file" 8a7a1a9c1a62 test:0.1,其中8a7a1a9c1a62是容器的ID号。

2、使用本地模板导入

使用docker import命令可以直接从一个操作系统模板文件导入一个镜像,命令格式为:docker import [OPTIONS] file | URL | [Repository[:Tag]]。通过OpenVZ提供的模板来创建镜像,下载ubuntu-14.04-x86_64-minimal.tar.gz,使用命令cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04.01。

 

存出和载入镜像

1、 可以使用docker save命令导出镜像到本地文件,这样可以将存储到本地的镜像文件分享给其他人使用,docker save -o ubuntu_14.04.tar ubuntu:14.04,将ubuntu:14.04镜像文件存储为文件ubuntu_14.04.tar。生成的ubuntu_14.04.tar文件在当前目录下。

2、可以使用docker load命令将导出的tar文件再导入到本地镜像库中,docker load --input ubuntu_14.04.tar或者docker load < ubuntu_14.04.tar。

 

上传镜像

可以使用docker push命令上传镜像到仓库,默认上传到docker hub官方仓库(需要账号密码登录),命令格式为:docker push NAME[:TAG]  |  [Registry_host[:registry_port]/]NAME[:TAG]

上传本地镜像ubuntu:14.04,可以先添加新的标签lim1208/ubuntu:14.04,其中,lim1208就是我本人的docker hub的用户名,然后用docker push命令上传镜像。

注意:push镜像之前使用docker login命令,登录你的docker hub账号信息,不然会报unauthorized: incorrect username or password错误信息。

登录docker hub,可以看到我们刚才上传的镜像仓库。

docker镜像说明到此,后续说明docker容器相关的知识点。

注:本文参考《Docker技术入门与实践》第二版。

posted @ 2018-05-05 17:51  lim1208  阅读(268)  评论(0编辑  收藏  举报