259°

三、Docker引擎、镜像、容器

1、Docker引擎

Docker engine 是运行和管理容器的核心软件,我们常简单称为Docker或Docker平台,其与VMware的ESXi有点像。

Docker engine采用模块化的设计,且有许多可插拔组件。其基于Open Container Initiative(OCI)制定的开放标准。

组成Docker engine的三个主要部件:daemon、containerd、runc,如下图所示:

runc:小巧且轻量级的针对libcontainer的CLI包装器,在生命周期中的一个单一目的是create containers。实际上是一个独立的容器运行时工具。

containerd :主要包括容器的执行逻辑,唯一目的是管理容器的生命周期操作: start | stop | pause | rm....
例子:启动一个新容器

命令:docker container run

$ docker container run --name ctr1 -it alpine:latest sh (基于alpine:latest镜像启动一个新容器)

当在Docker client输入上述命令时,将其转换成 合适的API payload,然后把他们POSTs到正确的API端点。

注:daemon不包含任何创建容器的代码,其与containerd通过CRUD-style API进行通信。

2、Docker镜像

Docker images类似于VM templates。A VM template 像一个 stopped VM — a Docker image像一个 stopped container. 如果您是开发者,你可以认为它与classes一样。

你可以从一个镜像仓库拉取镜像。最流行的镜像仓库是https://hub.docker.com。

镜像由多层组成,层叠在一起,并表示为单个对象。镜像内部是一个精简版的OS以及运行应用程序所需要的全部文件和依赖。因为容器旨在快速和轻便,镜像往往很小。二者关系如下图所示:

命令docker container run 和 docker service create可以从一个单一镜像启动一个或多个容器。一旦从一个镜像启动了一个容器,二者就就相互依赖。直到最后一个使用此镜像的容器停止和销毁后,才能删除此镜像。否则会提示无法删除错误。

容器的目的是运行一个应用程序或者服务,这意味创建容器的镜像必须包含运行服务或者应用程序的所有OS和应用程序文件。所有运行在Docker主机上的容器共享主机内核。为此,镜像仅包含足够的操作系统(通常是OS相关的文件和文件系统对象)。

由于Windows OS工作的方式,基于Windows的镜像比基于Linux的镜像要大很多。

在基于Linux的Docker主机上,本地镜像仓库位于/var/lib/docker/<storage-driver>,在基于Windows的Docker主机上,位于C:\ProgramData\docker\windowsfilter。可通过如下命令在查看本地仓库中的镜像:

docker image ls

使用docker image pull命令可从远程镜像仓库拉取镜像到本地镜像仓库。
镜像注册(Image registries)

Docker镜像存储在image registries。最常用的registry是Docker Hub(https://hub.docker.com)。Image registries包含多个镜像仓库,反之,镜像仓库可以包含多个镜像。如下图所示。

Docker Hub有官方仓库和非官方仓库的概念。

大多数流行的操作系统和应用程序在Docker Hub上都有自己的官方仓库,他们通常位于Docker Hub命名空间的最顶层。如下所示:

  • nginx: https://hub.docker.com/_/nginx/
  • busybox: https://hub.docker.com/_/busybo
  • redis: https://hub.docker.com/_/redis/
  • mongo: https://hub.docker.com/_/mongo/

镜像命名和标签(Image naming and tagging)

通过给定由“:”分割的仓库名称和标签,可以很简单的从官方仓库寻找镜像。命令如下:

docker image pull <repository>:<tag>

例如:docker image pull alpine:latest 和docker image pull ubuntu:latest
上述两个命令拉取 images 标签为 “latest” 从the “alpine” 和 “ubuntu” repositories.

注意:标记为“latest”标签的镜像并不一定是仓库中的最新镜像。

如下命令可以拉取此仓库中指定名称的所有镜像(通过在docker image pull 命令行增加 -a):

docker image pull -a nigelpoulton/tu-demo

(注:如果拉取仓库中包含的镜像为多架构和多平台,上述命令可能会失败)

过滤docker image ls的输出

通过添加标签 --filter,如docker image ls --filter dangling=true

A dangling image is an image that is no longer tagged, and appears in listings as <none>:<none>.

产生的原因是因为在构建新的镜像时,使用了已经存在的标签来打标签。比如, 基于alpine:3.4构建 镜像并打标签为.然后更新Dockerfile用alpine:3.5替换alpine:3.4 ,运行同样的构建命令。这将会创建新的镜像且标签为dodge:challenger,从旧镜像移除标签。旧镜像就变为dangling。可使用命令 docker image prune来删除所有的dangling镜像。如果增加-a标志,则会删除所有未使用的镜像(未被任何容器使用的镜像)

Docker仅仅是一组松散耦合的只读的层,如下图所示:

可以通过docker image inspect image-name来查看一个image所包含的layers。多个镜像可以共享相同的layer,可以节省空间和提高性能。

通过摘要拉取镜像

前面讲了使用tag来拉取镜像,这存在一个问题-tag是可变的。可能存在偶然用错误的标签 标注了镜像,也有可能对不同的image使用了相同的tag,这都可能引起问题。

Docker1.10引进了一个新的内容寻址存储模型。作为这个模型的一部分,所有的镜像获取一个加密的内容哈希。也称之为摘要,因为摘要是镜像内容的哈希,改变镜像内容而不改变摘要是不可能的,意味着摘要是不可变的,这可以解决上述问题。

在每次拉取镜像时,docker image pull命令包含了镜像摘要,作为返回码的一部分。也可以通过docker image ls --digests image-name来查看镜像的摘要

多架构镜像

Docker支持多架构镜像。这意味着一个单一的镜像可以支持多平台和多架构 (比如Linux on x64,Linux on PowerPC, Windows x64, ARM 等)。为达到目的,Registry API支持两个重要的构造:

  • manifest lists (new)
  • manifests

如下图所示:

删除镜像

docker image rm imageID

3、Docker容器

本文由【倪伟伟】发布于开源中国,原文链接:https://my.oschina.net/niweiwei/blog/3058496

全部评论: 0

    我有话说: