Docker-概述(1)

220 阅读8分钟

Docker介绍

  • Docker是一个开源的应用容器 Container 引擎,其可以让开发者将应用及应用运行的环境打包到一个轻量级、可移植的镜像中,然后发布到任何流行的 Linux、Windows 机器上。

  • Docker 原本是由一个 PaaS 提供商 dotCloud 公司的创始人 Solomon Hykes 发起的一个内部项目,是基于其多年云服务技术的一次革新,使用Go语言开发。2013年3月开源,并在 GitHub 上进行维护。后由于 Docker 项目的火爆,2013年底,dotCloud公司更名为 Docker,公司域名也变更为了docker.com。

  • Docker LOGO: Docker中的鲸鱼,是在众多LOGO方案中由网友投票投出的结果。

虚拟技术

image.png

  • 传统的虚拟技术是在物理机的操作系统之上安装一个虚拟机管理程序(VMware、VirtualBox 等)。可创建多个虚拟机。每个虚拟机需要安装自己独立的操作系统,应用则是安装在虚拟机操作系统之上的程序,应用程序通过调用各种命令或库函数来使用其需要的各种系统资源。
  • 容器虚拟技术,容器引擎管理多个容器,容器之间相互隔离、互不干扰。容器引擎统一管理所有容器对系统资源的使用,所有容器共享宿主机的硬件与操作系统,所以容器对系统资源的占用很少,其仅包含运行时必须的一些资源。所以容器对系统资源的利用率很高,无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。

Hypervisor

Hypervisor也叫VMM(virtual machine monitor)容器监视器,运行在操作系统与硬件系统之间,用于实现多个虚拟机共享宿主机的硬件系统。Hypervisors是在虚拟环境中的“元”操作系统。可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisors不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行Hypervisor时,会加载所有虚拟机客户端的操作系统同时会分配给每一台虚拟机适量的内存,CPU,网络和磁盘。

  • Hyper-V :运行在windows上,是微软提供的商业化的 Hypervisor。是微软第一个采用类似 Vmware ESXi 和 Citrix Xen 的 基于 Hypervisor 的技术。这也意味着微软会更加直接地与市场先行者 VMware 展开竞争, 但竞争的方式会有所不同。 Hyper-V 是微软提出的一种系统管理程序虚拟化技术,能够实现桌面虚拟化。 image.png

  • KVM 与 Xen 都是 Linux 系统之上的开源的 Hypervisor。

Windows系统的架构

现在的 Windows系统是运行在Hyper-V 之上的两台虚拟机:操作系统虚拟机和应用层虚拟机。系统上运行的每一个应用,其实就是运行在应用层虚拟机之中。操作系统虚拟机能够管理应用层虚拟机。

image.png

VMware Workstation

VMware 采用的是 VMM 虚拟化技术,该技术要求直接访问 CPU 硬件的虚拟化功能。但VMware作为 windows 系统中的应用,是运行在应用层虚拟机中的。这导致 VMware 无法直接访问 CPU 硬件虚拟化功能。所以在安装 VMware Workstation 时会出现 VMware Workstation与 Hyper-V 不兼容的问题。

从 15.5.5 版本开始,VMware对 VMM 虚拟机技术进行了重构,由原来需要直接调用 CPU 的虚拟化功能,改变为了通过调用 Win10 系统的 WHP(Windows Hypervisor Platform)的 API 来运行。解决了 VMware Workstation 与 Hyper-V 的不兼容问题。

LXC虚拟化技术

Linux Containers(LXC)是一种虚拟化的解决方案,这种是内核级的虚拟化。LXC可以在操作系统层次上为进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器。可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,可以限制内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。

image.png

可通过namespace进行资源隔离,Gust1下的进程与Guset2下的进程是独立的,可以看作运行在两台物理机上一样。Contaniner管理工具就是对Guest进行管理的(创建、销毁)。

LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案。LXC虽然极大的简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低,因为我们必须要学会LXC的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。后来就出现了Docker,可以说Docker就是LXC的增强版。

  • LXC与KVM技术的比较

KVM的优点是一个物理机上可以跑多个操作系统(Guest-OS),然后在每个操作系统运行应用,通过这种方式实现应用的隔离。而使用LXC技术直接可以在Host-OS的基础上实现隔离的。这就是LXC的优势–运行快。但如果有两个应用一个在windows运行,一个在linux上运行,就只能使用KVM来实现了。

image.png

Docker发展历程

首发版本架构

Docker 在首次发布时,其引擎由两个核心组件构成:LXC(Linux Container)与 Docker Daemon。

存在问题:

  • 依赖于LXC,使得Docker存在严重的问题
    • LXC也使得 Docker 无法实现跨平台
    • LXC的更新影响Docker
  • Docker Daemon 的“大而全”
    • 版本更新与功能扩展较难;运行较慢,带来性能问题
    • Docker Daemon 运行出现问题,会直接影响容器的运行

Docker0.9 版本架构

从 Docker0.8 版本开始,Docker 使用自研的 Libcontainer 工具替换了 LXC。

Docker1.1 版本架构

2017 年 7 月 OCI(The Open Container Initiative)基金会发布了两个规范(镜像规范与容器运行时规范)的 OCI1.0 版本。

2016 年底发布的 Docker1.1 版本基本遵循了 OCI1.0 版本。

从 Docker1.1 版本开始,Docker Daemon 中不再包含任何容器运行时代码,而是将容器运行时单独剥离了出来,形成了 Runc 项目。

Docker引擎

Docker 引擎是用来运行和管理容器的核心软件,其现代架构由四部分主要组件构成:Docker Client,Dockerd、Containerd 与 Runc。

  • Docker Client:Docker 客户端,Docker 引擎提供的 CLI 工具,用于用户向 Docker 提交命令请求。

  • Dockerd( Docker Daemon):Dockerd 中的主要包含的功能有镜像构建、镜像管理、REST API、核心网络及编排等。其通过 gRPC 与 Containerd 进行通信

  • Containerd( Container Daemon):主要功能是管理容器的生命周期。不过,其本身并不会去创建容器,而是调用 Runc 来完成容器的创建。Docker 公司后来将 Containerd 项目捐献给了 CNCF(云原生基金会)。

  • Runc(Run Container):是 OCI(开放容器倡议基金会)容器运行时规范的实现,Runc 项目的目标之一就是与 OCI 规范保持一致。所以,Runc 所在层也称为 OCI 层。这使得 Docker Daemon 中不用再包含任何容器运行时的代码了,简化了 Docker Daemon。Runc 只有一个作用—创建容器,其本质是一个独立的容器运行时 CLI 工具。其在 fork出一个容器子进程后会启动该容器进程。在容器进程启动完毕后,Runc 会自动退出。

  • Shim(垫片):是实现“Daemonless Container(无 Docker Daemon 与 Container Daemon容器)”不可或缺的工具,使容器与 Docker Daemon 解耦,使得 Docker Daemon 的维护与升级不会影响到运行中的容器。

image.png

流程:每次创建容器时,Containerd 同时会 fork 出 Runc 进程与 Shim 进程。Containerd紧接着会将镜像转换为OCI(开放容器创建基金会)的这种格式并传递给Runc。由Runc负责完成容器的创建。当 Runc 创建完容器自动退出之前,会先将新容器进程的父进程指定为相应的 Shim 进程。

除了作为容器的父进程外,Shim 进程还具有两个重要功能:

  1. 保持所有 STDIN 与 STDOUT 流的开启状态,从而使得当 Docker Daemon 重启时,容器不会因为 Pipe 的关闭而终止。
  2. 将容器的退出状态反馈给 Docker Daemon。

Docker 引擎分类

Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。

  • Moby:是由Docker社区在维护,任何人都可以基于Moby打造自己的Docker产品
  • Docker-CE:就是从Moby打造出来的,由Docker公司维护
  • Docker-EE:商业化的产品

从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。