Docker 基础 : 镜像

目录
html

镜像是 Docker 的三大核心概念之一。Docker 运行容器前须要本地存在对应的镜像,若是本地没有对应的镜像,Docker 会尝试从默认的镜像仓库下载。固然用户也能够经过配置,使用自定义的镜像仓库。
本文将介绍镜像的具体操做,包括使用 pull 命令从 Docker Hub 的镜像仓库中拉取(下载)公共镜像;查看本地已有的镜像信息;使用 search 命令搜索镜像;删除镜像标签和镜像文件;建立用户自定义镜像并上传到 Docker Hub 镜像仓库。
与镜像相关的操做都被定义在 docker image 子命令中,虽然不带 image 的格式依然被兼容,但带上 image 后会让命令更容易理解,也会有更好的自动补全效果。mysql

获取镜像sql

本地镜像是运行容器的前提,因此在运行容器前咱们须要使用 docker image pull 命令从网络上的镜像仓库把镜像拉取到本地。该命令的格式为:
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]docker

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

$ docker image pull ubuntu

该命令实际拉取的是 ubuntu:latest 镜像,当前的最新版本为 16.04。从上图中能够看到,docker 的镜像其实被分红了不少的层,每层保存一些特定的文件。上面的命令实际至关于:bash

$ 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.0四、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 有所帮助。

参考:
《Docker 技术入门与实战》

相关文章
相关标签/搜索