获取镜像

首先说明一下如何从Docker hub中获取高质量的镜像,从Docker镜像库获取镜像的命令是docker pull 。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过docker pull --help命令看到,下面我们说一下镜像名称的格式:

  • docker镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号] 。默认地址是 DockerHub。
  • 仓库名:仓库名是两段式名称,即<用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library ,也就是官方镜像

比如:

sudo docker pull ubuntu:16.04
#输出一下信息
16.04: Pulling from library/ubuntu
50aff78429b1: Pull complete
f6d82e297bce: Pull complete
275abb2c8a6f: Pull complete
9f15a39356d6: Pull complete
fc0342a94c89: Pull complete
Digest: sha256:fbaf303d18563e57a3c1a0005356ad102509b60884f3aa89ef9a90c0ea5d1212
Status: Downloaded newer image for ubuntu:16.04

上述命令没有给出docker镜像仓库地址,将会从docker hub获取镜像。镜像名是ubuntu:16.04,因此将会获取官方镜像 library/ubuntu 仓库中标签为 16.04 的镜

像。

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也

是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结

束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

有了docker镜像后,我们就可以以这个镜像为基础启动运行一个容器,以上面的镜像为例,我们想启动上面的bash并以交互的方式运行,可以使用一下命令:

sudo docker run -it --rm ubuntu:16.04 bash

docker run是运行容器的命令,上面用到的参数意义如下:

  • -it:这是两个参数,一个是-i交互式操作,一个是-t终端。我们这里打算进入bash 执行一些命令并查看返回结果,因此我们需要交互式终端
  • --rm:这个参数是说容器退出后随之将其删除
  • ubuntu:16.04 :这是指用 ubuntu:16.04 镜像为基础来启动容器
  • bash :放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash

进入容易后,我们可以通过shell执行任何所需要的命令,最后我们通过exit退出这个容器。

列出镜像

使用sudo docker image ls或则sudo docker images可以列出本地已下载的镜像。

sudo docker image ls
#结果
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 00fd29ccc6f1 3 weeks ago 111MB
hello-world latest f2a91732366c 6 weeks ago 1.85kB

从上面可知,列表包含了仓库名,标签,镜像ID,创建时间,占用空间这些信息,镜像ID是镜像的唯一表示,一个镜像可以对应多个标签,相同镜像ID不同标签的镜像可以认为是同一个镜像

镜像体积

通过观察镜像的size我们可以发现,镜像表示所占用的空间和docker hub上看到的镜像的大小不一致。这是因为docker hub显示的大小是压缩后的体积大小。镜像的下载和上传过程中是保持压缩状态的。因此docker hub显示的大小是压缩后的体积大小。而docker image看到的是下载到本地后展开后的大小,是展开后各层所占用的空间的总和。查看空间的时候更关心的是本地磁盘空间占用的大小。

另外一个需要注意的问题是, docker image ls 列表中的镜像体积总和并非是所有镜像实际硬

盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为

使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保

存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间:

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images 2 1 110.5MB 110.5MB (99%)
Containers 2 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0B 0B

悬挂镜像

悬挂镜像是一种特殊的镜像,这种镜像既没有仓库名也没有标签,他们的值都为,除了 docker pull 可能导致这种情况, docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像。可以使用下面的命令显示悬挂镜像

docker image ls -f dangling=true

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除:

docker image prune

中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 docker image ls 列表中只会显示顶层镜像,如果

希望显示包括中间层镜像在内的所有镜像的话,需要加 -a 参数

docker image ls -a

列出部分镜像

不加任何参数的情况下, docker image ls 会列出所有顶级镜像,但是有时候我们只希望列出

部分镜像。 docker image ls 有好几个参数可以帮助做到这个事情。

  • 根据仓库名列出镜像
docker image ls ubuntu
  • 指定仓库名和标签列出特定的镜像
docker image ls ubuntu:16.04
  • 使用过滤参数列出镜像
#如果镜像构建时,定义了 LABEL ,还可以通过 LABEL 来过滤
docker image ls -f label=com.example.version=0.1

以特定格式显示镜像

默认情况下, docker image ls 会输出一个完整的表格,但是我们并非所有时候都会需要这些

内容。比如,刚才删除虚悬镜像的时候,我们需要利用 docker image ls 把所有的虚悬镜像

的 ID 列出来,然后才可以交给 docker image rm 命令作为参数来删除指定的这些镜像,这个

时候就用到了 -q 参数

docker image ls -q

00fd29ccc6f1
f2a91732366c

另外一些时候,我们可能只是对表格的结构不满意,希望自己组织列;或者不希望有标题,

这样方便其它程序解析结果等,这就用到了 Go 的模板语法

比如,下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:

docker image ls --format "{{.ID}}: {{.Repository}}"

或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:

docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

IMAGE ID            REPOSITORY          TAG
00fd29ccc6f1 ubuntu 16.04
f2a91732366c hello-world latest

删除本地镜像

删除本地镜像可以使用docker image rm 命令格式如下:

docker image rm [选项] <镜像1> [<镜像2> ...]

其中, <镜像> 可以是 镜像短 ID 、 镜像长 ID 、 镜像名 或者 镜像摘要 。

如果我们需要删除所有仓库名为 redis 的镜像,可以使用下面的命令

docker image rm $(docker image ls -q redis)

Untagged 和 Deleted

删除行为分为两类,一类是Untagged,另一类是Deleted。我们使用上述命令删除的时候,实际上是在要求删除某个标签的镜像,这就是我们看到的Untagged信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像。如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker rmi 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。

docker镜像基本操作一的更多相关文章

  1. docker镜像基本操作

    操作镜像 使用 docker 命令行操作 docker 镜像 获取镜像 使用「docker pull +镜像名称」从网络上下载image镜像 core@localhost ~ $ docker pul ...

  2. Docker(5):Docker镜像基本操作(上)

    1.获取镜像 可以使用docker pull 命令从网络上下载镜像.该命令的格式为docker pull NAME[:TAG].对于Docker镜像来说,如果不显示地指定TAG,则默认会选择lates ...

  3. Docker镜像和容器

    本节内容: 安装Docker 卸载docker 镜像基本操作 容器基本操作 一.安装Docker Docker 对 Linux 内核版本的最低要求是3.10,如果内核版本低于 3.10 会缺少一些运行 ...

  4. Docker 镜像、容器、仓库的概念及基本操作

    Docker 包括三个基本概念: 镜像(Image)容器(Container)仓库(Repository) 这三部分组成了Docker的整个生命周期,如下图所示,容器是由镜像实例化而来的,这和我们学习 ...

  5. Docker 镜像 && 容器的基本操作

    镜像 && 容器 docker 镜像好比操作系统的镜像(iso) docker 容器好比是已安装运行的操作系统 所以说 docker 镜像文件运行起来之后,就是我们所说的 docker ...

  6. 【实战】Docker入门实践二:Docker服务基本操作 和 测试Hello World

    操作环境 操作系统:CentOS7.2 内存:1GB CPU:2核 Docker服务常用命令 docker服务操作命令如下 service docker start #启动服务 service doc ...

  7. 004.Docker镜像管理

    一 镜像基本操作 镜像是一个包含程序运行必要依赖环境和代码的只读文件,其本质是磁盘上一系列文件的集合.它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 1 ...

  8. Docker 安装&基本操作

    Docker 安装 Docker 中的三个概念:镜像,容器,仓库 镜像(image):Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器.Docker 提供了一个很简单的机制来 ...

  9. 五十三.Docker概述、部署Docker、Docker镜像、Docker基本命令

    1.安装Docker 准备两台虚拟机,IP为192.168.1.10和192.168.1.20 安装docker-engine 和 docker-engine-selinux 关闭防火墙   **** ...

随机推荐

  1. [BAT]通过schtasks.exe远程调用windows 2008 server上的计划任务,提示ERROR : Access is denied

    在windows 2008 server 上建了一个计划任务,想通过命令 schtasks /run /tn "IPADForAdvisor_QA_APITest" /s SZPC ...

  2. Zookeeper 系列(三)Zookeeper API

    Zookeeper 系列(三)Zookeeper API 本节首先介绍 Zookeeper 的 Shell 命令,再对 Java 操作 Zookeeper 的三种方式进行讲解,本节先介绍 Zookee ...

  3. 设计模式之java源码-工厂方法模式

    工厂方法模式 8.1 女娲造人的故事 东汉<风俗通>记录了一则神话故事:“开天辟辟,未有人民,女娲搏,黄土作人……”,讲述的内容就是大家非常熟悉的女娲造人的故事.开天辟地之初,大地上并没有 ...

  4. 2018.10.14 bzoj1915: 奶牛的跳格子游戏(单调队列优化dp)

    传送门 NOIP练习题. f[i]f[i]f[i]表示去的时候选了iii且回来的时候第一步走的是i−1i-1i−1的最优值. 显然f[i]=maxf[i]=maxf[i]=max{f[j]−sum[j ...

  5. 2018.09.25 bzoj2286: [Sdoi2011]消耗战(虚树+树形dp)

    传送门 又一道虚树入门题. 这个dp更简单啊. 直接记录每个点到1的距离,简单转移就行了. 代码: #include<bits/stdc++.h> #define N 250005 #de ...

  6. asp.net web api 安装swagger

    使用nuget控制台, 输入 Install-Package Swashbuckle,回车,等待安装引用.nuget国内没有镜像,安装比较慢 安装成功后会多出一个引用 右键工程点--属性,左边导航栏选 ...

  7. Django 必会面试题总结

    1 列举Http请求中常见的请求方式 HTTP请求的方法: HTTP/1.1协议中共定义了八种方法(有时也叫“动作”),来表明Request-URL指定的资源不同的操作方式   注意: 1)方法名称是 ...

  8. spring mvc 静态资源版本控制

    spring bean 文件中增加 <bean class="cn.zno.smse.common.context.VersionServletContext">< ...

  9. struts2从浅至深(五)上传与下载

    1.编写上传页面 2.编写动作方法 import java.io.File;import java.io.IOException; import javax.servlet.ServletContex ...

  10. java web代码规范:

    每个类前要有注释,类前的注释格式是: /** *类是干什么的 *@author  编写该类的作者 */ 类中的每个方法前也要有注释: /** *该方法是干什么的 *@param 该方法中传入的参数 * ...