【黑马程序员西安中心】干货 | 快读搞懂Docker的三大核心概念之“镜像”篇

Docker的三大核心概念分别镜像、容器、仓库。Docker运行容器前需要本地存在对应的镜像,如果本地没有对应的镜像,Docker会尝试从默认的镜像仓库下载。当然用户也可以通过配置,使用自定义的镜像仓库。


本文将介绍镜像的具体操作,包括使用pull命令从Docker Hub的镜像仓库中拉取(下载)公共镜像;查看本地已有的镜像信息;使用search命令搜索镜像;删除镜像标签和镜像文件;创建用户自定义镜像并上传到Docker Hub镜像仓库。


与镜像相关的操作都被定义在Docker image子命令中,虽然不带image的格式依然被兼容,但带上image后会让命令更容易理解,也会有更好的自动补全效果。

获取镜像

本地镜像是运行容器的前提,所以在运行容器前我们需要使用docker image pull命令从网络上的镜像仓库把镜像拉取到本地。该命令的格式为:

docker image pull [OPTIONS] NAME[:TAG|@DIGEST]


如果只指定了镜像的名称,默认会选择拉取latest标签标记的镜像。比如我们要拉取最新的ubuntu镜像:

 
 

$ docker image pull ubuntu

该命令实际拉取的是ubuntu:latest镜像,当前的最新版本为16.04。从上图中可以看到,docker的镜像其实被分成了很多的层,每层保存一些特定的文件。上面的命令实际相当于:

 
 

$ docker image pull registry.hub.docker.com/ubuntu:latest

即从默认的数据仓库服务器registry.hub.docker.com中拉取ubuntu仓库中的最新镜像。如果我们感觉从Docker Hub上拉取镜像太慢,可选择从其它的数据仓库服务器上拉取,比如Docker Hub在国内部署的服务器:

 
 

$ docker image pull registry.docker-cn.com/library/ubuntu:latest

镜像下载到本地后就可运行容器了,比如:

 
 

$ docker run --rm ubuntu echo hello docker


查看镜像信息


使用docker image ls(或 docker images) 命令可以列出本地存储的镜像:

$ docker image ls

输出的信息中包含的内容有:

REPOSITORY:说明镜像来自哪个仓库,比如ubuntu或registry.docker-cn.com/library/ubuntu。

TAG:镜像的标签信息,比如14.04或latest。
IMAGE ID:标识镜像的ID号。
CREATED:创建镜像的时间。
SIZE:镜像大小。


其中镜像的ID信息十分重要,它唯一的标识了镜像。


TAG信息用来标记来自同一个仓库(比如ubuntu)的不同镜像。例如ubuntu仓库中有多个镜像,可以通过TAG信息来区分它们,TAG 13.04、14.04和16.04都代表了不同的发行版本。


使用docker image tag命令为本地的镜像添加新的标签还可以方便我们的使用,比如为ubuntu:14.04镜像添加下面的标签:

$ docker image tag ubuntu:14.04 oldubuntu

然后就可以通过oldubuntu来引用ubuntu:14.04 镜像了。其实从docker image ls的输出中我们可以看到,它们引用的是同一个镜像ID:



我们添加的新标签就像给镜像取了个别名一样。


使用docker image inspect命令可以获取镜像的详细信息,比如查看ubuntu:latest镜像的信息:

$ docker image inspect ubuntu:latest



这个命令的输出很长,上图只是截取了一小部分的信息。它输出的是一个JSON格式的信息,一般情况下我们会有的放矢的通过-f选项取其中的某一部分。比如只获取镜像的Architecture信息:

$ docker image inspect -f {{".Architecture"}} ubuntu:latest



搜索镜像


除了直接在Docker Hub的官方网站上搜索镜像资源,还可以通docker search命令以命令行的方式进行搜索,比如搜索mysql镜像:

$ docker search mysql



该图只截取了一部分结果。个人感觉这个命令的价值有限,因为我们在选择镜像时还是需要慎重的。往往要在Docker Hub的官方网站上查看镜像相关的详细信息,然后才会决定是否使用,而docker search命令提供的信息过于有限。



删除镜像


对于不再需要的镜像我们可以使用docker image rm命令进行删除,以释放镜像占用的磁盘空间。我们可以为docker image rm命令传递镜像的标签或ID,这两种方式略微有些区别,下面我们将分别介绍。


使用进行的标签删除镜像


比如删除标签为mysql:5.6的镜像:

$ docker image rm mysql:5.6



镜像的所有内容一下就被删除了(很多镜像层被删除掉),再来删除ubuntu:14.04试试:

$ docker image rm ubuntu:14.04



为什么这次只删除了一点点东西?再去看看进行列表,oldubuntu还在,并且引用着ID为3b853789146f的镜像:



原来,对于被多个标签引用的镜像ID,删除标签时只是把那个标签删掉了,并会真正删除镜像文件。现在再删除一次oldubuntu试试:



由于oldubuntu是最后一个引用该镜像的标签,所以删除该标签会同时删除该镜像的所有文件。


使用镜像ID删除镜像

对于镜像ID为c9d990395902的镜像来说,也有两个标签引用着它,分别是ubuntu:latest和newubuntu:



现在让我们尝试通过镜像ID删除它:

$ docker image rm c9d990395902



此时docker检测到该镜像ID被引用了多次就机智的报错了,并且终止了删除操作。同样如果由其它的镜像引用了该ID的镜像,docker同样会报错并终止删除操作。所以,只有当一个镜像不被多个标签引用,也没其它镜像引用它时,才可以被通过镜像ID删除。


创建镜像


我们可以通过不同的方式创建镜像,比如基于已有容器进行创建和基于Dockerfile 文件进行创建。笔者在《Docker 基础 : Dockerfile》一文中介绍过通过docker build命令利用Dockerfile文件创建镜像,所以这里只介绍如何通过docker container commit命令基于已有容器创建镜像。我们先启动一个以ubuntu:latest为镜像的容器,然后在当前目录下创建一个名为nickfile的文件:

$ docker run -it ubuntu:latest bash



在文件创建后退出容器,但要记住该容器的ID为:7e26732e14e6。然后执行下面的命令创建镜像:

$ docker container commit -m "add file nickfile." 7e26732e14e6 nickimage



镜像创建成功后,你可以在镜像列表中看到名称为nickimage的镜像:



下面运行一个基于nickimage的容器,看看nickfile是否存在:

$ docker run --rm nickimage ls



验明正身!我们在容器中创建的文件nickfile已经被成功的添加到nickimage镜像中了。


导出和导入镜像


当碰到没有网络的环境时,如何获取镜像呢?答案是在能够获得镜像的环境中把镜像导出为文件,然后通过U盘等设备拷贝到目标环境中,再进行导入。


导出镜像


通过docker image save命令可以把镜像导出为本地文件,比如导出ubuntu:latest镜像为ubuntu1604.tar:

$ docker image save -o ubuntu1604.tar ubuntu:latest


一般我们还会再压缩一下,这样最终的文件会小不少:

$ tar -czf ubuntu1604.tar.gz ubuntu1604.tar



文件大小从112M压缩到了41M,效果还是很明显的。


导入镜像


把ubuntu1604.tar.gz文件拷贝到目标系统上后先要解压出ubuntu1604.tar文件:

$ tar -xf ubuntu1604.tar.gz


然后通过docker image load命令执行镜像的导入操作:

$ docker image load -i ubuntu1604.tar


这样就OK了,用docker image ls命令看看,是不是已经可以看到ubuntu:latest镜像了!


上传镜像


可以使用docker image push命令把镜像上传到镜像仓库服务器,默认是上传到Docker Hub的镜像仓库,此时事先需要注册用户并进行登录。上传镜像的命令格式为:

docker image push NAME[:TAG]

比如笔者在Docker Hub注册了账号ljfpower,并通过docker login命令完成了登录操作(需要输入用户名和密码进行验证)。接下来就可把本地的镜像上传到镜像仓库服务器了。在上传前需要给镜像打上合法的标签(用户账号/仓库名称:TAG),比如:


$ docker image tag azcli:1.0 ljfpower/azcli:latest


最后上传这个标签就行了:

$ docker image push ljfpower/azcli:latest

上传后你就可以在Docker Hub上看到这个镜像了:



总结


镜像是使用docker的前提,所以本文比较详细的介绍了docker镜像相关的操作,包括获取、查看、搜索、创建、删除、导出、导入等。希望对大家了解、学习docker有所帮助。

猜你喜欢

转载自blog.csdn.net/qq_39581763/article/details/80846714
今日推荐