42.docker简介

今年京东的618活动,京东启动了将近15万个Docker容器,这些Docker容器用于商品页,订单,搜索,缓存,数据库等服务。

为啥docker能在京东大放异彩?

Docker自诞生以来就受到极大的关注,纵观国内的一线IT企业在双十一,春节,大促销等活动纷纷上马Docker的项目,Docker到底有什么优点吸引这些企业。

传统开发部署流程之痛

在互联网企业,开发者完成某个功能需求后上线发布的流程如下。
由开发者在个人电脑上部署新的功能后独自测试,测试完毕后在测试服务器中部署新功能,再由公司内部的测试人员在测试服务器上测试,在测试服务器测试完毕后再在生产服务器部署新功能,正式发布该功能。
这个流程如图1所示。

这里写图片描述

图1 完成功能需求的上线发布的流程

在图1所示的流程中会产生下面一系列的问题。

  • 每台计算机的Linux环境、JDK版本、PHP版本、Nginx版本、MySQL版本等不一致,有可能造成某些问题只是某台计算机上出现,其他电脑没法重现。
  • 某些开发环境搭建复杂,还要分别在个人计算机、测试服务器、生产服务器上搭建一次,里面有大量的重复劳动,效率低下。
  • 在个人计算机和测试服务器上有可能只是单机环境,到了生产服务器上变成了分布式环境,环境不一致导致部署方法不一致,造成在测试阶段没法发现问题。

Docker是一个用于统一开发和部署的轻量级容器,让开发者打包其应用及相关的依赖包到一个可移植的容器,发布该容器到其他机器,就能很容易地实现应用的部署。

Docker的原理

传统的虚拟化技术体系在服务器操作系统上安装了多个虚拟机,每个虚拟机上通过虚拟化技术实现了一个虚拟操作系统,在这个虚拟操作系统上运行应用。传统的虚拟化技术体系架构如图3-20所示。

Docker的虚拟化技术体系在服务器的操作系统上有一个Docker服务在运行,在这个Docker服务上运行着多个Docker容器,每个Docker容器中运行着应用,容器与容器间的应用是相互隔离、相互独立的,但通过Docker服务占用着服务器的硬件和网络资源。

这里写图片描述
图2 传统的虚拟化技术体系架构

Docker的虚拟化技术体系架构如图3所示。
这里写图片描述
图3 Docker的虚拟化技术体系架构

Docker利用虚拟化技术实现了一套从硬件到软件的虚拟化环境,这个技术给运维和部署带来的巨大的变革,利用虚拟化技术,真正遮蔽了外部因素的影响,保证了在任何一台电脑中Docker容器里面的内容是一样的。

网络上介绍Docker的特点时常用的是集装箱的比喻,但大多数同学对集装箱带来的革命性影响认识不深,因此我希望借助下面的例子来介绍docker带来的巨大变革:

现在笔者在广州工作,主要的活动地点是出租房和公司,每逢周末倍思亲就回佛山老家。

笔者不在公司的时候,偶尔工作上有事情要处理,但这时就有一个问题:习惯用的软件都只安装在公司的台式机上,如果在出租房和佛山老家的电脑上处理工作上的事情,很多时候都要把常用的软件再安装一次,非常折腾~-~。

使用笔记本后就不一样,如果笔者随身带着笔记本,需要处理工作上的事情时,无论在公司,出租房和佛山老家,只需要把笔记本插上电源,连接wifi,就能随时投入到工作中,不需要再重新安装常用的软件。

把公司,出租房,佛山老家看作是3个不同的工作环境(相当于服务器),没有docker的时代,要在这3个不同的工作环境中工作,需要分别安装所需的软件,如果遇上因为环境之间有差异而造成的运维问题(例如通过自动下载工具下载的软件版本不一致),还要花大量的时间去排查。

使用了docker后就简单多了,在公司,出租房,佛山老家这3个不同的工作环境(相当于服务器)中,拿出笔记本(也就是docker容器),插上电源和连接wifi,就能立刻投入到工作,不需要花时间去安装各种软件。

搭建一致的开发环境

Docker中有3个关键概念。
- 镜像(Image):Docker镜像(Image)类似于虚拟机镜像,可以把其理解为Docker的只读模板,其包含了文件系统。
- 容器(Container):Docker容器(Container)类似于一个沙箱,Docker使用容器隔离资源,并在其内部运行应用,可看成是一个简易版的Linux环境。镜像是只读,容器从镜像启动后,Docker会在镜像最上层创建一个可写层,这样镜像本身就能保持不变。
- 仓库(Repository):Docker仓库(Repository)类似于代码仓库,是Docker集中存放镜像文件的场所。

Docker仓库里面包含了大量操作系统的基础镜像(例如CentOS、Ubuntu等),开发者从仓库中拉取这些操作系统的基础镜像后就能在其基础之上构建自身环境的镜像。

Docker提供了Dockerfile这种脚本给开发者创建自定义的镜像。开发者通过Dockerfile,很容易在操作系统的基础镜像(例如CentOS、Ubuntu等)上安装指定的软件及其依赖,从而构建一个适用于自身业务环境的镜像。

简单来说,读者可以把操作系统的基础镜像理解为一个干净版操作系统,通过Dockerfile(相当于Linux上的安装脚本)往这个干净版操作系统上安装需要的软件后,再生成一个新的镜像。

下面是一个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构建一致的开发环境是依赖于Dockerfile:把编写完成的Dockerfile放置在版本管理服务器中,在不同的服务器上获取这个Dockerfile并运行就能构建相同的镜像,从而得到一致的开发环境。这个流程如图4所示。
这里写图片描述
图4 用Docker构建开发环境流程

docker使用场景的思考

使用docker后,可以获得资源隔离,弹性扩展,简化配置等好处,但docker真的适合每个项目吗?
虽然docker简化了运维,但是docker本身也带来了新的运维问题:例如怎么部署一个docker集群,docker集群的监控,docker故障的排查等等,除了这些问题外,在把docker引入项目中仔细考虑下面的因素:

  • 工程师学习docker需要花费多少时间?
  • 这些时间投入能对项目的进展带来正面影响吗?
  • 如果docker在使用中出现了问题,有足够的资源去解决这些问题吗?

本人把网络上发表的一系列“app后端”文章加以整理并增加了运维和架构方面的内容,出版了书籍《App 后台开发运维和架构实践》,该书已在京东,当当和亚马逊上销售。

《App后台开发运维和架构实践》的购买链接

京东

京东
当当
亚马逊
互动出版网
天猫

打开链接 app后端设计–总目录 ,能查看本人发表过的所有原创“app后端”文章。

【作者】曾健生
【QQ】190678908
【微信公众号】 appbackend
【新浪微博】 @newjueqi
【博客】http://blog.csdn.net/newjueqi

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

newjueqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值