虚拟化技术历史
计算机虚拟化技术由来已久,从硬件仿真到全虚拟化,再到准虚拟化和操作系统虚拟化,各种技术粉墨登场,种类繁多,说实在的有点眼花缭乱和复杂;但用户的核心诉求一直是比较简单的,降低信息技术(IT)的运营成本,提高资源利用率,提高安全性和可靠性等等;虽说用户的核心诉求比较简单,但每个时代的需求场景却是不同的。在大型机时代,虚拟化技术被用来支持多个用户能够同时使用大型机,在x86架构时代,随着企业服务的大规模部署,虚拟化技术主要是用来提高企业资源的利用率,而现如今,随着云计算时代的到来,人们对应用的安全性、隔离性越来越高,对于部署的标准化以及虚拟机的性能要求越来越高
什么是Docker?
docker的英文本意是码头工人,也就是搬运工,这种搬运工搬运的是集装箱(Container),集装箱里面装的可不是商品货物,而是任意类型的App,Docker把App(叫Payload)装在Container内,通过Linux Container技术的包装将App变成一种标准化的、可移植的、自管理的组件,这种组件可以在你的latop上开发、调试、运行,最终非常方便和一致地运行在production环境下。
Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker的基础是Linux的容器(LXC)等技术。
更快速的交付和部署
一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
更轻松的迁移和扩展
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
问题
我们先看看程序员在搭建开发环境时遇到的一些问题:
- 软件安装麻烦,比如很多公司都使用redhat,一般开发人员又不给root,安装一个nginx或者是mysql都得自己下载编译安装 权限问题,没有root,一些软件无法运行,例如dnsmasq;
- 没有root,无法修改hosts,无法netstat -nptl,无法tcpdump,无法iptable
- 隔离性差,例如不同的开发人员如果在同一台主机环境下共享开发,虽然是用户隔离,但端口如果不规范可能会冲突;同一个Mysql如果权限管理不好很有可能误删别人的数据
- 可移植性差,例如和生产环境不一致,开发人员之间也无法共享;更严重的情况是当有新人入职时,通常需要又折腾一遍开发环境,无法快速搭建
在服务器上部署、运行这样一个系统,我们可能会遇到下面的问题和挑战
- 隔离性:如果我们已经在这个服务器上部署了不同的网站,已有的网站只能在nginx上运行,而Wordpress依赖于Apache,这时我们就会有麻烦:它们都监听80端口。同时运行两个网站是可以的,但需要调整配置(修改监听端口),设置反向代理等。库级别也会出现类似的冲突,如果还要运行一个仍然依赖PHP4的老应用就会出问题,因为Wordpress不再支持PHP4,同时运行PHP4和PHP5则非常困难。运行在同一个服务器上的应用没有互相隔离(在文件系统级别和网络级别),所以它们可能会互相冲突。
- 安全性:Wordpress的安全记录并不是非常好。所以还是给它创建个沙箱,至少黑客入侵时不会影响其他运行的应用。
- 升级、降级:升级应用一般会覆盖现有文件。升级过程中会发生什么?系统要关闭么?如果升级失败,或者不对该怎么办?我们怎样快速回退到先前的版本?
- 快照、备份:一旦所有的内容都设置好,就给系统创建一个“快照”,以便能备份快照,甚至能移到另一个服务器上再次启动,或者拷贝到多个服务器上以备不时之需。
- 重复性:系统出新版本之后,比较好的做法是先在测试基础设施上自动部署并测试,然后再发布到生产系统。通常会利用诸如Chef、Puppet等工具在服务器上自动安装一堆包,等一切内容都就绪后,再在生产系统上运行相同的部署脚本。这在百分之九十九的情况下都没有问题。但有百分之一的例外,在部署到测试环境和生产环境之间的时间跨度里,你依赖的包在包仓库里有了更新,而新版本并不兼容。结果生产环境的设置和测试环境不同,还有可能破坏生产系统。假如没有控制部署的每一个方面(例如托管自己的APT或YUM仓库),持续在多个阶段(比如测试、预演、生产环境)重复搭建出完全相同的系统就很困难。
- 资源限制:如果我们的Wordpress耗费CPU资源,并占用了所有的CPU周期,导致其他应用无法做任何事情怎么办?如果它用尽了全部可用的内存呢?或者疯狂写日志阻塞磁盘呢?要是能限制应用的可用资源,比如CPU、内存和磁盘空间,就会非常方便。
- 易于安装:也许有Debian或CentOS包,抑或是能自动执行所有复杂步骤并安装Wordpress的Chef菜谱。但这些菜谱很难稳定下来,因为它们需要考虑目标系统上可能的系统配置。很多情况下,这些菜谱只能在干净的系统上运行。因此,你不太可能更换成自己的包或Chef菜谱。这样的话,安装就是个复杂的系统工程,而不是午休期间就能搞定的事情。
- 易于移除:软件应该能轻松、干净地移除,不留痕迹。但部署应用通常要调整已有的配置文件、设置状态(MySQL数据库的数据,日志),完全移除应用也变得不那么容易。
用例
- 持续集成和部署:在Docker容器里构建软件,确保构建之间的隔离性。构建好的软件镜像可以自动推到私有的Docker仓库中,并部署到测试环境或生产环境。
- Dokku:一个简单的PaaS,用不到一百行的Bash构建而成。
- Flynn和Deis,两个使用Docker的开源PaaS项目。
- 在容器里运行桌面环境。
- CoreOS验证了Docker的合理性,CoreOS是个非常轻量级的Linux发行版,其中的应用都用Docker安装、运行,由systemd管理。
$ sudo docker pull dl.dockerpool.com:5000/ubuntu:14.04
$ sudo docker run -t -i dl.dockerpool.com:5000/ubuntu:14.04 /bin/bash
root@bbd6919bb447:/
安装python2.7
$ sudo apt-get install build-essential libsqlite3-dev zlib1g-dev libncurses5-dev libgdbm-dev libbz2-dev libreadline-gplv2-dev libssl-dev libdb-dev
$ wget https://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar xzvf Python-2.7.3.tgz
$ cd Python-2.7.3
$ ./configure
$ make
$ make install