『 云原生·Docker』初识Docker镜像与Docker镜像操作(一)

系列文章目录

本系列主要分为以下六大部分,正在更新中,尽请期待!

  • 『 云原生·生之门』
  • 『 云原生·前置知识』
  • 『 云原生·Docker』
  • 『 云原生·Kubernetes』
  • 『 云原生·KubeSphere』
  • 『 云原生·DevOps』

点击关注本专栏


提示:已经更新的或正在更新的文章前面打勾了哈!

文章目录

  • 系列文章目录
  • 前言
  • 一、什么是镜像?
  • 二、下载镜像
    • 1. 拉取镜像
    • 2. 镜像仓库
  • 三、查看镜像
  • 四、搜索镜像
  • 五、删除镜像
  • 六、清理镜像
  • 总结


前言

镜像是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』初识Docker镜像与Docker镜像操作(一)_第1张图片

官方和非官方镜像仓库Docker hub也分为官方仓库( Official Repository)和非官方仓库(Unofficial Repository)

  1. 官方仓库中的镜像是由 Docker公司审查的。这意味着其中的镜像会及时更新由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践。

  2. 非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库中也有一些很优秀的镜像,在信任非官方仓库镜像代码之前保持谨慎。说实话,在使用仼何从互联网上下载的软件之前,都要小心,甚至是使用那些来自官方仓库的镜像时也应如此。

三、查看镜像

使用 docker imagesdocker 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镜像的操作技巧。

你可能感兴趣的:(『云原生专栏』,docker,云原生,容器,镜像)