Docker 包括三大核心概念:镜像(Image)、容器(Container)和仓库(Repository)。
(1)镜像
镜像类似于虚拟机镜像,可以把它理解为一个只读的模板。例如,一个包含 Nginx 应用程序的镜像,其内部包含一个基本的操作系统环境以及 Nginx 应用程序 。 镜像是创建 Docker 容器的基础,通过版本管理和增量文件系统, Docker 提供了一套机制来创建或更新现有的镜像,我们还可以从网上下载并使用别人已经做好的镜像。
(2)容器
Docker 容器类似于一个轻量级沙箱, Docker 利用容器来运行和隔离上层应用。容器与镜像的关系类似于面向对象编程中的对象与类。从镜像中创建的应用,在容器中运行实例,从而保证实例之间不会相互影响。容器可以启动 、 开始 、 停止 、 删除,并且这些容器都是彼此相互隔离 、 互不可见的。
镜像本身是只读的,而容器会在启动镜像时,在镜像的最上层创建一个可写层,执行一些必要的写入操作。
(3)仓库
Docker 仓库类似于代码仓库,是集中存放 Docker 镜像文件的地方。根据所存储的镜像是否公开,我们可以把仓库分为公开仓库 ( Public ) 和私有仓库 ( Private ) 两种形式。
目前,最大的公开仓库是官方提供的 Docker Hub,其中存放着数量庞大的镜像供我们下载使用。国内也有不少云服务提供商 ( 如腾讯云 、 阿里云等 ) 也提供了仓库的本地源,为我们提供稳定的国内访问。
我们创建好自有镜像后就可以使用 push 命令将它上传到指定的公有或者私有仓库。这样其他人就可以在另外一台机器上下载并使用该镜像,这很像 Git 代码仓库的管理与使用方式。
Docker 就是依靠镜像、容器和仓库所构建起来的,它们之间的关系如图 1 所示。
- 一个 Docker Registry 中可以包含多个仓库(Repository),比如公共的 Docker hub就包含了很多类型的仓库,每个仓库通过多个标签(Tag)进行识别。通常,一个仓库会包含同一个软件的不同版本镜像,而标签就对应于该软件的各个版本。我们可以通过
<仓库名>:<标签>
的格式来指定这个软件所对应版本的镜像。如果不给出标签,将以 latest 作为默认标签。实际上标签的概念类似于软件的版本号。 - 图中的主机就是 docker 服务端,服务端对应于一个物理或者虚拟的机器,被用于执行 Docker 守护进程和容器。
- 一个镜像可以用于一个或者多个容器,比如图中的镜像 2 就被容器 2a 与容器 2b 所利用,创建并运行该镜像的实例。
- Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker。
- Docker 客户端通过命令行或者 Docker SDK与 Docker 守护进程通信。