本文讲的是你很有可能在滥用Docker,【编者的话】Docker提供伸缩,Container越来越大,各种版本的冲突不断,安装包管理器是怎么处理的,如果还在为这些头疼,还有这些疑问,可以了解一个小工具——Nix。
Docker最初的设计目标之一是简化对应用进行扩缩的工具。其目的是支持PaaS平台的建设(Docker是dotCloud的一部分,一个提供PaaS服务的平台)。
今天Docker经常被用于发布应用程序,而不是仅仅使得应用易于扩缩。如果你只是在开发环境下使用Docker,那你很可能只是用它来获得一个可重现的开发环境,而不是用它来对应用进行扩缩。
糟糕的软件发布
Docker经常被用来发布应用,因为现发布应用是一件很困难的工作。先看看我们可能用到的包管理器吧:yum、apt-get、npm、composer、gem、cabal等等。每种语言的生态系统里都有自己的包管理器。基本上这些包管理器都做着同样的事情:确保给定应用所依赖的所有软件包都可用。有些时候,这意味着需要下载二进制文件,将其放在PATH变量的路径中,或者需要下载JavaScript源代码,并使得运行环境可以访问这些源代码。
许多二进制包管理器把安装包存在一个全局的、可修改的包目录下,例如 /usr/local/bin。假设我们有一个应用A,依赖于安装在/usr/local/bin下的Ruby 1.8.1,同时要求该路径位于PATH变量中。如果我们现在要安装另一个应用B,而应用B需要Ruby 2.2.1,那么我们就需要升级Ruby。(如果我们升级了Ruby),那么因为应用A不能兼容新的Ruby版本,就会被影响到。安装B的时候我们破坏了A。换句话说:安装软件包的动作是有副作用的。这是由于(不同应用使用了相同的)全局可修改的目录。
由于这些副作用的原因,你就不能仅仅考虑你所安装的东西。你需要留心这样做可能会破坏你现有的设置。当然这其实也是容器技术的可贵之处:你可随意试验不同的配置,之后重启容器。就像你可以只交付最终的成品蛋糕而不是配方,你可以避免包管理器的这些副作用。这也意味着我们期望运行的(应用)肯定能够工作,而不会因为缺失所依赖的软件包而产生错误。
不好的一面就是容器的规模会越来越大。这意味着部署会越来越慢,工具的响应时间也会变长。容器通常包含着整个操作系统。想想看:你运行某个操作系统的目的仅仅是为了运行带有各自操作系统的容器。这种架构看起来很脏。不过,忍受包管理器的副作用也不是什么好的出路。
欢迎来到未来:Nix
Nix是一个打破全局可修改软件包目录的一种包管理器。引用Nix网站的一段话:
Nix的一个较为纯粹的功能性方案就是确保安装或更新软件包的时候不会破坏其它软件包。 这是因为它不会用较新的版本覆盖软件包的依赖关系,从而避免其他地方被破坏。Nix支持回滚到之前的版本,并且确保更新过程中没有软件包会处于不一致的状态。
让我们回顾一下刚才应用A和B的例子。使用Nix时,我们可以告诉它“A需要Ruby 1.8.1”而“B需要Ruby 2.2.1”。Nix可以让每个应用运行在自己特定的环境里。A在它的PATH变量中可以找到Ruby 1.8.1,B在它的PATH变量中可以找到Ruby 2.2.1 。
在幕后,Nix所管理的是一个没有副作用的软件包存储。两个不同版本的Ruby可以同时存在,因为Nix避免了典型的包管理器意义上的全局环境(变量)。典型的包管理器会在全局的PATH变量中不断添加新的路径。Nix并没有向PATH变量中添加新的内容。一种例外情况是使用nix-env工具(https://nixos.org/nix/manual/#sec-nix-env)时,PATH变量仍然会被修改,不过那只是针对使用Shell的用户,而不是应用程序。如果需要使用某一个软件包的话,你要明确地告诉Nix,不然那个软件包是无法保证可用的。
因为Nix是没有副作用的,你不需要使用容器来实现可重复的版本生成。Nix避免了包管理的缺点,从而取代了Docker使用场景中原本不可或缺的一种功能。当你可以用Nix来替换掉容器相关的技术时,你就不再需要为交付容器化的应用而额外交付一个操作系统【译注:指的是容器镜像中包含的操作系统】了。
有一些场合中使用容器仍然是有意义的。前面已经说了,使用Docker可以很容易地扩缩软件。但大多数Docker使用者没有这样的问题。他们使用Docker只是因为“它可以工作”。
Docker和Nix并不互相违背。您可以使用Nix来构造你的Docker镜像。现在,你的开发人员可以不使用Docker就运行软件,因为他们可以得到与在本地机器的Docker中一样的配置。在生产环境中则可以使用Docker来实现较容易的容量扩缩。
结语
Docker是用于软件扩缩的,但被滥用来发布可重现的生成版本。其原因是:包管理器很差劲,并且由于全局可修改状态的原因导致副作用,其部署相关是不可预测的。使用像Nix这种较好的包管理器可以实现软件的可重现版本生成,而且你很有可能不再需要Docker。一个好的包管理器可以让你任意操控却不破坏环境,就像容器所希望做到的那样。
关于Nix的更多信息可参看:https://nixos.org/nix/about.html。
原文链接:You Are Most Likely Misusing Docker(翻译:milef 审校:滕启明)
原文发布时间为:2016-03-30
本文作者:milef
本文来自合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:你很有可能在滥用Docker