《Docker进阶与实战》——3.2节使用Docker image

3.2 使用Docker image
Docker内嵌了一系列命令制作、管理、上传和下载镜像。可以调用REST API给Docker daemon发送相关命令,也可以使用client端提供的CLI命令完成操作。本书的第7章会详细阐述Docker REST API的细节,本节则主要根据功能对涉及image的命令进行说明。下面就从Docker image的生命周期角度说明Docker image的相关使用方法。

3.2.1 列出本机的镜像
下面的命令可以列出本地存储中镜像,也可以查看这些镜像的基本信息。

$ docker images
REPOSITORY  TAG                 IMAGE ID          CREATED           VIRTUAL SIZE
ubuntu      14.04.2              2103b00b3fdf      5 months ago      188.3 MB
ubuntu      latest               2103b00b3fdf      5 months ago      188.3 MB
ubuntu      trusty               2103b00b3fdf      5 months ago      188.3 MB
ubuntu      trusty-20150228.11   2103b00b3fdf      5 months ago      188.3 MB
ubuntu      14.04                2d24f826cb16      5 months ago      188.3 MB
busybox     buildroot-2014.02    4986bf8c1536      7 months ago      2.43 MB
busybox     latest               4986bf8c1536      7 months ago      2.43 MB
此外,通过--help参数还可以查询docker images的详细用法,如下:
$ docker images --help

Usage: docker images [OPTIONS] [REPOSITORY]

List images

    -a, --all=false      Show all images (default hides intermediate images)
    --digests=false      Show digests
    -f, --filter=[]       Filter output based on conditions provided
    --help=false         Print usage
    --no-trunc=false     Don't truncate output
    -q, --quiet=false    Only show numeric IDs

其中,--filter用于过滤docker images的结果,过滤器采用key=value的这种形式。目前支持的过滤器为dangling和label。 --filter "dangling=true"会显示所有“悬挂”镜像。“悬挂”镜像没有对应的名称和tag,并且其最上层不会被任何镜像所依赖。docker commit在一些情况下会产生这种“悬挂”镜像。下面第一条命令产生了一个“悬挂”镜像,第二条命令则根据其特点过滤出该镜像了。图3-2中的d08407d841f3就是这种镜像。

$ docker commit 0d6cbf57f660
$ docker images  --filter "dangling=true"
REPOSITORY     TAG         IMAGE ID            CREATED             VIRTUAL SIZE
<none>        <none>       d08407d841f3        3 hours ago         2.43 MB

在上面的命令中,--no-trunc参数可以列出完整长度的Image ID。若添加参数-q则会只输出Image ID,该参数在管道命令中很有用处。一般来说悬挂镜像并不总是我们所需要的,并且会浪费磁盘空间。可以使用如下管道命令删除所有的“悬挂”镜像。

$ docker images  --filter "dangling=true" -q  | xargs  docker rmi
Deleted: 8a39aa048fe3f2e319651b206073b2a2e437dcf85c15fedb6f437cfe86105145

这里的--digests比较特别,这个参数是伴随着新版本的Docker Registry V2(即Distribution)产生的,在本书接下来的第4章会详细说明。
按照Docker官方路标和最近的动作,Docker只会保留最核心的image相关命令和功能,因此那些非核心功能就会被删除。比如--tree和--dot已经从Docker 1.7中删掉。官方推荐使用dockerviz工具分析Docker image。执行以下命令,可以图形化地展示Docker image的层次关系。

dockviz images -d | dot -Tpng -o images.png

执行结果如图3-2所示,可以看到,同一个仓库中的镜像并不一定要有特别的关系,比如ubuntu: 14.04和ubuntu:14.04.2之间就没有共享任何层。

3.2.2 Build:创建一个镜像
创建镜像是一个很常用的功能,既可以从无到有地创建镜像,也可以以现有的镜像为基础进行增量开发,还可以把容器保存为镜像。下面就详细介绍这些方法。
1.直接下载镜像
我们可以从镜像仓库下载一个镜像,比如,以下为下载busybox镜像的示例。

$ docker pull busybox
Using default tag: latest
Pulling repository docker.io/library/busybox
8c2e06607696: Download complete
cf2616975b4a: Download complete
6ce2e90b0bc7: Download complete
Status: Downloaded newer image for busybox:latest

具体使用镜像仓库的方法,本书会在后续章节详细描述,这里暂不做说明。
2.导入镜像
还可以导入一个镜像,对此,Docker提供了两个可用的命令docker import和docker load。docker load一般只用于导入由docker save导出的镜像,导入后的镜像跟原镜像完全一样,包括拥有相同的镜像ID和分层等内容。下面的第一行命令可以导出busybox为busybox.tar,第二条命令则是导入该镜像:

$ docker save  -o busybox.tar busybox
$ docker load  -i busybox.tar

不同于docker load,docker import不能用于导入标准的Docker镜像,而是用于导入包含根文件系统的归档,并将之变成Docker镜像。
3.制作新的镜像
前面说过,docker import用于导入包含根文件系统的归档,并将之变成Docker镜像。因此,docker import常用来制作Docker基础镜像,如Ubuntu等镜像。与此相对,docker export则是把一个镜像导出为根文件系统的归档。 

示 读者可以使用Debian提供的Debootstrap制作Debian或Ubuntu的Base image,可以在Docker官网找到教程。

Docker提供的docker commit命令可以增量地生成一个镜像,该命令可把容器保存为一个镜像,还能注明作者信息和镜像名称,这与git commit类似。当镜像名称为空时,就会形成“悬挂”镜像。当然,使用这种方式每新增加一层都需要数个步骤(比如,启动容器、修改、保存修改等),所以效率是比较低的,因此这种方式适合正式制作镜像前的尝试。当最终确定制作的步骤后,可以使用docker build 命令,通过Dockerfile文件生成镜像。

3.2.3 Ship:传输一个镜像
镜像传输是连接开发和部署的桥梁。可以使用Docker镜像仓库做中转传输,还可以使用docker export/docker save生成的tar包来实现,或者使用Docker镜像的模板文件Dockerfile做间接传输。目前托管在Github等网站上的项目,已经越来越多地包含有Dockerfile文件;同时Docker官方镜像仓库使用了github.com的webhook功能,若代码被修改就会触发流程自动重新制作镜像。

3.2.4 Run:以image为模板启动一个容器
启动容器时,可以使用docker run命令,该命令在相关章节会详细描述,本节不做深入说明。
图3-3总结了上文提到的Docker镜像生命周期管理的相关命令。现阶段Docker镜像相关的命令存在一些问题,包括:
命令间逻辑不一致,比如列出容器使用的是docker ps,列出镜像使用的是docker images。
混用命令导致命令语义不清晰,比如查看容器和镜像详细信息的命令都是 docker inspect。
所以基于这些考虑,Docker项目的路标中提到会把相关命令归类,并使用二级命令来管理。因此读者可以着重学习命令的用法和其实现的功能,不用过分关心命令的形式。

时间: 2024-09-20 19:07:30

《Docker进阶与实战》——3.2节使用Docker image的相关文章

《Docker进阶与实战》——1.3节安装和使用

1.3 安装和使用1.3.1 Docker的安装 Docker的安装和使用有一些前提条件,主要体现在体系架构和内核的支持上.对于体系架构,除了Docker一开始就支持的x86-64,其他体系架构的支持则一直在不断地完善和推进中,用户在安装前需要到Docker官方网站查看最新的支持情况.对于内核,目前官方的建议是3.10以上的版本,除了内核版本以外,Docker对于内核支持的功能,即内核的配置选项也有一定的要求(比如必须开启Cgroup和Namespace相关选项,以及其他的网络和存储驱动等).如

《Docker进阶与实战》——3.3节Docker image的组织结构

3.3 Docker image的组织结构上节讲到Docker image是用来启动容器的只读模板,提供容器启动所需要的rootfs,那么Docker是怎么组织这些数据的呢? 3.3.1 数据的内容Docker image包含着数据及必要的元数据.数据由一层层的image layer组成,元数据则是一些JSON文件,用来描述数据(image layer)之间的关系以及容器的一些配置信息.下面使用overlay存储驱动对Docker image的组织结构进行分析,首先需要启动Docker daem

《Docker进阶与实战》——2.5节容器造就Docker

2.5 容器造就Docker 关于容器是否是Docker的核心技术,业界一直存在着争议.有人认为Docker的核心技术是对分层镜像的创新使用,有人认为其核心是统一了应用的打包分发和部署方式,为服务器级别的"应用商店"提供了可能,而这将会是颠覆传统行业的举措.事实上,这一系列创新并不是依赖于容器技术的,基于传统的hypervisor也可以做到,业界也由此诞生了一些开源项目,比如Hyper.Clear Linux等.另外,Docker官方对Docker核心功能的描述"Build,

《Docker进阶与实战》——3.1节Docker image概念介绍

3.1 Docker image概念介绍简单地说,Docker image是用来启动容器的只读模板,是容器启动所需要的rootfs,类似于虚拟机所使用的镜像.首先需要通过一定的规则和方法表示Docker image,如图3-1所示. 图3-1是典型的Docker镜像的表示方法,可以看到其被"/"分为了三个部分,其中每部分都可以类比Github中的概念.下面按照从左到右的顺序介绍这几个部分以及相关的一些重要概念.Remote docker hub:集中存储镜像的Web服务器地址.该部分的

《Docker进阶与实战》——导读

目 录 序 前 言 第1章 Docker简介1.1 引言1.2 功能和组件1.3 安装和使用1.4 概念澄清1.5 本章小结第2章 关于容器技术2.1 容器技术的前世今生2.2 一分钟理解容器2.3 Cgroup介绍2.4 Namespace介绍2.5 容器造就Docker2.6 本章小结第3章 理解Docker镜像3.1 Docker image概念介绍3.2 使用Docker image3.3 Docker image的组织结构3.4 Docker image扩展知识3.5 本章小结第4章

《Docker进阶与实战》——1.4节概念澄清

1.4 概念澄清 本书的附录A是关于Docker常见问题的解答,但对于Docker基本概念方面的问题,希望读者可以在阅读完本章后就有清晰的认识,所以本节会针对与Docker概念息息相关的几个常见问题进行说明.1.4.1 Docker在LXC基础上做了什么工作 首先我们需要明确LXC的概念,但这常常有不同的认识.LXC目前代表两种含义: LXC用户态工具(https://github.com/lxc/lxc). Linux Container,即内核容器技术的简称. 这里通常指第二种,即Docke

《Docker进阶与实战》——2.3节Cgroup介绍

2.3 Cgroup介绍2.3.1 Cgroup是什么 Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU.内存.block I/O和网络带宽.Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性. 从实现的角度来看,Cgroup实现了一个通用的进程分组的框架,而不同资源的具体管理则是由各个Cgroup子系统实现的.截止到内核4.1版本,Cgroup

《Docker进阶与实战》——2.2节一分钟理解容器

2.2 一分钟理解容器2.2.1 容器的组成 上文已多次提及,容器的核心技术是Cgroup + Namespace,但光有这两个抽象的技术概念是无法组成一个完整的容器的.在2.1.2节也提到过最早的容器概念就包括了对文件目录视图的抽象隔离,而所有的这一切,都需要有工具来驱动,需要有一个工具来提供用户可操作的接口,来创建一个容器.所以笔者认为,对于Linux容器的最小组成,可以由以下公式来表示: 容器 = cgroup + namespace + rootfs + 容器引擎(用户态工具) 其中各项

《Docker进阶与实战》——2.1节容器技术的前世今生

2.1 容器技术的前世今生2.1.1 关于容器技术 容器技术,又称为容器虚拟化,从字面上看它首先是一种虚拟化技术.在如今的技术浪潮下,虚拟化技术层出不穷,包括硬件虚拟化.半虚拟化.操作系统虚拟化等.本书不会对虚拟化技术展开介绍,只需要知道容器虚拟化是一种操作系统虚拟化,是属于轻量级的虚拟化技术即可.又因为在实现原理上,每一种虚拟化技术之间都有较大的差别,所以即使没有虚拟化的技术背景,也是可以单独来学习容器虚拟化的. 容器技术之所以受欢迎,一个重要的原因是它已经集成到了Linux内核中,已经被当作