前言:
这句话应该是开发人员经常挂在嘴边的吧!
“在我的机器上是正常工作的啊,MD,怎么到你这就不行了?”
开发人员就会联想到:
1. 肯定是你环境有问题;
2. 要么就是你个傻*不会用吧;
带着这句话进入我们这次的主题,什么是容器?它能解决我们什么问题?
一、什么是容器?
容器这个词,当我们第一眼看它或许脑子里是这东西:瓶瓶罐罐、装水、装其他东西的玩意。
不管是什么,总的来说,容器给我们第一印象就是一个字 —— “装”。
那么今天我们要说的容器技术是怎么一个概念呢?
其实,我们常说的“容器技术”是英文单词Linux Container(简称LXC)的直译。Container这个单词有集装箱、容器的含义(主要偏集装箱意思),但是在国内人们说“集装箱技术”有些拗口,听起来也不那么高大上,所以国内的人直接把它叫为“容器技术”,这听起来是不是档次更高了。
冷笑话:
比如说:今天你出门学东西,女朋友问:你出去干嘛啊?
结果你说:出去学“集装箱”啊,你女朋友肯定以为你脑子不正常了。
容器的一些特性:
容器就是将软件打包成标准化单元,以用于开发、交付和部署:
- 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行;
- 开发人员在自己的电脑上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器及公有云上运行;
- 容器赋予了软件独立性,使其免受外在环境差异(例如,开发和测试及预发布环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突;
唠叨几句,有对比便于理解(可忽略):
物理机世界:
在还没有虚拟化的时候,我们宿主机上是不是直接装操作系统,里面部署了很多软件也打了补丁,当这台宿主机的硬件无法满足我们业务时怎么办啊?
我们要将操作系统或者业务进行迁移到更高配置的宿主机,这个工作量是非常大,而且很有技术挑战。
即便我们将业务迁移成功了,中间是不是有一段时间业务的中断啊,万一迁移不成功还得有回退方案;在以前做一个生产环境的迁移工作最少要两个星期或者半个月,怎么说呢?
第一:要写业务迁移方案 ——> 第二:在测试环境模拟 ——> 第三:在凌晨进行迁移工作 ——> 第四:如果不成功或者不能按时迁移完成要执行“回退方案”。
虚拟化世界:
后来有了虚拟化技术就相对来说容易一些,因为虚拟化可以做“在线迁移”,所有的虚拟机是放在一个共享存储上,迁移就比较简单了,但是还是会有问题。
比如说:
在我们公司搭了个环境做好业务后,总不能把整个虚拟机拷到客户上吧?一个操作系统动不动都是几个G、十几G的容量,迁移起来很麻烦,所以说在你的测试环境是好的,到了客户环境又出问题了,这个大家应该很常见吧。
或者说:
在你测试环境是系统是CentOS7,但是客户环境是CentOS6、RedHat6,总不能让客户换操作系统吧?客户原来的业务怎么办呢?这个不现实吧。那你这些软件是不是都有可能出现不兼容问题,迁移的问题已经解决了,但是兼容性问题又出现了。
这些都是我们经常在生成环境遇到的问题,即使你们现在还没遇到这种头痛的问题,当我们在生产环境玩多了就好体会得到了。
容器技术世界:
有了容器之后,这一切就变得简单了,容器最大的优点就是:既解决了迁移问题,又解决了软件不兼容性的问题。
它有点类似于在测试环境把所有的东西导出一个包(容器),将这个包(容器)导入到客户生产环境上解压就可以正常使用了。我们不需要关心客户是什么操作系统,它只需要跑容器软件就可以了。
本身容器就是个精简的东西,一个操作系统就一百多M,把软件封装在一起也就几百M,打包出来和迁移都是非常容易的,这就是容器的 轻量级 。
二、为什么需要容器?
一般我们写程序的,能接触到好几个环境:
- 自己写代码的环境叫做开发环境。
- 给测试去跑的环境叫做测试环境。
- 测试完可以对外使用的叫做生产环境。
其实我们在学习编程中,很多时间都浪费在“环境”上:
- 如果我现在重装了系统,我想要跑我的war/jar包,我得去安装一下JDK、Tomcat、MySQL等配置各种的环境变量才能跑起来。
- 我们跟着网上博主给出的步骤去写Demo,但总是有Bug。
- 好不容易在测试环境下跑起来了,在生产环境就各种出错!
所以说:容器使软件具备了超强的可移植能力!
举个例子:
在早期运输货物是没有集装箱这个概念的,那时候的货物杂乱无章的堆放着,肯定影响货物完好性和运输效率;
集装箱的发明之后极大的改善了全球物品的流转速度。
假设我们从欧洲进口一些货物回来,比如:跑车、钢琴、石油等,如果把它们都堆在一起运输是不是把货物给破坏了;
或者这些货物堆在一起就像快递,我们从网上购买服务器是不是特别担心,怕回来的时候服务器已经不是服务器了,被挤扁变成“钢板”了。
后来有了“集装箱”的发明,集装箱规格标准化、各式各样的货物都可以装、不同的交通工具都可以运输(吊机、卡车、货轮、火车),使得物流更加的便利;
比如我们是不是可以把石油、汽车、钢琴分别放到不同的“集装箱”里面,它们彼此之间就做到了隔离,同时也可以在一个货轮里面运输,它们彼此之间保证了独立性,同时也就更安全。
这就是容器技术,“集装箱”的优点容器里面都有,所以我们可以说容器技术是借鉴“集装箱”发明的特点。
三、为什么容器技术现在才火?
Linux Container(简称LXC)容器技术的诞生(2008年)就解决了IT世界里“集装箱运输”的问题。那么为什么2013年左右容器才火了起来呢?
是因为Docker的出现。
四、什么是Docker?
我们说“容器”就是Docker吗?这句话不准确吧!
我们“云“就是OpenStack吗?这句话也不准确吧!
Docker是实现“容器”的一个解决方案而已!
就像OpenStack也是实现“云计算”的一个解决方案!
Docker是基于GO语言实现的开源容器项目,当时Docker技术诞生之后,并没有引起行业的关注。
正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。
开源后Docker在2013年一炮而红,几乎Docker已经成了容器技术的 代名词 。容器技术早已存在,传统的容器技术没有成为主流的原因是未能提供标准化的应用运行时环境,而基于“容器技术”的Docker从一开始就以提供标准化的运行时环境为目标,真正做到“Build once,Run anywhere”(构建一次,到处运行)理念。
- Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc. 。
- Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻量级”。
这是Google对 IT界技术的热度测评,Docker、OpenStack、Hadoop现在并成为IT界最热门的三个技术。在容器技术之前,业界的网红是 虚拟机 。虚拟机技术的代表,是VMWare和OpenStack。
自从Docker火了之后,Docker的热度超过了OpenStack和Hadoop。并不是说Docker热度高于这两个技术,OpenStack和Hadoop就不好了或者说没那么热了,是因为他们的技术相对来说比较成熟了,而Docker是2013才出现的,加上它的一些特性,所以它更加吸引人。
Docker特性:
标准化:
- 保证一致的运行环境
在我计算机上运行的这个“容器”,我保证这个“容器”迁到你机器上运行的效果是跟我一样的效果。
不会因为你机器上的硬件、软件、操作系统不一样而导致不一样的结果,这个在物理机和虚拟化时代是受影响的,但是在“容器”就不受影响。
- 弹性伸缩,快速扩容
如果不能满足或者不够了,可以再起几个容器。
- 方便迁移
方便迁移大家听了前面的介绍应该能体会得出了。
- 持续集成、持续交付与持续部署
“持续”就是“高可用”的意思,假设我们在一台虚拟机上部署了N个容器,万一这台虚拟机“宕机”了怎么办?
讲到“高可用”,我们就在这里在唠叨几句,便于理解:
虚拟化世界里:
我们会将业务搭建成一个集群模式,如果一台主机“宕”了,那么其他节点会马上接替业务,从而实现一个“高可用”。
容器世界里是怎么实现的呢?
那就是我们常说的“Docker+k8s”,“k8s”全称是“kubernetes”,它就是用来解决类似这样的问题的。
Docker跟kubernetes是什么关系呢?
比如说:
大家听说过“KVM”吧?它就是“云”底下开源虚拟化,但是如果你单纯去跑“KVM”是很麻烦的,所以后面出现了OpenStack接管“KVM”,并且提供一下管理的机制、监控、运维功能、高可用的解决方案,这些都是OpenStack这层去完成的。
那么Docker就相当于KVM,kubernetes(k8s)就相当于OpenStack。所以说kubernetes(k8s)就是提供这些功能,比如说:这个“容器”在这台机器上出现故障了,它会自动的在另外一台机器启动你这个“故障容器”(副本),从而实现“高可用”机制。
高性能:
- 不需要进行硬件虚拟以及运行完整的操作系统
轻量级:
- 快速启动
隔离性:
- 进程隔离
五、Docker VS VM
Docker是内核级的虚拟化,可以实现更高的性能,同时对系统资源需求 非常低 ,所以 资源利用率就高 。
容器减少了“客户机操作系统”这层,直接在“Docker”这层就跑应用了;
而右边这个架构,意味着每个“应用”底层都要有一个“操作系统”,这本身就带来了一定的开销。
这就是容器为什么 轻量级 的原因。
优势:
- Docker容器很快,启动和停止可以在秒级实现,而传统的虚拟机方式需要数分钟。
- Docker容器对系统资源需要很少,一台主机上可以跑上千个Docker容器(在IBM服务器上就已经实现了同时运行10K量级的容器实例)。
容器和虚拟机共用
将容器和虚拟机配合使用,为应用的部署和管理提供极大的灵活性。
六、Docker架构图
Docker 三大核心概念:
- 镜像 (Image)
- 容器 (Container)
- 仓库 (Repository)
简单步骤如下:
Client 执行 “docker run ....” 这条命令时——> 它会查看本地有没有这个“镜像”(image),如果没有就向“镜像仓库”拉取到本地 ——> 然后将拉取的“镜像”运行起来就叫“容器”。
不是很恰当举例,仅供个人参考:
我们JD购买一台服务器称为“镜像”——> JD本地仓库没有该服务器 ——>从JD总部仓库调取打包好的服务器称为“仓库”——> 调取回来到本地仓库的服务器称为:镜像——> 我们收到的包裹里面装着服务器这个包裹叫“容器”。
七、生产环境架构图
这个框架就是大多数IT公司的业务都想往或者说必须往这个框架去发展以及转型。如果一个IT公司的业务从一开始就不上“云”或者不使用“容器”,那么它的业务效率大大的下降,资源浪费也比较大,自然成本也提高。
下一章:安装Docker,开始Docker之旅!