1、docker三个基本概念

1)镜像

  docker镜像(image),相当于是一个root文件系统。比如官方镜像ubuntu:16.04就包含了完整的一套ubuntu:16.04最小系统的root文件系统

2)容器

  镜像(image)和容器(container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

3)仓库

  仓库可以看成一个代码控制中心,用来保存镜像。

docker使用客户端-服务器(C/S)建构模式,使用远程API来管理和创建docker容器

docker容器通过docker镜像来创建

容器与镜像的关系类似于面向对象编程中的对象与类。

概念

说明

Docker 镜像(Images)

Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。

Docker 容器(Container)

容器是独立运行的一个或一组应用,是镜像运行时的实体。

Docker 客户端(Client)

Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。

Docker 主机(Host)

一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。

Docker 仓库(Registry)

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。

Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。

一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。

通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

2、底层实现

  docker底层的核心技术包括linux上的命名空间(namespace)、控制组(control groups)、union文件系统(union file systems)和容器格式(container format)。

  传统的虚拟机通过宿主主机中运行hypervisor来模拟一整套完整的硬件环境提供给虚拟机的操作系统。虚拟机系统看到的环境是可限制的,也是彼此隔离的。这种直接的做法实现了对资源最完整的封装,单很多时候往往意味着系统资源的浪费。例如,以宿主机和虚拟机系统都为linux系统为例,虚拟机中运行的应用其实可以利用宿主机系统中的运行环境。

  在操作熊中,包括内核、文件系统、网络、PID、UID、IPC、内存、硬盘、CPU等等,所有的资源都是应用进程之间共享的。要想实习县虚拟化,除了要实现对内存、CPU、网络IO、硬盘IO、存储空间等的限制外,还要实现文件系统、网络、PID、UID、IPC等等的相互隔离。前者相对容易实现一些,后者则需要宿主机系统的深入支持

  随着linux系统对于命名空间功能的完善实现,程序员已经可以实现上面的所有需求,让某些进程在彼此隔离的命名空间中运行。大家虽然都公用一个内核和某些运行时环境(例如一些系统命令和系统库),但彼此却看不到,都以为系统中只有自己的存在。这种机制就是容器(container),利用命名空间来做权限的隔离控制,利用cgroups来做资源分配。

3、基础架构

docker采用了C/S架构,包括客户端和服务端。docker守护进程(daemon)作为服务器端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。

客户端和服务端即可以运行在一个机器上,也可通过socket或者RESTful API来进行通信

构建镜像遇见的常见问题 镜像结构_构建镜像遇见的常见问题

 

docker守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。

docker客户端则为用户提供一系列可执行命令,用户用这些命令实现跟docker守护进程交互。

 4、docker镜像原理

一个完整的docker镜像可以支撑一个docker容器的运行,在docker容器运行过程中主要提供文件系统数据的支撑。

docker镜像作为docker中最基本的概率,有以下几个特性:

  • 镜像分层,每个镜像都由一个或多个镜像层组成
  • 可通过在某个镜像加上一定的镜像层得到新镜像(此过程可通过编写dockerfile或基于容器commit实现)
  • 每个镜像层拥有唯一镜像ID
  • 镜像在存储和使用是共享相同的镜像层(根据ID),所以在pull镜像时,已有的镜像层会自动跳过下载
  • 每个镜像层都是只读,即使启动程容器,也无法对其真正的修改,修改只会作用于最上层的容器层

构建镜像遇见的常见问题 镜像结构_docker_02

Docker容器,可以理解为一个或多个运行进程,而这些运行进程将占有相应的内存,相应的CPU计算资源,相应的虚拟网络设备以及相应的文件系统资源。而Docker容器所占用的文件系统资源,则通过Docker镜像的镜像层文件来提供。