【Docker教程】Docker 初识

介绍

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

系统架构

核心技术

  • Namespaces (namespace)

    Namespace是Linux提供的一种内核级别环境隔离的方法,提供了对UTS、IPC、mount、PID、network、User等的隔离机制。

  • Control groups (CGroup)

    用来限制,控制与分离一个进程组群的资源(如CPU、内存、磁盘输入输出等)
    可​​以让​​​您​​​为​​​系​​​统​​​中​​​所​​​运​​​行​​​任​​​务​​​(进​​​程​​​)的​​​用​​​户​​​定​​​义​​​组​​​群​​​分​​​配​​​资​​​源​​​ — 比​​​如​​​ CPU 时​​​间​​​、​​​系​​​统​​​内​​​存​​​、​​​网​​​络​​​带​​​宽​​​或​​​者​​​这​​​些​​​资​​​源​​​的​​​组​​​合。
    主要提供了一下功能

    • Resource limitation: 限制资源使用,比如内存使用上限以及文件系统的缓存限制。
    • Prioritization: 优先级控制,比如:CPU利用和磁盘IO吞吐。
    • Accounting: 一些审计或一些统计,主要目的是为了计费。
    • Control: 挂起进程,恢复执行进程
  • Union file systems (AUFS)

    AUFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可

    当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制copy on write

  • ….等

核心组件

  • 客户端 Client

    Docker client 是给用户和 Docker daemon 建立通信的客户端,安装了 docker 之后,二进制文件 docker 就是 Docker client,与 Docker daemon 交互, 通过客户端 docker 命令,我们可以方便地实现对 Docker image 和 container 的管理请求。

    Docker client 与 docker daemon 建立请求的方式有三种,分别是:

    • tcp://host:port

    • unix://path/to/socket

    • fd://socketfd

  • 常驻后台的系统进程 Docker daemon

    Docker daemon 是一个常驻后台的系统进程,所谓“运行 docker”,指的就是运行 Docker daemon,其作用主要有以下两点:

    • 接受并处理 Docker Client 发送的请求

    • 管理所有的 Docker containers 和 Docker images

      Docker daemon 的架构大致可以分为三部分:Docker Server、Engine 和 Job。

      docker daemon 监听来自 remote api 的请求的方式有三种:unix、tcp 和 fd

      默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,可以使用dockerd命令:

      1
      dockerd -H 0.0.0.0
  • 镜像  Image

    镜像是一个只读的层(layer),由文件系统叠加构成,就相当于是一个 root 文件系统,通过它可以创建 Docker 容器(Container)。

    分层存储,每一层都可以添加改变和删除文件,形成一个新的镜像

    镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层

    不同的镜像可以共享相同的层

  • 容器  Container

Docker 容器是用于运行镜像的沙箱环境,它是 Docker 镜像的运行实例;容器都是相互隔离、互不可见的,我们可以理解为:镜像是Docker生命周期的打包和构建阶段,而容器是Docker的启动和执行阶段。

镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

在Image Layer之上建立一个 Container Layer(读写层),镜像(image)负责app的存储和分发,容器(Container)负责运行app

  • 仓库  Registry

Registry 是集中的存储、分发镜像的文件仓库

仓库分为公有仓库和私有仓库,常用的公有仓库是官方的 Docker Hub,默认的 docker pull 命令就是从官方的公有仓库中拉取镜像;个人可以根据Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务