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 有所帮助。
参考:
《Docker 技术入门与实战》
Docker 基础 : 镜像的更多相关文章
- 中标麒麟龙芯平台--docker基础镜像制作
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 的出现为开发人员和运维人员带来了极大的便利.Docker在X86下常见的发行版Linux如Ub ...
- linux 创建docker基础镜像
通过Dockerfile创建镜像时,一般都是基于 Docker Hub 提供的官方镜像.以下分别介绍在ubuntu16和centos7 两个系统上创建个人私有基础镜像的方法. 一.ubuntu16创 ...
- 庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署
庐山真面目之九微服务架构 NetCore 基于 Docker 基础镜像和挂载文件部署 一.简介 我们在上一篇文章<庐山真面目之八微服务架构 NetCore 基于 Dockerfile ...
- 尝试自己建立以alpine 为基础的docker基础镜像和组件镜像
安装ubuntu14.04 然后 #获取root权限 sudo su #安装docker apt-get install docker #准备基础镜像 docker pull alpine docke ...
- 从零开始构建docker基础镜像
段子 今年基本已经结束了,我问了很多朋友今年挣钱了没?大多朋友都有挣,而且挣得五花八门:有挣个屁的,有挣个锤子的,有挣个毛的,更有甚者挣个妹的,奢侈之极!最恐怖的是挣个鬼的!有的还可以,挣个球,下午我 ...
- 测试环境docker化(一)—基于ndp部署模式的docker基础镜像制作
本文来自网易云社区 作者:孙婷婷 背景 我所在测试项目组目前的测试环境只有一套,在项目版本迭代过程中,开发或产品偶尔会在测试环境进行数据校验,QA人数在不断增加,各个人员在负责不同模块工作时也会产生脏 ...
- howto:在构建基于debian的docker基础镜像时,更换国内包源
debian经常被用作构建应用镜像的基础镜像,如微软在构建linux下的dotnetcore基础镜像时,提供了基于debian 8(jessie)和debian 9(stretch)的镜像. 由于这些 ...
- Docker基础-镜像操作
1.搜寻镜像 docker search [TERM] 可以搜索远程仓库中共享的镜像,默认搜索官方仓库的镜像. docker search参数: --automated=true|false :仅显示 ...
- 创建自己的docker基础镜像
1.下载镜像 centos7 docker pull centos: 2.创建容器加载镜像 docker run -i -t --name centos7 centos: docker run 参数详 ...
随机推荐
- python 一篇搞定所有的异常处理
一:什么是异常? 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行. 一般情况下,在python无法正常处理程序时就会发生一个异常(异常是python对象,表示一个错误) 异常就是 ...
- List集合就这么简单【源码剖析】
前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识. 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是 ...
- HTTP协议扫盲(八 )响应报文之 Transfer-Encoding=chunked方式
一.什么是chunked编码? 分块传输编码(Chunked transfer encoding)是只在HTTP协议1.1版本(HTTP/1.1)中提供的一种数据传送机制.以往HTTP的应答中数据是整 ...
- 从微软MVP到女儿开学--2017前半年小结
2017年转眼就到了9月,原本在年初定的计划基本泡汤了. 看书啊减肥啊出教程啊,都被因为各种事物给缠身而没有完成. 1号带女儿去报名的时候,听到老师说"家长们请到这边来集合"的时候 ...
- C# 基于Bootstrap的三级联动
实现效果如图: 一.声明市.县.乡对应的下拉控件select <div class="form-group"> <label class="col-sm ...
- 模板引擎Jade详解
有用的符号: | 竖杠后的字符会被原样输出 · 点表示下一级的所有字符都会被原样输出,不再被识别.(就是|的升级版,实现批量) include 表示引用外部文件 短杠说明后面跟着的字符只是一段代码(与 ...
- 前端之CSS内容
一.CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). 二.CSS语法 1 ...
- python 开发之路 -MySQL
阅读目录 第一篇 : 数据库 之 基本概念 第二篇 : MySQL 之 库操作 第三篇 : MySQL 之 表操作 第四篇 : MySQL 之 数据操作 第五篇 : MySQL 之 视图.触发器.存储 ...
- 在Android项目中使用Java8
前言 在过去的文章中我介绍过Java8的一些新特性,包括: Java8新特性第1章(Lambda表达式) Java8新特性第2章(接口默认方法) Java8新特性第3章(Stream API) 之前由 ...
- python基础二(基础数据类型)
一. 引子 1. 什么是数据 x=10,10是我们要存储的数据 2. 为何数据要分不同的类型 数据是用来表示状态的,不同的状态就应该用不同的类型的数据去表示 3.数据类型 数字 字符串 列表 元组 字 ...