Docker
1、 为什么使用Docker
随着大数据平台型产品方向的深入应用实践和Docker开源社区的逐渐成熟,业界有不少的大数
据研发团队开始使用Docker。简单来说,Docker会让大数据平台部署更加简单快捷、让研发和测试团队集成交付更加敏捷高效、让产线环境的运维更加有质量保障。
1.1、Docker的使用场景一
在大数据平台型产品的开发过程中,经常要跟许多模块打交道,包括Hadoop、HBase、Hive、
Spark、Sqoop、Zookeeper……等多达几十个开源组件,为了不影响团队成员间的工作任务协同,
开发人员其实非常需要自己有一套独立的集群环境,以便反复测试自己负责的模块,可真实的企业
开发环境往往只有一两个大的虚拟集群,这可怎么办?
难道要给每个开发人员都配几台独立的物理机器?
1.2、Docker的使用场景二
针对每一次新版本的发布,产品测试组都需要反复的重装整个平台以便发现问题,而正如本文
前面所阐述的那样,大数据平台所依赖的组件繁多,不同组件模块依赖的底层库也不尽相同,经常
会出现各种依赖冲突问题,而一旦安装完成,就很难再让Linux系统恢复到一个非常干净的状态,
通过Remove、UnInstall、rpm -e等手动方式卸载,往往需要花费很长的时间,那如何才能快速地
恢复大数据平台集群的系统环境?
1.3、Docker的使用场景三
当测试人员在测试大数据平台过程中发现了一个Bug,需要保存现场,这里面包括相关的大数
据组件配置、进程状态、运行日志、还有一些中间数据,可是,平台集群服务器节点数量很多,针
对每个进程的配置目录和日志文件,都相对较独立,一般都需要专业的开发工程师或者运维工程师
进入相关服务器节点,按照不同组件的个性化配置信息,手工方式收集所需的各个条目信息,然后
打包汇集到日志中心服务器进行统一分析,而目前业界并没有一款能够自动分布式收集故障相关的
日志系统,但测试工作还要继续,怎么办?
传统解决方案的缺陷
想要解决这些问题,第一个想到的方案当然是用虚拟机,但这种方式并不能完美的解决以上问
题,比如:
- 虽然虚拟机也可以完成系统环境的迁移,但这并不是它所擅长的,不够灵活,很笨重。
- 虚拟机的快照可以保存当前的状态,但要恢复回去,就得把当前正在运行的虚拟机关闭,所以
并不适合频繁保存当前状态的业务场景。 - 虽然可以给每个人都分配几个虚拟机用,但它是一个完整的系统,本身需要较多的资源,底层
物理机的资源很快就被用完了,所以我们需要寻找其它方式来弥补这些不足
2、Docker 介绍
2.1、 什么是虚拟化
在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资
源,如:服务器、网络、内存、存储等等,予以抽象、转换后呈现出来,打破实体结构间的不可切
割的障碍,使用户可以比原来的组态更好的方式来应用这些资源,这些资源的核心虚拟部分是不受
现有资源的架设方式,低于或者物理组态所限制,一般所指的虚拟化资源包括计算能力和资料存储。
在实际的生产过程中,虚拟化技术主要是用来解决高性能的物理硬件产能过剩和老的硬件产能
过低的重用重组,透明化底层物理硬件,从而最大化的利用物理硬件,对资源充分利用
虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip),桌面
虚拟化、服务虚拟化、虚拟机等等。
虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行
不同的操作系统,相互不受影响,这样就可以充分利用硬件资源
2.2、认识 Docker
- Docker是一个开源的应用容器引擎
- 诞生于2013年初,基于Go语言实现,dotCloud公司出品(后改名为Docker Inc) Docker可以让开发者打包他们的应用以及依赖包到一个轻量级,可移植的容器中,然后发布到
任何流行的linux服务器上 - 容器是完全使用沙箱机制,相互隔离
- 容器性能开销极低
- Docker从17.3版本之后分为CE(Community Edition社区版)和EE(Enterprise Edition企业版)
小 结: Docker是一种容器技术,解决软件跨环境迁移的问题
2.3、容器与虚拟机比较
2.3.1 什么是虚拟机
虚拟机是一个计算机系统的仿真,简单来说,虚拟机可以实现在一台物理计算机上模拟多台计
算机运行任务。
- 操作系统和应用共享一台或多台主机(集群)的硬件资源,每台VM有自己的OS,硬件资源是虚
拟化的。 - 管理程序(hypervisor)负责创建和运行VM,它连接了硬件资源和虚拟机,完成server的虚拟化。
由于虚拟化技术和云服务的出现,IT部门通过部署VM可以可减少cost提高效率
VMs也消耗大量系统资源,每个VM不仅运行一个OS的完整copy并且需要所有硬件的虚拟化
copy,这消耗大量RAM和CPU。相比单独计算机,VM是比较经济的,但对于一些应用VM是过度
浪费的,需要容器。
2.3.2 什么是容器
- 容器是将操作系统虚拟化,这与VM虚拟化一个完整的计算机有所不同。
- 容器是在操作系统之上,每个容器共享OS内核,执行文件和库等。共享的组件是只读的,通
过共享OS资源能够减少复现OS的代码,意味着一台server仅安装一个OS可以运行多个任务。 - 容器是非常轻量的,仅仅MB水平并且几秒即可启动。相比容器,VM需要几分钟启动,并且大
小也大很多。
* 与VM相比,容器仅需OS、支撑程序和库文件便可运行应用,这意味你可以在同一个server上
相比VM运行2-3倍多的应用,并且,容器能帮助创建一个可移植的,一致的开发测试部署环境。
小结:
特性 | 虚拟机 | 容器 |
---|---|---|
隔离级别 | 操作系统级 | 进程级 |
隔离策略 | 运行于Hypervisor上 | 直接运行在宿主机内核中 |
系统资源 | 5-15% | 0-5% |
启动速度 | 慢,分钟级 | 快,秒级 |
占用磁盘空间 | 非常大,GB-TB级 | 小,KB-MB甚至KB级 |
并发性 | 一台宿主机十几个,最多几十个 | 上百个,甚至上百上千个 |
高可用策略 | 备份、容灾、迁移 | 弹性、负载、动态 |
结论:与传统的虚拟化相比,Docker优势体现在启动速度快,占用体积小
2.4、 Docker与虚拟机形象比喻
2.4.1 什么是物理机
2.4.2 什么是虚拟机
2.4.3 什么是docker
3. Docker 组件
3.1 Docker 服务端和客户端
Docker是一个客户端-服务端(C/S)架构程序,Docker客户端只需要向Docker服务端或者守护进程发出请求,服务端或者守护进程完成所有工作返回结果。
Docker提供了一个命令行工具Docker以及一整套的Restful API,可以在同一台宿主机器上运行
Docker守护进程或者客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程
Docker守护进程。
docker引擎是一个c/s结构的应用,主要组件见下图:
- Server是一个常驻进程
- REST API 实现了client和server间的交互协议
- CLI 实现容器和镜像的管理,为用户提供统一的操作界面
3.2 Docker 构架
Docker使用C/S架构,Client 通过接口与Server进程通信实现容器的构建,运行和发布.client
和server可以运行在同一台集群,也可以通过跨主机实现远程通信。
3.2.1 Docker 镜像
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统
环境,里面仅安装了 Apache 或用户需要的其它应用程序
-
镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。Docker 提供了一个很简单的
机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜
像来直接使用。 -
镜像(Image)就是一堆只读层(read-only layer)的统一视角,也许这个定义有些难以理解,
看看下面这张图:
右边可以看到多个只读层,它们重叠在一起,除了最下面一层,其它层都会有一个指针指向下
一层。这些层是Docker内部的实现细节,并且能够在docker宿主机的文件系统上访问到。
统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供
了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
3.2.2 Docker 容器
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
- 可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网 络空间等)和运行在其中的应用程序。
- 创建Container首先要有Image,也就是说Container是通过image创建的。
- Container是在原先的Image之上新加的一层,称作Container layer,这一层是可读可写的
(Image是只读的)。
在面向对象的编程语言中,有类跟对象的概念。类是抽象的,对象是类的具体实现。Image跟
Container可以类比面向对象中的类跟对象,Image就相当于抽象的类,Container就相当于具体实例化的对象。
Image跟Container的职责区别:Image负责APP的存储和分发,Container负责运行APP
结论:容器 = 镜像 + 读写层。并且容器的定义并没有提及是否要运行容器
3.2.3 Registy(注册中心)
仓库(Repository)是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务(Registry)
混为一谈,并不严格区分。
实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有
不同的标签(tag)。
仓库分为**公开仓库(Public)和私有仓库(Private)**两种形式。
- 最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
- 国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。
- 当然,用户也可以在本地网络内创建一个私有仓库。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次
在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。