微信号:infoqchina

介绍:有内容的技术社区媒体

Docker:利用Linux容器实现可移植的应用部署

2014-02-14 16:06 InfoQ

Docker是一种在Linux容器里运行应用的开源工具,一种轻量级的虚拟机。除了运行应用,Docker还提供了一些工具,借助Docker Index或自己托管的Docker注册表对进行了集装箱化处理的应用进行分发,从而简化复杂应用的部署过程。


我将在本文介绍如今在部署复杂系统时公司所面临的挑战,Docker怎样有效地解决这个问题,以及Docker的其他用例。


部署的挑战

服务器应用的部署已经越来越复杂了,软件有很多类型的需求:

  • 对已安装软件和库的依赖

  • 依赖于正在运行的服务

  • 依赖于特定的操作系统)

  • 资源需求:

    • 最小的可用内存

    • 能绑定特定的端口


我们来看一个相对简单的应用的部署:Wordpress。在服务器上部署、运行这样一个系统,我们可能会遇到下面的问题和挑战:

  1. 隔离性:如果已经在这个服务器上部署了不同的网站,已有的网站只能在nginx上运行,而Wordpress依赖于Apache,这时就会有麻烦:它们都监听80端口。同时运行两个网站需要调整配置,设置反向代理等。库级别也会出现冲突。

  2. 安全性:Wordpress的安全记录并不是非常好,所以还是给它创建个沙箱。

  3. 升级、降级:升级应用一般会覆盖现有文件。升级过程中会发生什么?系统要关闭么?如果升级失败,或者不对该怎么办?我们怎样快速回退到先前的版本?

  4. 快照、备份:一旦所有的内容都设置好,就给系统创建一个“快照”,以便能备份快照。

  5. 重复性:系统出新版本之后,比较好的做法是先在测试基础设施上自动部署并测试,然后再发布到生产系统。通常会利用诸如Chef、Puppet等工具在服务器上自动安装一堆包,等一切内容都就绪后,再在生产系统上运行相同的部署脚本。这在百分之九十九的情况下都没有问题。但有百分之一的例外,在部署到测试环境和生产环境之间的时间跨度里,你依赖的包在包仓库里有了更新,而新版本并不兼容。结果生产环境的设置和测试环境不同,还有可能破坏生产系统。

  6. 资源限制:要是能限制应用的可用资源,比如CPU、内存和磁盘空间,就会非常方便。

  7. 易于安装:也许有Debian或CentOS包,抑或是能自动执行所有复杂步骤并安装Wordpress的Chef菜谱。但这些菜谱很难稳定下来,这样的话,安装就是个复杂的系统工程,而不是午休期间就能搞定的事情。

  8. 易于移除:软件应该能轻松、干净地移除,不留痕迹。

那我们应该如何解决这些问题呢?


虚拟机

在单独的虚拟机上运行独立的应用,例如Amazon的EC2,大部分问题这时会迎刃而解:

  1. 隔离性:在一个VM上安装一个应用,应用是完全独立的,除非它们攻入了对方的防火墙。

  2. 重复性:用你喜欢的方式准备系统,然后创建一个AMI。你可以随意实例化多个AMI实例。完全是可重现的。

  3. 安全性:由于我们完全隔离,如果Wordpress遭到攻击,其余的基础设施并不会受到影响。

  4. 资源限制:VM会分配特定的CPU周期、可用内存和磁盘空间,没有加价的话就不能超额。

  5. 易于安装:越来越多的应用能够在EC2上运行,只要在AWS marketplace上点击一个按钮就能实例化应用。

  6. 易于移除:不需要某个应用了?销毁VM。干净又方便。

  7. 升级、降级:Netflix如何部署代码里提到,只需要在新VM上部署新版本,然后让负载均衡器指向部署了新版本的VM。不过应用如果需要在本地保存状态,这种方法就不是很好用了。

  8. 快照、备份:点击一个按钮(或者调用一下API)就能获得EBS磁盘的快照,快照会备份到S3中。


不过,虚拟机在两个方面比较昂贵:

  • 金钱:你真的有那么多钱为每个应用启动一个EC2实例?另外你能预测到需要多少个实例么?

  • 时间:虚拟机相关的操作大多都很慢:启动要几分钟,捕捉快照要几分钟,创建镜像也需要几分钟。


我们能做得更好吗?进入Docker的世界吧。

Docker是由公共PaaS提供商dotCloud的人发起的开源项目,于去年初发起。从技术角度来说,Docker(主要用Go语言编写)试图简化两种已有技术的使用:

  • LXC:Linux容器,允许独立进程在比普通Unix进程更高的隔离级别上运行。使用的技术术语是集装箱化:一个容器里运行一个进程。

  • AUFS:高级多层的统一文件系统,可用来创建联合、写时拷贝的文件系统。


Docker可以安装在任何支持AUFS和内核版本大于等于3.8的Linux系统上。目前只能选择Linux 3.8+和AUFS。


那Docker为什么有意思呢?

  • Docker非常轻量。启动VM是个大动作,需要占用大量内存;而启动Docker容器只耗费很少的CPU和内存,并且非常快。不仅运行容器快,构建镜像、捕获文件系统的快照也很快。

  • 它运行在已经虚拟化过的环境中。也就是说,你可以在EC2实例、Rackspace VM或VirtualBox里运行Docker。

  • Docker容器能移植到任何运行Docker的操作系统上。


让我们回到前面的部署、操作问题列表,看看Docker是怎么解决的:

  1. 隔离性:Docker在文件系统和网络级别隔离了应用。从这个意义上来讲很像在运行“真正的”虚拟机。

  2. 重复性:用你喜欢的方式准备系统(登录并在所有软件里执行apt-get命令,或者使用Dockerfile),然后把修改提交到镜像中。你可以随意实例化若干个实例,或者把镜像传输到另一台机器,完全重现同样的设置。

  3. 安全性:Docker容器比普通的进程隔离更为安全。Docker团队已经确定了一些安全问题,正在着手解决。

  4. 资源约束:Docker现在能限制CPU的使用率和内存用量。目前还不能直接限制磁盘的使用情况。

  5. 易于安装:Docker有一个Docker Index,这个仓库存储了现成的Docker镜像,你用一条命令就可以完成实例化。比如说,要使用Clojure REPL镜像,只要运行docker run -t -i zefhemel/clojure-repl命令就能自动获取并运行该镜像。

  6. 易于移除:不需要应用了?销毁容器就行。

  7. 升级、降级:和EC2 VM一样:先启动应用的新版本,然后把负载均衡器切换到新的端口。

  8. 快照、备份:Docker能提交镜像并给镜像打标签,和EC2上的快照不同,Docker是立即处理的。


Docker不是什么

尽管Docker有助于系统的可靠部署,但它本身并不是个完全成熟的部署系统。它操作的是容器里运行的应用。哪个容器安装在哪个服务器上,以及如何启动它们,则超出了Docker的范围。同样的,Docker也不处理跨多个容器运行的应用。要让容器互相通信,需要某些发现机制,来找出哪些IP和端口上的其他应用可用。


更多精彩内容,请点击阅读原文。


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 Swift开发的几个小技巧 史上最强购物助手竟然是它?看Watson带你“畅游”梅西百货! 羊年第一个工作日 为自己加个油! 创业初期,如何搭建起一个优秀的团队 关于大型网站技术演进的思考(九)--网站静态化处理--总述(1)