一、Docker 概述

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现
1、发展历程
LXC (LinuX Container)
LXC 是 Linux 操作系统级别的虚拟化技术,允许使用单个Linux 内核在宿主主机上运行多个 独立的系统。
其原理,通过 CGroups (Control Groups) 进行资源分组/限制管理包括CPU资源(cpu、cpuset、cpuacct)、内存资源(memory)、IO资源(blkio、net_cls)、设备资源(devices)、其他(freezer、perf_event)。
通过 NameSpace 中的 UTS(隔离主机名和域名)、IPC(隔离信号量、消息队列和共享内容)、PID(隔离进程编号)、Network(隔离网络设备、网络栈、端口等)、Mount(隔离文件系统挂载点)、User(隔离用户和用户组),以及 chroot 完成了虚拟化技术。
libcontainer
LXC 使用复杂繁琐,同时存在许多的问题,libcontainer 在针对其进行封装,并对相关功能进行完善。
runC
提到 runC 就不得不说 OCI(Open Containers Initiative).OCI 是一个轻量级的开放式管理架构。是围绕容器格式和运行时制定的一个开放的工业化标准。
在 此容器技术基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
2、Docker 与传统虚拟化方式的不同之处

Virtual Machines 需要在硬件层面虚拟化操作系统的所有组件。
Docker 在操作系统上实现虚拟化,共享宿主机的操作系统,直接通过 Docker Engine 进行 调度。
Virtual Machines 对比 Docker Container
| 启动速度对比 | 性能对比 | 部署力度 | 镜像大小 | 隔离性 | |
|---|---|---|---|---|---|
| Virtual Machines | 慢(分钟) | 损耗明显(Hypervisor 需要进行指令转化) | 至少需要1core + 500 M, 物理机部署的虚拟机有限 |
ISO文件大小GB计算,无共享 | 独占系统内核 (硬件隔离) |
| Docker Container | 快(秒) | 接近原生 | 0.0.1 core + 1M 即可启动一个容器,物理机部署上限高 | 镜像大小MB计算,可共享 | 共享系统内核 (逻辑隔离) |
二、为什么选择 Docker
隔离开发和运维,减少开发运维沟通成本
早期开发,在上线过程中,可能因为部署环境的问题,导致出现问题。Docker 可以保证在多个环境,如:测试,开发,生产 环境都跑都一套镜像,区别仅仅时配置文件的问题。让开发更专注与开发,简化开发和部署的成本。
充分利用机器资源-降低成本
Docker的容器本身不需要额外创建虚拟机管理系统,因此你可以启动多套Docker容器,这样就可以充分发挥主机服务器的物理资源,也可以降低因为采购服务器licenses而带来的额外成本。
多环境迁移便捷
Docker 可以在不同的平台下运行,容器应用的迁移,只需要迁移我们定制化的容器镜像。
快
Docker 是一个轻量级的容器,可以简单快速的进行容器的启动和关闭。
解决“在我机器可以正常运行的”问题
运行环境的不同,导致的系统运行异常
三、Docker Architecture (C-S 架构)
3.1、模块【client - 客户端】
用于进行相关命令操作的客户端。
3.2、模块【docker host - 运行docker 的主机】
Docker Daemon 相关文件或路径
/lib/systemd/system/docker.service
docker host 通常来说是一个装有 docker daemon 功能的主机(物理机/虚拟机/容器)。
docker host 上用来跑 docker 容器,以及存放运行容器时需要的镜像文件。
3.3、模块【docker registry - docker 仓库】
registry 是client 用来拉取镜像的仓库,相当于 svn 仓库。用于保存docker镜像,包括镜像的层次结构和元数据,以及 Index 索引。
client 可以主动的从 docker registry 中拉取镜像,或者在启动容器时,当 docker daemon 从本地获取不到相关镜像时,会直接从 docker registry 中拉取镜像并保存到本地。
Registry可以分为:
- Sponsor Registry:第三方的 registry,供用户和 Docker 社区使用
- Mirror Registry:第三方的 registry,只让客户使用
- Vendor Registry:有发布 Docker 镜像的 供应商提供的 registry
- private Registry:私有仓库
四、Docker 组件图
五、Docker 应用场景
Simplifying Configuration - 简化配置
这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。
Code Pipeline Management - 代码流水线管理
前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。
App Isolation - 应用隔离
有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。
我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。
Debugging Capabilities - 调试能力
Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。
Rapid Deployment - 快速部署
在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。
你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率
Multi-tenancy - 多租户
另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。
Server Consolidation - 整合服务
正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案
这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
Developer Productivity
这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。
不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。
理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。
六、虚拟化技术优点总结
问题:操作系统本身就能够安装很多程序并同时运行,为什么还要把他们分别装到不同的虚拟环境中?
操作系统能够同时运行多个程序的前提是这些程序本身不存在冲突。
冲突提现在很多方面,如:不同程序使用同一端口;不同程序依赖于同一个工具库的不同版本;程序本身限制了同时开启的进程数等。
虚拟化技术通过资源隔离的方式,无形地把这些程序隔离在不同的虚拟环境中,虚拟环境不同,自然运行在不同环境中的程序就不会互相干扰和争抢资源了。
