今年京东的618活动,京东启动了将近15万个Docker容器,这些Docker容器用于商品页,定单,搜索,缓存,数据库等服务。
为啥docker能在京东南大学放异彩?
Docker自诞生以来就遭到极大的关注,纵观国内的1线IT企业在双101,春节,大促销等活动纷纭上马Docker的项目,Docker到底有甚么优点吸引这些企业。
在互联网企业,开发者完成某个功能需求后上线发布的流程以下。
由开发者在个人电脑上部署新的功能后独自测试,测试终了后在测试服务器中部署新功能,再由公司内部的测试人员在测试服务器上测试,在测试服务器测试终了后再在生产服务器部署新功能,正式发布该功能。
这个流程如图1所示。
图1 完成功能需求的上线发布的流程
在图1所示的流程中会产生下面1系列的问题。
Docker是1个用于统1开发和部署的轻量级容器,让开发者打包其利用及相干的依赖包到1个可移植的容器,发布该容器到其他机器,就可以很容易地实现利用的部署。
传统的虚拟化技术体系在服务器操作系统上安装了多个虚拟机,每一个虚拟机上通过虚拟化技术实现了1个虚拟操作系统,在这个虚拟操作系统上运行利用。传统的虚拟化技术体系架构如图3⑵0所示。
Docker的虚拟化技术体系在服务器的操作系统上有1个Docker服务在运行,在这个Docker服务上运行着多个Docker容器,每一个Docker容器中运行着利用,容器与容器间的利用是相互隔离、相互独立的,但通过Docker服务占用着服务器的硬件和网络资源。
图2 传统的虚拟化技术体系架构
Docker的虚拟化技术体系架构如图3所示。
图3 Docker的虚拟化技术体系架构
Docker利用虚拟化技术实现了1套从硬件到软件的虚拟化环境,这个技术给运维和部署带来的巨大的变革,利用虚拟化技术,真正遮蔽了外部因素的影响,保证了在任何1台电脑中Docker容器里面的内容是1样的。
网络上介绍Docker的特点经常用的是集装箱的比喻,但大多数同学对集装箱带来的革命性影响认识不深,因此我希望借助下面的例子来介绍docker带来的巨大变革:
现在笔者在广州工作,主要的活动地点是出租房和公司,每逢周末倍思亲就回佛山老家。
笔者不在公司的时候,偶尔工作上有事情要处理,但这时候就有1个问题:习惯用的软件都只安装在公司的台式机上,如果在出租房和佛山老家的电脑上处理工作上的事情,很多时候都要把经常使用的软件再安装1次,非常折腾~-~。
使用笔记本后就不1样,如果笔者随身带着笔记本,需要处理工作上的事情时,不管在公司,出租房和佛山老家,只需要把笔记本插上电源,连接wifi,就可以随时投入到工作中,不需要再重新安装经常使用的软件。
把公司,出租房,佛山老家看做是3个不同的工作环境(相当于服务器),没有docker的时期,要在这3个不同的工作环境中工作,需要分别安装所需的软件,如果遇上由于环境之间有差异而酿成的运维问题(例如通过自动下载工具下载的软件版本不1致),还要花大量的时间去排查。
使用了docker后就简单多了,在公司,出租房,佛山老家这3个不同的工作环境(相当于服务器)中,拿出笔记本(也就是docker容器),插上电源和连接wifi,就可以立刻投入到工作,不需要花时间去安装各种软件。
Docker中有3个关键概念。
- 镜像(Image):Docker镜像(Image)类似于虚拟机镜像,可以把其理解为Docker的只读模板,其包括了文件系统。
- 容器(Container):Docker容器(Container)类似于1个沙箱,Docker使用容器隔离资源,并在其内部运行利用,可看成是1个简易版的Linux环境。镜像是只读,容器从镜像启动后,Docker会在镜像最上层创建1个可写层,这样镜像本身就可以保持不变。
- 仓库(Repository):Docker仓库(Repository)类似于代码仓库,是Docker集中寄存镜像文件的场所。
Docker仓库里面包括了大量操作系统的基础镜像(例如CentOS、Ubuntu等),开发者从仓库中拉取这些操作系统的基础镜像后就可以在其基础之上构建本身环境的镜像。
Docker提供了Dockerfile这类脚本给开发者创建自定义的镜像。开发者通过Dockerfile,很容易在操作系统的基础镜像(例如CentOS、Ubuntu等)上安装指定的软件及其依赖,从而构建1个适用于本身业务环境的镜像。
简单来讲,读者可以把操作系统的基础镜像理解为1个干净版操作系统,通过Dockerfile(相当于Linux上的安装脚本)往这个干净版操作系统上安装需要的软件后,再生成1个新的镜像。
下面是1个Dockerfile的例子,运行这个Dockerfile就可以构建Java开发环境的Docker镜像(Dockerfile来源:https://github.com/dockerfile/java/blob/master/oracle-java7/dockerfile)。
# 下载基础镜像
FROM dockerfile/ubuntu
# 安装Java.
Run echo oracle-Java7-installer shared/accepted-oracle-license-v1-1 select true | debconf-set-selections && \
add-apt-Repository -y ppa:Webupd8team/Java && \
apt-get update && \
apt-get install -y oracle-Java7-installer && \
rm -rf /var/lib/apt/lists/* && \
rm -rf /var/cache/oracle-jdk7-installer
# 定义工作目录
WORKDIR /data
# 定义JAVA_HOME环境变量
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
# 定义默许的命令
CMD ["bash"]
使用Docker构建1致的开发环境是依赖于Dockerfile:把编写完成的Dockerfile放置在版本管理服务器中,在不同的服务器上获得这个Dockerfile并运行就可以构建相同的镜像,从而得到1致的开发环境。这个流程如图4所示。
图4 用Docker构建开发环境流程
使用docker后,可以取得资源隔离,弹性扩大,简化配置等好处,但docker真的合适每一个项目吗?
虽然docker简化了运维,但是docker本身也带来了新的运维问题:例如怎样部署1个docker集群,docker集群的监控,docker故障的排查等等,除这些问题外,在把docker引入项目中仔细斟酌下面的因素:
本人把网络上发表的1系列“app后端”文章加以整理并增加了运维和架构方面的内容,出版了书籍《App 后台开发运维和架构实践》,该书已在京东,铛铛和亚马逊上销售。
京东
铛铛
亚马逊
互动出版网
天猫
打开链接 app后端设计–总目录 ,能查看本人发表过的所有原创“app后端”文章。
【作者】曾健生
【QQ】190678908
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi