介绍docker

来源:互联网 发布:mac转码工具 编辑:程序博客网 时间:2024/06/05 04:50

       文/李国柱  

       一直有人说docker是划时代的技术,但看资料介绍,要不是操作方法,要不就是Web 2.0,DevOps,去中心化,云里雾里,不知所云。而不使用的人会觉得“就是个轻量化的虚拟机”,这个技术的重要性就被轻飘飘地带过去了。

 

       本文试图在一定程度上消除这个gap,介绍一下docker的功能,说明为什么docker是“划时代的”。笔者对docker的理解还相当初级,希望更多有经验的维护者不苟指正。

 

Linux服务器由一组用户态应用程序和一个操作系统内核组成,像下面这样:

 


       业务软件面对一个复杂的应用环境。比如一个Web服务器,客户端连上来了,运行一个服务,这个服务以什么权限进行?这个就涉及这个文件系统环境中的一系列配置了,比如鉴权系统的配置,为不同的服务器选择对应的鉴权系统,这就涉及一组配置文件。然后这个服务用哪几个IP地址?路由怎么配置?这又是一组的配置文件。用哪个数据库?这又是一组配置。好吧,比如现在我装好了一台Ubuntu Linux系统,我配好了一个Web服务器,交给同事维护,这个同事维护一段时间后,被人DDOS攻击了,他在tcpd里面配置了一个IP过滤,我怎么知道?一个Linux的文件系统里面有几十万个文件啊,他在这里面藏了这么一个配置,你说我怎么找?

       靠文档化吗?文档和实现的一致性——你告诉我什么时候被解决过?文档和实现一致是要钱和时间的啊,乖乖。谁能等你?

       所以,在大规模的云数据机房,是不能这样维护系统的。基本上,你在一台机器上配置好了,你得把这个文件系统整个备份下来,什么时候把一个环境弄坏了,把它整个废弃掉,从那里重新配一个上线。所以你会看见,在数据机房中,即使一台机器上只跑一个虚拟机,别人也要用虚拟机来跑,因为虚拟机可以把整个文件系统备份,然后所有东西都用这个虚拟机完整地重新跑起来。

       docker怎么解决这个问题的呢?docker是一个管理程序,它在你的文件系统中放了很多个完整的子文件系统,让你的业务软件运行在你自己的“名称空间”中,像这样:

       比如我先配置好了一个ubuntu,我可以把这个文件系统备份下来,称为ubuntu.tar,然后交给你,你只要运行:
-bash代码
1docker load < ubuntu.tar
2docker run -P -d --name myubuntu_server ubuntu:latest
(这里先补充几个docker的基本语义:
保存在docker中可以被单独运行的文件称为一个“image”,比如这里的ubuntu:lastest,其中ubuntu称为“repository”,表示“一类”image,你可以类比为git里的一个branch;lastest称为tag,表示repository的一个版本。
而这里的ubuntu.tar是image的一个备份
把image运行起来,就生成一个container,container是image的运行形态,但和“进程是程序的运行态”不同的是,container在运行结束后仍然存在(因为你可能修改了image的文件系统中的内容),你可以重新运行它,或者通过commit命令,把它保存为另一个image)
 
        就可以把我的在这个ubuntu配置的业务软件运行起来了,这个业务软件完全使用自己的文件系统,和别人都没有关系,它对外使用固定的网络,这些网络的端口都映射到我本地指定的端口上,这样我一台机器上可以随意启动两个Web Server并映射到两个不同的端口上,比如这样:
-bash代码
1docker run -p 80:8000 -d --name webserver1 ubuntu:latest
2docker run -p 80:8001 -d --name webserver2 ubuntu:latest
       这两个命令运行了两个ubuntu(版本是latest,假设我在里面配置了Web Server),一个映射到本地的8000端口上,另一个映射到本地的8001端口上。
你看,这样就把一个复杂的“系统配置”工作,变成一个“应用程序运行”的工作了。
 
       如果你想调整一下ubuntu:latest的配置,很简单,你可以这样:
-bash代码
1docker run -ti --name=myconfig_container ubuntu:latest /bin/bash
       这样你就可以“进入”这个系统进行配置了,配置完成后,把这个container保存为一个image,就可以被其他人用了:
-bash代码
1docker commit myconfig_container ubuntu:myconfig_version
       这个地方的强悍之处在于,docker用了一个称为aufs的技术,你在ubuntu:lastest中做配置,ubuntu的文件系统假设称为f1,然后你在myconfig_container中对f1进行修改,修改的内容并不会修改到f1中,而是修改在f1a文件中。aufs的作用是,它可以把这些f1, f1a, f2a, f3a……全部叠加起来,作为一个文件系统来用。所以你的myconfig_container并不会覆盖ubuntu:latest,而是针对ubuntu:latest的一个patch。
 
       如果读者熟悉git,很容易就明白这意味着什么了,这表示你是像开发软件和进行版本管理一样维护整批整批的服务器文件系统,并且可以任意把它们部署到网络中的任何一台支持docker的服务器上。
 
       这个设计彻底改变了我们对一个“网络服务”的看法,让它从“一台机器”退化回“一个程序”。它的影响是深远的,首先是guest文件系统的设计变得简化,只要能支持启动一组服务器程序就可以了。不需要复杂的init.d服务,不需要复杂的本地鉴权设计(当然,应用本身的鉴权还是需要),不需要考虑硬件兼容性(因为对OS的抽象都是一样的),这些变化是要踩到很多服务器OSV,IBV的尾巴的。
 
       另一方面是Host OS的设计也会变得简化,现在的CoreOS和RancherOS的出现就是例子,这两者都提供了一个最简化(只能运行docker)的基础操作系统。这个操作系统没有复杂的包管理,没有很多的软件,它就干一件事,让你用docker运行其他操作系统。
 
       你说,是否有这么一天?:我们买一台服务器,它提供的不再是UEFI接口,让你安装操作系统,而是直接给你一个RancherOS,然后要配置硬件,都可以直接用OS级别的功能完成,然后,你需要运行Redhat就运行Redhat,需要运行Suse就运行Suse?
 
       这一切,说到底,就是服务器已经太强大了,到了可以做减法的时候了。
 
(更多华为资讯请关注华为开发者社区,华为自己的对外开放门户:http://developer.huawei.com/cn/ict/ ,不要问我叫啥,别人都叫我雷锋)
 
1 0
原创粉丝点击