Docker镜像.docx
- 文档编号:25856552
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:26
- 大小:159.45KB
Docker镜像.docx
《Docker镜像.docx》由会员分享,可在线阅读,更多相关《Docker镜像.docx(26页珍藏版)》请在冰豆网上搜索。
Docker镜像
Docker镜像(image)详解
如果曾经做过VM管理员,则可以把 Docker 镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器;而作为一名研发人员,则可以将镜像理解为类(Class)。
首先需要先从镜像仓库服务中拉取镜像。
常见的镜像仓库服务是DockerHub,但是也存在其他镜像仓库服务。
拉取操作会将镜像下载到本地Docker主机,可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。
镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。
前面多次提到镜像就像停止运行的容器(类)。
实际上,可以停止某个容器的运行,并从中创建新的镜像。
在该前提下,镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构,如下图所示。
镜像和容器
上图从顶层设计层面展示了镜像和容器间的关系。
通常使用dockercontainerrun和dockerservicecreate命令从某个镜像启动一个或多个容器。
一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。
尝试删除镜像而不停止或销毁使用它的容器,会导致出错。
镜像通常比较小
容器目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用/服务运行所必需的操作系统和应用文件。
但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。
例如,Docker镜像通常不会包含6个不同的 Shell 让读者选择——通常Docker镜像中只有一个精简的Shell,甚至没有Shell。
镜像中还不包含内核——容器都是共享所在Docker主机的内核。
所以有时会说容器仅包含必要的操作系统(通常只有操作系统文件和文件系统对象)。
提示:
Hyper-V容器运行在专用的轻量级VM上,同时利用VM内部的操作系统内核。
Docker官方镜像Alpine Linux 大约只有4MB,可以说是Docker镜像小巧这一特点的比较典型的例子。
但是,镜像更常见的状态是如Ubuntu官方的Docker镜像一般,大约有110MB。
这些镜像中都已裁剪掉大部分的无用内容。
Windows镜像要比Linux镜像大一些,这与WindowsOS工作原理相关。
比如,未压缩的最新Microsoft.NET镜像(microsoft/dotnet:
latest)超过1.7GB。
WindowsServer2016NanoServer镜像(microsoft/nanoserver:
latest)在拉取并解压后,其体积略大于1GB。
拉取镜像
Docker主机安装之后,本地并没有镜像。
dockerimagepull 是下载镜像的命令。
镜像从远程镜像仓库服务的仓库中下载。
默认情况下,镜像会从DockerHub的仓库中拉取。
dockerimagepullalpine:
latest命令会从DockerHub的alpine仓库中拉取标签为latest的镜像。
LinuxDocker主机本地镜像仓库通常位于/var/lib/docker/
\ProgramData\docker\windowsfilter。
可以使用以下命令检查Docker主机的本地仓库中是否包含镜像。
$dockerimagels
REPOSITORYTAGIMAGEIDCREATEDSIZE
将镜像取到Docker主机本地的操作是拉取。
所以,如果读者想在Docker主机使用最新的Ubuntu镜像,需要拉取它。
通过下面的命令可以将镜像拉取到本地,并观察其大小。
提示:
如果使用Linux,并且还没有将当前用户加入到本地DockerUNIX组中,则需要在下面的命令前面添加sudo。
Windows示例如下。
>dockerimagepullmicrosoft/powershell:
nanoserver
nanoserver:
Pullingfrommicrosoft/powershell
bce2fbc256ea:
Pullcomplete
58f68fa0ceda:
Pullcomplete
04083aac0446:
Pullcomplete
e42e2e34b3c8:
Pullcomplete
0c10d79c24d4:
Pullcomplete
715cb214dca4:
Pullcomplete
a4837c9c9af3:
Pullcomplete
2c79a32d92ed:
Pullcomplete
11a9edd5694f:
Pullcomplete
d223b37dbed9:
Pullcomplete
aee0b4393afb:
Pullcomplete
0288d4577536:
Pullcomplete
8055826c4f25:
Pullcomplete
Digest:
sha256:
090fe875...fdd9a8779592ea50c9d4524842
Status:
Downloadednewerimageformicrosoft/powershell:
nanoserver
>
>dockerimagepullmicrosoft/dotnet:
latest
latest:
Pullingfrommicrosoft/dotnet
bce2fbc256ea:
Alreadyexists
4a8c367fd46d:
Pullcomplete
9f49060f1112:
Pullcomplete
0334ad7e5880:
Pullcomplete
ea8546db77c6:
Pullcomplete
710880d5cbd5:
Pullcomplete
d665d26d9a25:
Pullcomplete
caa8d44fb0b1:
Pullcomplete
cfd178ff221e:
Pullcomplete
Digest:
sha256:
530343cd483dc3e1...6f0378e24310bd67d2a
Status:
Downloadednewerimageformicrosoft/dotnet:
latest
>
>dockerimagels
REPOSITORYTAGIMAGEIDCREATEDSIZE
microsoft/dotnetlatest831..686d7hrsago1.65GB
microsoft/powershellnanoserverd06..54278daysago1.21GB
就像读者看到的一样,刚才拉取的镜像已经存在于Docker主机本地仓库中。
同时可以看到Windows镜像要远大于Linux镜像,镜像中分层也更多。
镜像仓库服务
Docker镜像存储在镜像仓库服务(ImageRegistry)当中。
Docker客户端的镜像仓库服务是可配置的,默认使用DockerHub。
镜像仓库服务包含多个镜像仓库(ImageRepository)。
同样,一个镜像仓库中可以包含多个镜像。
可能这听起来让人有些迷惑,所以下图展示了包含3个镜像仓库的镜像仓库服务,其中每个镜像仓库都包含一个或多个镜像。
官方和非官方镜像仓库
DockerHub也分为官方仓库(OfficialRepository)和非官方仓库(UnofficialRepository)。
顾名思义,官方仓库中的镜像是由Docker公司审查的。
这意味着其中的镜像会及时更新,由高质量的代码构成,这些代码是安全的,有完善的文档和最佳实践。
非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!
非官方仓库中也有一些很优秀的镜像。
在信任非官方仓库镜像代码之前需要我们保持谨慎。
说实话,读者在使用任何从互联网上下载的软件之前,都要小心,甚至是使用那些来自官方仓库的镜像时也应如此。
大部分流行的操作系统和应用在DockerHub的官方仓库中都有其对应镜像。
这些镜像很容易找到,基本都在DockerHub命名空间的顶层。
镜像命名和标签
只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用“:
”分隔)。
从官方仓库拉取镜像时,dockerimagepull命令的格式如下。
dockerimagepull
在之前的Linux示例中,通过下面的两条命令完成Alpine和Ubuntu镜像的拉取。
dockerimagepullalpine:
latest
dockerimagepullubuntu:
latest
这两条命令从alpine和ubuntu仓库拉取了标有“latest”标签的镜像。
下面来介绍一下如何从官方仓库拉取不同的镜像。
$dockerimagepullmongo:
3.3.11
//该命令会从官方Mongo库拉取标签为3.3.11的镜像
$dockerimagepullredis:
latest
//该命令会从官方Redis库拉取标签为latest的镜像
$dockerimagepullalpine
//该命令会从官方Alpine库拉取标签为latest的镜像
关于上述命令,需要注意以下几点。
首先,如果没有在仓库名称后指定具体的镜像标签,则Docker会假设用户希望拉取标签为latest的镜像。
其次,标签为latest的镜像没有什么特殊魔力!
标有latest标签的镜像不保证这是仓库中最新的镜像!
例如,Alpine仓库中最新的镜像通常标签是edge。
通常来讲,使用latest标签时需要谨慎!
从非官方仓库拉取镜像也是类似的,读者只需要在仓库名称面前加上DockerHub的用户名或者组织名称。
下面通过示例来展示如何从tu-demo仓库中拉取v2这个镜像,其中镜像的拥有者是DockerHub账户nigelpoulton,一个不应该被信任的账户。
$dockerimagepullnigelpoulton/tu-demo:
v2
//该命令会从以我自己的DockerHub账号为命名空间的tu-demo库中下载标签为v2的镜像
在之前的Windows示例中,使用下面的两条命令拉取了PowerShell和.NET镜像。
>dockerimagepullmicrosoft/powershell:
nanoserver
>dockerimagepullmicrosoft/dotnet:
latest
第一条命令从microsoft/powershell仓库中拉取了标签为nanoserver的镜像,第二条命令从microsoft/dotnet仓库中拉取了标签为latest的镜像。
如果希望从第三方镜像仓库服务获取镜像(非DockerHub),则需要在镜像仓库名称前加上第三方镜像仓库服务的DNS名称。
假设上面的示例中的镜像位于Google容器镜像仓库服务(GCR)中,则需要在仓库名称前面加上gcr.io,如dockerpullgcr.io/nigelpoulton/tu-demo:
v2(这个仓库和镜像并不存在)。
可能需要拥有第三方镜像仓库服务的账户,并在拉取镜像前完成登录。
为镜像打多个标签
关于镜像有一点不得不提,一个镜像可以根据用户需要设置多个标签。
这是因为标签是存放在镜像元数据中的任意数字或字符串。
一起来看下面的示例。
在 dockerimagepull 命令中指定-a参数来拉取仓库中的全部镜像。
接下来可以通过运行 dockerimagels查看已经拉取的镜像。
如果使用Windows示例,则可以将Linux示例中的镜像仓库nigelpoulton/tu-demo替换为microsoft/nanoserver。
如果拉取的镜像仓库中包含用于多个平台或者架构的镜像,比如同时包含Linux和Windows的镜像,那么命令可能会失败。
$dockerimagepull-anigelpoulton/tu-demo
latest:
Pullingfromnigelpoulton/tu-demo
237d5fcd25cf:
Pullcomplete
a3ed95caeb02:
Pullcomplete
Digest:
sha256:
42e34e546cee61adb1...3a0c5b53f324a9e1c1aae451e9
v1:
Pullingfromnigelpoulton/tu-demo
237d5fcd25cf:
Alreadyexists
a3ed95caeb02:
Alreadyexists
Digest:
sha256:
9ccc0c67e5c5eaae4b...624c1d5c80f2c9623cbcc9b59a
v2:
Pullingfromnigelpoulton/tu-demo
237d5fcd25cf:
Alreadyexists
a3ed95caeb02:
Alreadyexists
Digest:
sha256:
d3c0d8c9d5719d31b7...9fef58a7e038cf0ef2ba5eb74c
Status:
Downloadednewerimagefornigelpoulton/tu-demo
$dockerimagels
REPOSITORYTAGIMAGEIDCREATEDSIZE
nigelpoulton/tu-demov26ac21e..bead1yrago211.6MB
nigelpoulton/tu-demolatest9b915a..1e291yrago211.6MB
nigelpoulton/tu-demov19b915a..1e291yrago211.6MB
刚才发生了如下几件事情。
首先,该命令从nigelpoulton/tu-demo仓库拉取了3个镜像:
latest、v1以及v2。
其次,注意看 dockerimagels 命令输出中的IMAGEID这一列。
发现只有两个不同的ImageID。
这是因为实际只下载了两个镜像,其中有两个标签指向了相同的镜像。
换句话说,其中一个镜像拥有两个标签。
如果仔细观察会发现v1和latest标签指向了相同的IMAGEID,这意味着这两个标签属于相同的镜像。
这个示例也完美证明了前文中关于latest标签使用的警告。
latest标签指向了v1标签的镜像。
这意味着latest实际指向了两个镜像中较早的那个版本,而不是最新的版本!
latest是一个非强制标签,不保证指向仓库中最新的镜像!
过滤 dockerimagels 的输出内容
Docker提供--filter参数来过滤 dockerimagels 命令返回的镜像列表内容。
下面的示例只会返回悬虚(dangling)镜像。
$dockerimagels--filterdangling=true
REPOSITORYTAGIMAGEIDCREATEDSIZE
那些没有标签的镜像被称为悬虚镜像,在列表中展示为
通常出现这种情况,是因为构建了一个新镜像,然后为该镜像打了一个已经存在的标签。
当此情况出现,Docker会构建新的镜像,然后发现已经有镜像包含相同的标签,接着Docker会移除旧镜像上面的标签,将该标签标在新的镜像之上。
例如,首先基于alpine:
3.4构建一个新的镜像,并打上dodge:
challenger标签。
然后更新Dockerfile,将alpine:
3.4替换为alpine:
3.5,并且再次执行 dockerimagebuild 命令,该命令会构建一个新的镜像,并且标签为dodge:
challenger,同时移除了旧镜像上面对应的标签,旧镜像就变成了悬虚镜像。
可以通过 dockerimageprune 命令移除全部的悬虚镜像。
如果添加了-a参数,Docker会额外移除没有被使用的镜像(那些没有被任何容器使用的镜像)。
Docker目前支持如下的过滤器。
∙dangling:
可以指定true或者false,仅返回悬虚镜像(true),或者非悬虚镜像(false)。
∙before:
需要镜像名称或者ID作为参数,返回在之前被创建的全部镜像。
∙since:
与before类似,不过返回的是指定镜像之后创建的全部镜像。
∙label:
根据标注(label)的名称或者值,对镜像进行过滤。
dockerimagels命令输出中不显示标注内容。
其他的过滤方式可以使用reference。
下面就是使用reference完成过滤并且仅显示标签为latest的示例。
$dockerimagels--filter=reference="*:
latest"
REPOSITORYTAGIMAGEIDCREATEDSIZE
alpinelatest3fd9065eaf028daysago4.15MB
testlatest8426e7efb7773daysago122MB
可以使用--format参数来通过Go模板对输出内容进行格式化。
例如,下面的指令将只返回Docker主机上镜像的大小属性。
$dockerimagels--format"{{.Size}}"
99.3MB
111MB
82.6MB
88.8MB
4.15MB
108MB
使用下面命令返回全部镜像,但是只显示仓库、标签和大小信息。
$dockerimagels--format"{{.Repository}}:
{{.Tag}}:
{{.Size}}"
dodge:
challenger:
99.3MB
ubuntu:
latest:
111MB
python:
3.4-alpine:
82.6MB
python:
3.5-alpine:
88.8MB
alpine:
latest:
4.15MB
nginx:
latest:
108MB
如果读者需要更复杂的过滤,可以使用OS或者Shell自带的工具,比如Grep或者AWK。
通过CLI方式搜索DockerHub
dockersearch 命令允许通过CLI的方式搜索DockerHub。
可以通过“NAME”字段的内容进行匹配,并且基于返回内容中任意列的值进行过滤。
简单模式下,该命令会搜索所有“NAME”字段中包含特定字符串的仓库。
例如,下面的命令会查找所有“NAME”包含“nigelpoulton”的仓库。
$dockersearchnigelpoulton
NAMEDESCRIPTIONSTARSAUTOMATED
nigelpoulton/pluralsight..Webappusedin...8[OK]
nigelpoulton/tu-demo7
nigelpoulton/k8sbookKubernetesBookwebapp1
nigelpoulton/web-fe1Webfrontendexample0
nigelpoulton/hello-cloudQuickhello-worldimage0
“NAME”字段是仓库名称,包含了DockerID,或者非官方仓库的组织名称。
例如,下面的命令会列出所有仓库名称中包含“alpine”的镜像。
$dockersearchalpine
NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED
alpineAminimalDocker..2988[OK]
mhart/alpine-nodeMinimalNode.js..332
anapsix/alpine-javaOracle Java 8...270[OK]
需要注意,上面返回的镜像中既有官方的也有非官方的。
读者可以使用--filter"is-official=true",使命令返回内容只显示官方镜像。
$dockersearchalpine--filter"is-official=true"
NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED
alpineAminimalDocker..2988[OK]
重复前面的操作,但这次只显示自动创建的仓库。
$dockersearchalpine--filter"is-automated=true"
NAMEDESCRIPTIONOFFICIALAUTOMATED
anapsix/alpine-javaOracleJava8(and7)..[OK]
frolvlad/alpine-glibcAlpineDockerimage..[OK]
kiasaki/alpine-postgresPostgreSQLdocker..[OK]
zzrot/alpine-caddyCaddyServerDocker..[OK]
关于 dockersearch 需要注意的最后一点是,默认情况下,Docker只返回25行结果。
但是,可以通过指定--limit参数来增加返回内容行数,最多为100行。
镜像和分层
Docker镜像由一些松耦合的只读镜像层组成。
如下图所示。
Docker负责堆叠这些镜像层,并且将它们表示为单个统一的对象。
查看镜像分层的方式可以通过dockerimageinspect命令。
下面同样以ubuntu:
latest镜像为例。
$dockerimageinspectubuntu:
latest
[
{
"Id":
"sha256:
bd3d4369ae.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Docker