您的位置:首页 > 运维架构 > Docker

Docker 镜像(1)

2020-06-30 15:14 104 查看

Docker镜像----简介

如果读者之前曾经是VM管理员,则可以把Docker镜像理解为VM模板,VM模板就像停止运行的VM,而Docker镜像就像停止运行的容器;如果读者是一名研发人员,可以将镜像理解为类(class)。

读者需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务是Docker Hub,但是也存在其他镜像库仓库服务。拉取操作会将镜像下载到本地Docker主机,读者可以使用该镜像启动一个或者多个容器。

镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。

Docker镜像---详解

前面多次提到镜像就像停止运行的容器(类)。实际上,读者可以停止容器的运行,并从中创建新的镜像。在该前提下,镜像可以理解为一种构建(build—time)结构,而容器可以理解一种运行时(run—time)结构,如下图

镜像和容器

一旦容器从镜像启动后,二者之间就变成了互相依赖的关系,并且在镜像上启动的容器全部停止之前,镜像是无法被删除的。尝试删除镜像而不停止或销毁使用它的镜像,会导致下面的错误。

镜像通常比较小

容器目的就是运行应用或者服务,这意味着容器的镜像中必须包含应用、服务运行所必需的操作系统和和应用文件。但是,容器又追求快速和小巧,这意味着构建镜像的时候通常需要裁剪掉不必要的部分,保持较小的体积。

例如,Docker镜像通常不会包含6个不同的shell让读者选择---通常Docker镜像中只会有精简的shell,甚至没有shell。镜像中还不包含内核----容器都是共享所在Docker主机的内核。

拉取镜像

Linux Docker主机本地镜像仓库通常位于/var/lib/docker/<storage-driver>,window Docker 主机则在C:\ProgramData\docker\windowfilter.

将镜像取到Docker主机本地的操作是拉取。所以,如果读者想在Docker主机使用最新的Ubuntu镜像,需要拉取它。

从 Docker Hub 的 ubuntu 仓库中拉取标签为 latest 的镜像

docker image pull ubuntu:latest

镜像仓库服务

Docker镜像存储在镜像仓库服务(Image Registry)当中。Docker客服端镜像的仓库服务是可配置的,默认使用Docker Hub。

镜像仓库服务包包含多个镜像仓库(Image Repository)。同样,一个镜像仓库中可以包含多个镜像。

官方和非官方镜像仓库

Docker Hub也分为官方仓库(Official Repository)和非官方仓库(Unofficial Repository)。

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

非官方仓库更像江湖侠客,其中的镜像不一定具备官方仓库的优点,但这并不意味着所有非官方仓库都是不好的!非官方仓库也有一些很优秀的镜像。读者需要做的是信任非官方仓库镜像代码之前保持谨慎。

大部分流行操作系统和应用在Docker Hub的官方仓库中都有其对应镜像。这些镜像很容易找到,基本都在Docker Hub命名空间的顶层。

镜像命名和标签

只需要给出镜像的名字和标签,就能在官方仓库中定位一个镜像(采用’:‘分割)。从官方仓库拉取镜像时,docker image pull命令格式如下

docker image pull <repository>:<tag>

在之前Linux实例中,通过下面的两条命令完成Alpine和ubuntu镜像的拉取

docker image pull alpine:latest

docker image pull ubuntu:latest

这两条命令从alpine和ubuntu仓库拉取有"latest"标签的镜像。

下面的实例显示如何从官方仓库拉取不同的镜像

$ docker image pull mongo:3.3.1

//该命令会从官方Mongo库拉取标签为3.3.11的镜像

$ docker image pull redis:latest

//该命令会从redis拉取标签为latest的镜像

$ docker image pull alpine:

//该命令会从官方alpine库拉取标签为latest的镜像

关于上述命令,需要注意以下几点。

  • 首先,如果没有在仓库名称后指定具体的镜像标签,则Docker会假设用户希望拉取标签为latest的镜像
  • 其次,标签为latest的镜像没有什么特殊魔力!标又latest标签的镜像不保证这是仓库中最新的镜像!例如Alpine仓库中最新的镜像通常标签是edge。

从非官方仓库拉取镜像也是类似的,读者只需要在仓库面前加上Docker Hub的用户名或者组织名称。下面的示例展示了如何从tu-demo仓库中拉取v2这个镜像,其中镜像的拥有者是Docker Hub账户nigelpoulton

$ docker image pull nigelpoulton/tu-demo:v2

//该命令会从以我自己的Docker Hub账号为命名空间的tu-demo库中下载标签为v2的镜像

为镜像打多个标签

关于镜像有一点不得不提,一个镜像可以根据用户需要设置多个标签。这是因为标签是存放在镜像元数据中任意数字或字符串。一起来看下面的示例。

在docker image pull命令中指定-a参数来拉取仓库中全部镜像。接下来可以通过运行docker image ls查看已经拉取的镜像。

$ docker image pull -a nigelpoulton/tu-demo

latest: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Pull complete
a3ed95caeb02: Pull complete
<Snip>
Digest: sha256:42e34e546cee61adb1...3a0c5b53f324a9e1c1aae451e9
v1: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Already exists
a3ed95caeb02: Already exists
<Snip>
Digest: sha256:9ccc0c67e5c5eaae4b...624c1d5c80f2c9623cbcc9b59a
v2: Pulling from nigelpoulton/tu-demo
237d5fcd25cf: Already exists
a3ed95caeb02: Already exists
<Snip>
Digest: sha256:d3c0d8c9d5719d31b7...9fef58a7e038cf0ef2ba5eb74c
Status: Downloaded newer image for nigelpoulton/tu-demo

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nigelpoulton/tu-demo v2 6ac21e..bead 1 yr ago 211.6 MB
nigelpoulton/tu-demo latest 9b915a..1e29 1 yr ago 211.6 MB
nigelpoulton/tu-demo v1 9b915a..1e29 1 yr ago 211.6 MB

  • 该命令从nigelpoulton/tu-demo仓库拉取了3个镜像:latest、v1以及v2.
  • 输入docker image ls命令发现IMAGE ID这一列。读者会发现只有两个不同的Image ID。这是因为实际只下载了两个镜像,其中有两个标签指向了相同的镜像。换句话,其中一个镜像有两个镜像。

这个示例也完美证明了前文中关于latest标签使用的警告。在本例中,latest标签指向了v1标签。这意味着latest实际指向了两个镜像中较早的那个版本,而不是最新的版本! latest是一个非强制标签,不保证指向仓库中最新的镜像。

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: