我正在努力解决一个似乎没有人在互联网上回答详细的问题。
“在整个管道中标准化服务基础架构允许每个团队成员在生产奇偶校验环境中工作”
这是Docker的一个关键优势:它允许每个人在类似生产的环境中进行开发,测试或其他任何事情。因为通过管道的容器总是相同的。 我明白了。我知道这是必要的,Docker可以轻松实现这一点。 但是我不明白的是,为什么在Docker之前这么难?如果我有一台生产机器和一台测试机器,那么构建一个安装正确依赖项的脚本就不会有任何问题,无论机器是什么。因此,我在库或框架方面的环境将是相同的。
我理解与整个环境相关的好处是,Docker允许开发人员选择他的操作系统,而不必担心与平台相关的错误。我已经遇到过适用于Windows但不适用于Mac的功能。我认为最糟糕的错误。所以,如果我当时有Docker,我不会遇到这个问题。但是我不明白为什么Docker对于其他与环境有关的东西是如此奇迹。
我想我不理解这一点,因为我只参与过小规模的项目。也许我也没有意识到“环境”一词的全部含义。
我在这里缺少什么?为什么容器是标准化环境的突破,而脚本可以实现这一目标?
答案 0 :(得分:0)
以下列表并非详尽无遗,它只代表了docker的三个重要优势。请注意,docker不是一个神奇的解决方案,可能无法在特定环境中进行调整。
首先,对于容器,依赖关系之间没有冲突。
如果您有两个程序在不同版本使用相同的库,则必须在执行程序之前手动安装这两个版本并指定自定义环境变量。 (例如
LD_LIBRARY_PATH
)。请注意,存在一些工具来解决此问题,但仅限于特定情况(例如python中的virtualenvs)。
其次,对于容器,您没有持久性。
例如,如果您编写一个小的bash脚本来安装基于Nginx和PHP的开发环境,并且我错误地安装了Apache,即使您再次运行脚本,我的包仍然存在。问题是Apache有时会在Nginx之前启动并阻止80端口,从而破坏您的开发环境。
总而言之,如果没有停靠者,您就不确定未跟踪元素的状态,它们可能会破坏您的环境。
第三,docker允许您缩小开发和生产之间的差距。
密切环境是“代码运行所需的一切”。例如库,配置文件,解释器(python,php,...)。 Docker将应用程序与其紧密的环境打包在一起,因此您的应用程序需求与您提供的环境之间不会出现不匹配。
在开发期间更新依赖项时,这一点尤为重要,可能会忘记在生产环境中更新它们。
错误的论点是安全和隔离。安全流程从定义威胁模型开始,然后选择对策。添加docker是因为它增加了风险环境中的安全性是不够的(没有内核空间隔离)并且如果你不需要更多的话,为了安全性而添加docker就称为paranoïa。 Docker添加了用户空间隔离和默认的seccomp配置文件,但这不是使用它的理由,除非它与您的威胁模型匹配。