系列文章目录
本系列主要分为以下六大部分,正在更新中,尽请期待!
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
🚩点击关注本专栏
提示:已经更新的或正在更新的文章前面打勾了哈!
文章目录
前言
镜像是Docker三大核心概念中最重要的,自 Docker诞生之日起镜像就是docker社区最为热门得关键词。
那么镜像为什么会有如此高的热度呢?
一、什么是镜像?
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker会尝试先从默认镜像仓库下载(默认使用
Docker Hub
公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
常见的镜像仓库服务是Docker hub,但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地Docker主机,读者可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。
镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
二、下载镜像
1. 拉取镜像
使用
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
来拉取某个镜像
描述一个镜像需要包括“名称+标签”信息,如上,其中NAME是镜像仓库名称(用来区分镜像),TAG是镜像的标签(往往用来表示版本信息)。
对于 Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新
版本的镜像。
一般来说,镜像的 latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。
严格地讲,镜像的仓库名称中还应该添加仓库地址(即 registry,注册服务器)作为前缀,不添加的时候
默认使用的是官方 DockerHub服务。
docker pull ubuntu:18.04
命令相当于
docker pull registry.hub.docker.com/ubuntu:18.04
命令,即从默认的注册服务器DockerHub registry中的ubuntu仓库下载标记为18.04的景象。
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用,执行打印"Hello World"命令。如下:
# 下载镜像
docker pull ubuntu:18.04# 使用镜像创建一个容器
docker run -it ubuntu:18.04 bash
echo "Hello World"exit
2. 镜像仓库
Docker镜像存储在镜像仓库服务( Image Registry)当中。 Docker客户端的镜像仓库服务是可配置的,默认使用 Docker hub,我这里配置的是阿里云的镜像仓库。
镜像仓库服务包含多个镜像仓库( Image Repository)同样,一个镜像仓库中可以包含多个镜像。
可能这听起来让人有些迷惑,所以下图展示了包含3个镜像仓库的镜像仓库服务,其中每个镜像仓库都包含一个或多个镜像。
官方和非官方镜像仓库Docker hub也分为官方仓库( Official Repository)和非官方仓库(Unofficial Repository)
- 官方仓库中的镜像是由 Docker公司审查的。这意味着其中的镜像会及时更新由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践。
- 非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库中也有一些很优秀的镜像,在信任非官方仓库镜像代码之前保持谨慎。说实话,在使用仼何从互联网上下载的软件之前,都要小心,甚至是使用那些来自官方仓库的镜像时也应如此。
三、查看镜像
使用
docker images
或
docker image ls
命令可以列出本地主机上已有镜像的基本信息。
列出镜像的基本信息包括了以下内容:
- 来自于哪个仓库,比如 ubuntu表示 ubuntu系列的基础镜像;
- 镜像的标签信息,比如18.04、 latest表示不同的版本信息。标签只是标记,并不能标识镜像内容;
- **镜像的ID(唯一标识镜像)**,如果两个镜像的ID相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;
- 创建时间,说明镜像最后的更新时间;
- 镜像大小,优秀的镜像往往体积都较小;
除此之外images还有很多得子命令,images子命令主要支持如下选项:
// 列出所有(包括临时文件)镜像文件,默认为否;--all=true|false 或 -a=true|false// 列出镜像的数字摘要值,默认为否;--digests=true|false// 过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等;--filter=[] 或 -f=[]// 控制输出格式,如.ID代表I信息, .Repository代表仓库信息等--format="TEMPLATE"// 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是;--no-trunc=true|false// 仅输出ID信息,默认为否--quiet=true|false 或 -q=true|false
更多子命令可以通过
man docker-images
来查看。
使用
docker inspect NAME[:TAG|@DIGEST]
命令查看详细信息,如下:
docker inspect ubuntu:18.04
上面代码返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用-f来指定。
例如:获取镜像的 Architecture(软件结构)
docker inspect -f {{".Architecture"}} ubuntu:18.04
四、搜索镜像
使用
docker search [ option] keyword
命令可以搜索镜像
支持的命令选项主要包括:
// 过滤输出内容-f filter 或 --filter filter
//格式化输出内容--format string
//限制输出结果个数,默认为25个--limit int//不截断输出结果--no-trunc
示例:
//搜索官方提供的带nginx关键字的镜像
docker search --filter=is-official=true nginx
//搜索所有收藏数超过4的关键词包括 tensorfow的镜像
docker search --filter=stars=4 tensorflow
五、删除镜像
使用
docker rmi
或者
docker image rm
可以删除镜像。
当同一个镜像拥有多个标签的时候,
docker rmi
命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。
因此上述操作相当于只是删除了镜像的一个标签副本而已,但是如果只剩下一个标签就要小心了,此时会彻底删除镜像。
在删除的时候我们可以选择附带以下条件
// 强制删除镜像,即使有容器依赖它-f 或 -force
//不要清理未带标签的父镜像-no-prune
当使用
docker rmi
命令,并且后面跟上镜像的ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意!当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。
这时候如果想强行删除镜像,可以使用 -f 参数,如下:
docker rmi -f ubuntu:18.04
但是,我们通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。
正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。如下:
//首先删除容器a21c0840213e
docker rm a21c0840213e
//然后使用ID来删除镜像,此时会正常打印出删除的各层信息
docker rmi as2b1na12cna
六、清理镜像
使用 Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过
docker image prune
命令来进行清理。
支持选项包括:
// 删除所有无用镜像,不光是临时镜像;-a 或 -all
// 只清理符合给定过滤器的镜像-filter filter
// 强制删除镜像,而不进行提示确认。-f 或 -force
看看本专栏文章有哪些吧!
本系列文章目录:
- 『 云原生·生之门』
- 『 云原生·前置知识』
- 『 云原生·Docker』
- 『 云原生·Kubernetes』
- 『 云原生·KubeSphere』
- 『 云原生·DevOps』
可以看出来本系列文章将会带你从-1到1的学习云原生的,一起加油吧!
总结
镜像是使用 Docker的前提,也是最基本的知识。所以大家一定要熟练镜像得相关基本操作,在后续章节,笔者将继续介绍 Docker镜像的操作技巧。
版权归原作者 abcccccccccccccccode 所有, 如有侵权,请联系我们删除。