你很有可能在滥用Docker

本文讲的是你很有可能在滥用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

时间: 2025-01-29 17:59:45

你很有可能在滥用Docker的相关文章

使用Docker搭建Java Web运行环境

一.Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发, 源代码托管在 Github 上, 遵从Apache2.0协议开源.Docker的目标是实现轻量级的操作系统虚拟化解决方案. 学习Docker首先要了解几个概念: 镜像-Docker的镜像和常见的系统ISO镜像类似,包含了应用程序的信息: 容器-容器相当于一个可以运行起来的虚拟机,应用程序运行在容器中,Docker运行在"Docker"上: 仓库

Docker核心技术预览【转+改】

本文简单介绍docker使用到的部分核心技术,但不做深入探究,因为每一个技术都是一个独立的项目,有机会再分别详细介绍. 来源地址:http://www.infoq.com/cn/articles/docker-core-technology-preview Linux Namespace (实例隔离) The purpose of each namespace is to wrap a particular global system resource in an abstraction tha

你真的了解Docker吗?——Docker插件机制详解

云栖TechDay活动第十八期中,阿里云容器服务团队的核心成员陈萌辉带来了题为<Docker插件机制详解>的分享,分享中,他结合阿里云容器服务实践介绍了Docker插件的基本原理.实现方法以及插件机制未来的演进. 幻灯片下载地址:https://yq.aliyun.com/attachment/download/?filename=bdefe06ba7a14d7604af5a63a4bcc4f3.pdf 以下为现场分享观点整理. 为什么需要Docker插件?   Docker之所以这么火并且有

五个基于Java的Docker镜像

[原文编者的话]Java 语言长期占据编程语言前三甲的位置,其受欢迎程度与重要性不言而喻.在容器化技术大潮中,Java 可扬容器化之长,避自身"臃肿"之短,取得更高成就.本文选择了5个有代表性的 Java 镜像进行了介绍,并指出了其现存的一些问题和解决方案,供相关人员参考. 尽管 Java 看起来不是很"时髦",但仍是一门在移动市场.开源界及企业中占据主导地位的非常受欢迎的重要的语言.举个例子,你可知道在 Apache 软件基金会中63%的项目是用 Java 写的么

Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事

本文讲的是Docker.Kubernetes.Apache Mesos 之争 | 一个与传说不同的故事[编者的话]有无数的文章.讨论和社交网络上的交流在比较 Docker.Kubernetes 和 Mesos. [3 天烧脑式基于Docker的CI/CD实战训练营 | 北京站]本次培训围绕基于Docker的CI/CD实战展开,具体内容包括:持续集成与持续交付(CI/CD)概览:持续集成系统介绍:客户端与服务端的 CI/CD 实践:开发流程中引入 CI.CD:Gitlab 和 CI.CD 工具:G

深入理解docker的link机制

什么是docker的link机制 同一个宿主机上的多个docker容器之间如果想进行通信,可以通过使用容器的ip地址来通信,也可以通过宿主机的ip加上容器暴露出的端口号来通信,前者会导致ip地址的硬编码,不方便迁移,并且容器重启后ip地址会改变,除非使用固定的ip,后者的通信方式比较单一,只能依靠监听在暴露出的端口的进程来进行有限的通信.通过docker的link机制可以通过一个name来和另一个容器通信,link机制方便了容器去发现其它的容器并且可以安全的传递一些连接信息给其它的容器.其使用方

20个令人惊叹的桌面Docker容器

大家好,今天我们会列出一些运行在Docker容器中的很棒的桌面软件,我们可以在自己的桌面系统中运行它们.Docker 是一个开源项目,提供了一个可以打包.装载和运行任何应用的轻量级容器的开放平台.它没有语言支持.框架和打包系统的限制,从小型的家用电脑到高端服务器,在何时何地都可以运行.它可以使部署和扩展web应用程序.数据库和后端服务像搭积木一样容易,而不依赖特定技术栈或提供商.它主要是由开发.运维工程师使用的,因为它简单.快速和方便,可以用来测试和辅助开发他们产品,但是我们也可以在桌面环境使用

中间件和微服务,Docker以及原生云架构的关系

微服务和Docker的发展势头 微服务和容器的主要目标是缩短软件开发时间,以及实现开发.部署以及运维的更大灵活性.为什么它过去几个月的发展势头这么猛?因为几乎所有科技巨头企业如亚马逊,谷歌,Facebook,Netflix都在这里激烈竞争. 微服务就像是一个面向服务的架构(SOA):这是一种架构和供应商技术分别独立的设计理念.因此,目前并没有明确的界定标准或规范.你永远需要在和其他人讨论之前定义你所理解的微服务术语.每个人都有不同的定义.在这篇文章中微服务是被开发,部署和独立缩放的服务.它们可以

如何使用Docker部署一个Go Web应用程序

本文讲的是如何使用Docker部署一个Go Web应用程序,[编者的话]这是国外轻量级CJ厂商Semaphore发布的教程,旨在让开发人员如何借助于Docker让Go应用程序的编译及发动实现自动化,提升开发效率的同时也能保证软件部署的可靠性. 熟悉Docker如何提升你在构建.测试并部署Go Web应用程序的方式,并且理解如何使用Semaphore来持续部署. 简介 大多数情况下Go应用程序被编译成单个二进制文件,web应用程序则会包括模版和配置文件.而当一个项目中有很多文件的时候,由于很多文件