使用Docker镜像

本文详细介绍了Docker镜像的获取、查看、搜索、删除和创建等操作,包括使用`docker pull`下载镜像,`docker images`列出信息,`docker tag`添加标签,`docker search`搜寻镜像,`docker rm`删除镜像,以及基于已有容器创建新镜像。强调了镜像在Docker中的重要性,并提示用户注意镜像的管理和版本控制。

提示:本篇文章一共8368字,大概需要20分钟读完

系列文章目录

第一章 Docker与容器
第二章 Docker核心概念
第三章 CentOS环境下安装Docker
第四章 使用Docker镜像



前言

镜像是Docker三大核心概念中最重要的,自Docker诞生之日起镜像就是相关社区热门的关键词。

Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试使用默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库,用户也可以通过配置,使用自定义的镜像仓库。)

本章将围绕镜像这一核心概念介绍具体操作,包括如何使用pull命令从Docker中下载镜像到本地;如何查看本地已有的镜像信息和管理镜像的标签;如何在远端仓库中使用search命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像且保存为外部文件。最后,还将介绍如何往Docker Hub仓库中推送自己的镜像。


一、获取镜像

镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。本节主要介绍Docker镜像的pull子命令。

docker pull [选项] [Docker Registry地址]<仓库名>:<标签>

【注意】
1、[Docker Registry地址]如果没有指定地址,那么默认通过Docker Hub进行下载。
2、 <仓库名>主要用户区分不同的镜像
3、 <标签>主要用来区分版本

通常情况下,描述一个镜像需要包括“名称+标签”信息。例如,获取一个 Ubuntu 18.04系统的基础镜像可以使用如下的命令:

 docker pull ubuntu:18.04

在这里插入图片描述
对于Docker来说,如果没有显式地指定TAG标签,那么就会默认下载最新版本的镜像。

docker pull ubuntu

在这里插入图片描述

【注意】
一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变而变化,内容是不稳定的。因此在生产过程中,一般不要忽略镜像的标签信息或者用默认的 latest 标记的镜像。

严格意义上讲,镜像的仓库还应该添加仓库地址(即 registry,注册服务器)作为前缀,只是默认使用的是官方Docker Hub服务,该前缀可以忽略。

例如,docker pull ubuntu:18.04命令相当于 docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为18.04的镜像。

如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜像,可以使用如下命令,此时下载的命令为: docker pull hub.c.163.com/public/ubuntu:18.04

pull子命令支持的选项主要包括:

  • -a ,--all-tags=true | false:是否获取仓库中的所有镜像,默认为否;
  • --disable-content-trust:取消镜像的内容校验,默认为真。

另外,有时需要使用镜像代理服务来加速Docker镜像获取过程,可以在Docker服务启动配置中增加--registry-mirror=proxy_URL来指定镜像代理服务地址(如 https://registry.docker-cn.com)。

下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash 应用,执行打印“ Hello World ”命令:

docker run - it ubuntu :18.04 bash 
root @65663247040f:/# echo "He1lo World " Hello World 
root @65663247040f:/# exit 

二、查看镜像信息

本节主要介绍Docker镜像的ls、tag和inspect子命令。

1.使用images命令列出镜像

使用docker images或docker image ls命令可以列出本地主机上已有镜像的基本信息。

例如,下面的命令列出了上一小节中下载的镜像信息:

docker images

在这里插入图片描述

在列出信息中,可以看到几个字段信息:

  • 来自于哪个仓库,比如ubuntu表示ubuntu系列的基础镜像;
  • 镜像的标签信息,比如18.04、latest表示不同的版本信息。标签只是标记,并不能标识镜像内容;
  • 镜像的ID(唯一标识镜像),如果两个镜像的ID相同,说明它们实际上指向了同一
    个镜像,只是具有不同标签名称而已;
  • 创建时间,说明镜像最后的更新时间;
  • 镜像大小,优秀的镜像往往体积都较小。

其中镜像的ID信息十分重要,它唯一标识了镜像。在使用镜像ID的时候,一般可以使用该ID的前若干个字符组成的可区分串来替代完整的 ID 。

TAG信息用于标记来自同一个仓库的不同镜像。例如ubuntu仓库中有多个镜像,通过TAG信息来区分发行版本,如18.04、18.10等。

镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。

images子命令主要支持如下选项,用户可以自行进行尝试:

  • -a ,--all=true | false:列出所有(包括临时文件)镜像文件,默认为否;
  • --digests=true | false:列出镜像的数字摘要值,默认为否;
  • -f ,--filter=[]:过滤列出的镜像,如dangling=true 只显示没有被使用的镜像;也可指定带有特定标注的镜像等;
  • --format=" TEMPLATE":控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等;
  • -no-trunc=true l false:对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;
  • -q ,--quiet=true | false :仅输出ID信息,默认为否。

其中,还支持对输出结果进行控制的选项,如-f ,-filter=[]、--no-trunc=true | false 、-q 、--quiet=true | false等。

更多子命令选项还可以通过man docker -images来查看。

2.使用tag命令加镜像标签

为了方便在后续工作中使用特定镜像,还可以使用docker tag命令来为本地镜像任意加新的标签。例如,加一个新的myubuntu:latest 镜像标签:

docker tag ubuntu:latest myubuntu:latest

再次使用docker images列出本地主机上镜像信息,可以看到多了一个myubuntu:latest标签的镜像:
在这里插入图片描述

之后,用户就可以直接使用myubuntu:latest来表示这个镜像了。

细心的读者可能注意到,这些myubuntu:latest镜像的ID跟ubuntu:latest是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而已。docker tag命令加的标签实际上起到了类似链接的作用。

3.使用inspect命令査看详细信息

使用docker [image] inspect命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:

docker "image" inspect ubuntu:18.04

在这里插入图片描述
上面代码返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f来指定,例如,获取镜像的Architecture:

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

在这里插入图片描述

4.使用history命令查看镜像历史

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history子命令,该命令将列出各层的创建信息。
例如,查看ubuntu:18.04镜像的创建过程,可以使用如下命令:

docker history ubuntu:18.04

在这里插入图片描述
注意,过长的命令被自动截断了,可以使用前面提到的--no-trunc选项来输出完整命令。

docker history ubuntu:18.04 --no-trunc

在这里插入图片描述

三、搜寻镜像

本节主要介绍Docker镜像的search子命令。使用docker search命令可以搜索Docker Hub官方仓库中的镜像。语法为docker search [option] keyword。支持的命令选项主要包括:

  • -f ,--filter filter:过滤输出内容;
  • --format string:格式化输出内容;
  • --limit int:限制输出结果个数,默认为25个;
  • --no-trunc:不截断输出结果。
    例如,搜索官方提供的带nginx关键字的镜像,如下所示:
docker search --filter=is-official=true nginx

在这里插入图片描述
再比如,搜索所有收藏数超过4的关键词包括tensorflow的镜像:

docker search --filter=stars=4 tensorflow

在这里插入图片描述
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。

四、删除和清理镜像

本节主要介绍Docker镜像的rm和prune命令

1.使用标签删除镜像

使用docker rmidocker image rm命令可以删除镜像,命令格式为docker rmi IMAGE,其中IMAGE可以为标签或ID

支持选项包括:

  • -force:强制删除镜像,即使有容器依赖它;
  • ﹣no- prune:不要清理未带标签的父镜像。
    例如、要删除掉myubuntu:latest镜像,可以使用如下命令:
    docker rmi myubuntue:latest
    在这里插入图片描述

读者可能会想到,本地的ubuntu:latest镜像是否会受到此命令的影响。无须担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已、并不影响镜像文件。因此上述操作相当于只是删除了镜像2b55860d4c66的一个标签副本而已。

保险起见,再次直看本地的镜像,发现 ubuntu:latest 镜像(准确地说,2dc39ba059dc镜像)仍然存在:

docker images

在这里插入图片描述
但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi 命令会彻底删除镜像。

例如通过执行docker rmi命令来删除只有一个标签的镜像,可以看出会副除这个镜像文件的所有文件层:

docker rmi ubuntu:latest

在这里插入图片描述

2.使用镜像 ID 来删除镜像

当使用 docker rmi命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:先利用ubuntu:18.04镜像创建一个简单的容器来输出一段话:

docker run ubuntu:18.04 echo 'hello! i am here!'

在这里插入图片描述
使用docker ps -a命令可以看到本机上存在的所有容器:
在这里插入图片描述
可以看到,后台存在一个退出状态的容器,是刚基于ubuntu:18.04镜像创建的。试图删除该镜像,Docker会提示有容器正在运行,无法删除:

docker rmi ubuntu:18.04

在这里插入图片描述
如果要想强行删除镜像,可以使用-f参数:

docker rmi -f ubuntu:18.04

在这里插入图片描述
注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

首先查看创建的容器:

docker ps -a

在这里插入图片描述

然后删除容器2201a14cfcc5、e740917ae7d1、b6e28357c2b9三个容器

docker rm 2201a14cfcc5
docker rm e740917ae7d1
docker rm b6e28357c2b9

再通过docker images命令查找到ubuntu:18.04对应的ID
在这里插入图片描述
然后使用ID来删除镜像,此时会正常打印出删除的各层信息:

docker rmi 35b3f4f76a24

在这里插入图片描述

3.清理镜像

使用Docker段时间后,系统中可能会遗留一些临时的镜像文件,以及此没有被使用的镜像,可以通过docker image prune命令来进行清理。

支持选项包括:

  • -a,-all:删除所有无用镜像,不光是临时镜像;
  • -filter filter:只清理出符合filter过滤器的镜像;
  • -f, -force:强制清除镜像,而不进行确认;

例如,如下命令会西东清理临时的遗留镜像文件层,最后会提示释放的存储空间:

docker image prune -f

在这里插入图片描述

五、创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于
Dockerfile创建。

本节主要介绍Docker的commit、import和build子命令。

1.基于已有容器创建

该方法主要是使用docker “container” commit命令。
命令格式为docker [container] commit [OPTIONS] CONTAINER [REPOSITORY
[:TAG]],主要选项包括:

  • -a, --author="":作者信息;
  • -c,,--change=[] :提交的时候执行Dockerfile指令,包括CMD |ENTRYPOINT| ENV| EXPOSE | LABEL | ONBUILD | USER | VOLUME |WORKDIR等;
  • -m,--message="":提交消息;
  • -P,--pause=true: 提交时暂停容器运行。

下面将演示如何使用该命令创建一个新镜像。
首先,启动一个镜像,并在其中进行修改操作。例如, 创建一个test文件,之后退出,代码如下:

docker run -it ubuntu:18.04 /bin/bash

记住容器的ID为01cecb44cd3c 。此时该容器与原ubuntu:18.04镜像相比,已经发生了改变,可以使用docker [container] commit 命令来提交为个新的镜像。 提交时可以使用ID或名称来指定容器:

docker "container" commit -m "Added a new file" -a "Docker Newbee" 01cecb44cd3c test:0.1

在这里插入图片描述
此时在看本地镜像列表,会发现新创建的镜像已经存在了:

docker images

在这里插入图片描述


总结

本章具体介绍了围绕Docker镜像的系列重要命令操作, 包括获取,查看,搜索,
删除、 创建等。读者可以使用docker image help命令查看Docker支持的镜像操作子命令。

镜像是使用Docker的前提,也是最基本的资源。所以,在平时的Docker使用中,要注意积累自己定制的镜像文件,并将自己创建的高质量镜像分享到社区中。在后续章节,笔者将通过更多案例介绍Docker镜像的操作技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值