网易首页 > 网易号 > 正文 申请入驻

Nix 会超越 Docker 吗?

0
分享至

  作者 | Connor Brewster

  译者 | 丁广辉

  出品 | CSDN(ID:CSDNnews)

  在讨论 Nix 的时候,大家总是喜欢拿它和 Docker 做比较。但我认为 Nix 和 Docker 是解决不同问题的工具,前者是构建和部署容器的工具包,而后者则是包和配置管理器。这两个工具在功能上确实会有一些重叠之处,都可用于创建可重现的环境。所谓“可重现的环境”指的以相同的方式创建完全相同的新环境。也就是说,这些环境拥有相同的工具、版本和配置。

  可重现的环境可以确保项目中的所有开发人员都拥有完全相同的工具集。此外,开发人员可以在与生产环境类似的环境中开发软件,因此可以避免部署时发生意外。

  Nix 和 Docker 这两种工具都可以解决:“它(可重现环境)在我的机器上运行”的问题,不过,二者采用的方法却不相同。

  使用 Docker 构建可重现的环境

  Docker 提供了创建容器镜像的工具。镜像存储了容器的内容和配置,通常包含文件系统、一些环境变量和命令。

  有了镜像,你就可以在不同的机器上创建出功能完全相同的新容器。

  你可以将镜像分发给其他开发人员,这样他们就可以构建出相同的环境了,而且你也可以通过镜像将服务部署到生产环境。

  Docker 镜像可以由 Dockerfile 创建。该文件告诉 Docker 运行构建镜像的命令,包括从宿主系统复制文件,或使用包管理器(如 apt 或 apk)安装软件包。

  下面是一个 Dockerfile 的示例:

  FROM node:12-alpineRUN apk add --no-cache python g++ makeWORKDIR /appCOPY .RUN yarn install --productionCMD ["node", "src/index.js"]

  Docker 会创建一个新容器,并在其中构建镜像。在执行 Dockerfile 中的每条命令之前,Docker都会创建一个新的文件系统层。Docker 使用的是联合挂载(Union mount)文件系统,这种系统可以将多个文件系统或目录叠加起来,显示为一个文件系统。

  由于每条命令都有自己的文件系统层,因此 Docker 可以检测哪些层仍然有效,而哪些层需要根据项目的变化重建。正确排序的命令可以提高 Docker 重建镜像的速度。

  此外,每个文件系统层可以在多个镜像之间共享。当需要利用同一个基础 Docker 镜像多个新镜像时,这会非常有用。例如,上述 Dockerfile 的基础镜像为 node:12-alpine,只要将其保存在某个地方,其他 Docker 镜像就可以共享了。

  构建好镜像后,还需要命名、打标签,然后上传到镜像存储库,然后就可以轻松与他人共享了。

  虽然有了镜像就可以构建可重现的 Docker 容器,但 Docker 并不能保证创建的镜像是可重现的,也就是说即便使用同一个 Dockerfile,运行两次 docker build,也有可能得到两个行为不同的镜像。例如,第三方软件包可能在不知不觉间发布了更新,因此导致构建的镜像也发生变化。确保使用固定的某个版本可以从一定程度上缓解这个问题,但也不能完全杜绝。

  另一个需要注意的问题是,在创建镜像时,Docker 只允许从单个文件系统层继承。你可以在 Dockerfile 中指定基础镜像,但不能将两个镜像合并起来。假设你想使用 node 和 rustc 构建容器,由于不能将 node 和 rustc 的镜像合并起来,所以只能先利用 node 镜像构建容器,然后再手动安装 rustc,或者反过来,先用 rustc 构建容器,然后再手动安装 node 。

  使用 Nix 构建可重现的环境

  为了构建可重现的环境,Nix 采用了最基本的方式。Nix 提供了一个完整的构建系统,可以单独构建各个软件包。

  在构建软件包时,你需要执行如下步骤:

  使用所需工具构建环境。

  执行脚本,运行所有构建命令。

  每个软件包的构建都可以重复这个过程,为了确保每个环境都是可重现的,Nix 做了大量努力。首先,Nix 会限制网络访问、文件系统访问,有时甚至还会在构建过程中在沙盒容器中运行,以防止构建过程中受到任何外部因素的影响。

  由于软件包会依赖第三方库,形成巨大的依赖关系网,因此 Nix 会在构建过程中遍历所有依赖项。

  而你可以使用 Nix 创建可重现的环境,只需在关系网中添加一个节点,然后让 Nix 完成第一步构建环境的工作即可。

  在开发中,你可能不希望或不需要 Nix 执行第二步。相反,你可以将 Nix 放入bash shell,自行运行构建命令。

  Nix 自带一个名叫 nix-shell 的工具,它可以为你完成这项工作。将 shell.nix 文件添加到项目的根目录,nix-shell 就可以根据所有指定的软件包构建一个新环境。

  下面是一个 shell.nix 文件的示例:

  { pkgs ? import {} }:pkgs.mkShell {nativeBuildInputs = [ pkgs.rustc pkgs.cargo ];

  Nix 并不会使用容器,它只会修改环境变量。例如,将某个二进制包添加到环境变量 PATH 中。

  由于 Nix 可以保证构建可重复的环境,因此,只需共享此 shell.nix 文件,即可为开发人员提供功能完全相同的开发环境。

  与 Docker 不同,Nix 是一个成熟的包管理器,因此 Nix 可以自由组合环境。以上述 Docker 示例为例,如果我们想在同一个环境中同时部署 node 和 rust,则只需告诉 Nix 将二者添加到构建的输入中:

  { pkgs ? import {} }:pkgs.mkShell {nativeBuildInputs = [ pkgs.rustc pkgs.cargo pkgs.nodejs-16_x ];

  应该使用哪个?

  在考虑这个问题之前,我们首先应该回顾一下:Docker 和 Nix 是完全不同的工具。

  Docker 镜像只是 Docker 提供的一小部分,Docker 为整个容器生态系统提供了工具。

  而 Nix 的设计旨在构建可重现的包和环境。

  如果你的目的是构建可重现的开发环境,则选用 Nix 更合适。

  如果你希望寻找一种方法来构建、打包和部署自己的服务,则 Docker 提供的更丰富的工具更适合你。毕竟,容器乃是如今部署 Web 服务的标准方式。

  即便如此,Docker 镜像的构建仍有很多不足之处。不过,好在我还有一张王牌:利用 Nix 构建Docker 镜像例如:

  { pkgs ? import { }
, pkgsLinux ? import { system = "x86_64-linux"; }
pkgs.dockerTools.buildImage {name = "cowsay-container";
config = {Cmd = [ "${pkgsLinux.cowsay}/bin/cowsay" "I'm a container" ];

  如此一来,我们就可以鱼与熊掌兼得:

  利用 Nix 构建可重现的 Docker 镜像。

  利用容器简化部署。

  Replit 如何使用 Nix

  目前,我们正在从通过巨大的 Docker 镜像 Polygott 提供开发工具朝着通过 Nix 提供软件包过渡。你可以看一看用户使用Nix构建的应用(https://replit.com/apps/nix)。

  我们发现, Nix 解决了我们在使用 Docker 镜像时遇到的下列问题:

  很难获知两种不同版本的 Polygott 之间发生了什么变化。

  第三方库的更新,可能会导致用户的执行环境出现各种问题。

  第三方库的下线,会导致镜像构建出问题。

  很难将所有支持语言的开发工具组合到一个 Docker 镜像中。

  Polygott 提供了一堆脚本和配置文件,用于安装每种语言所需的工具,这些维护工作非常痛苦。

  我们做了很多尝试,但最终发现没有办法在多个镜像构建之间共享一些文件系统层。Polygott 本身的大小为 20~30GB,如果在生产环境中安装多个版本,规模会迅速膨胀。

  如今在使用了 Nix 后,我们可以让用户自由选择他们需要的工具。同时还解决了上述问题,减轻了我们内部的维护负担。双赢!

  虽然我们使用了 Nix,但我们也不会因此而放弃 Docker 容器。我们仍然需要容器来为每个用户执行环境提供一个隔离的环境。

  Nix 会超越 Docker 吗?不会,这两款工具实现了不同的目标,二者的结合可以提供完美的解决方案:可重现的环境与容器化的部署。

  原文链接:https://blog.replit.com/nix-vs-docker

  声明:本文为 CSDN 翻译,转载请注明来源。

  END

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
不是当代乔丹更像KD!5连败场均36+5,西部又一豪强退出争冠行列

不是当代乔丹更像KD!5连败场均36+5,西部又一豪强退出争冠行列

你的篮球频道
2026-01-26 09:22:05
黄多多引爆‘三通一达’争议!留学圈黑话背后藏着什么秘密?

黄多多引爆‘三通一达’争议!留学圈黑话背后藏着什么秘密?

没有偏旁的常庆
2026-01-26 06:12:04
杨鸣仍担任辽宁省篮协职务

杨鸣仍担任辽宁省篮协职务

雷达财经
2026-01-26 11:15:03
157分钟鏖战!中国金花绽放澳网:决胜盘9-10反转,16进8对手确定

157分钟鏖战!中国金花绽放澳网:决胜盘9-10反转,16进8对手确定

刘姚尧的文字城堡
2026-01-25 16:27:11
印度现尼帕疫情,我国已将该病毒列入出入境监测目录

印度现尼帕疫情,我国已将该病毒列入出入境监测目录

界面新闻
2026-01-26 10:42:33
伊朗国防部:伊朗的导弹防御能力得到加强

伊朗国防部:伊朗的导弹防御能力得到加强

财联社
2026-01-24 21:33:37
1月26日人民币对美元中间价调升86个基点

1月26日人民币对美元中间价调升86个基点

证券时报
2026-01-26 09:39:14
一博主炮轰李亚鹏!怒斥他涉嫌挪用慈善资金、基金使用情况不透明

一博主炮轰李亚鹏!怒斥他涉嫌挪用慈善资金、基金使用情况不透明

小徐讲八卦
2026-01-26 08:16:05
戴手铐走完二万五千里,开国前夕去见毛主席,主席却问:你是哪一个?

戴手铐走完二万五千里,开国前夕去见毛主席,主席却问:你是哪一个?

寄史言志
2026-01-17 17:30:15
上海炒股冠军肺腑之言:如果接下来迎来牛市,不妨死啃这两根均线

上海炒股冠军肺腑之言:如果接下来迎来牛市,不妨死啃这两根均线

股经纵横谈
2026-01-24 17:15:39
汪小菲接孩子回京过年,张兰很高兴,一家人团聚真好

汪小菲接孩子回京过年,张兰很高兴,一家人团聚真好

庭小娱
2026-01-26 11:14:23
U23亚洲杯结束仅1天,亚足联宣布新消息,下届分档出炉 中国第3档

U23亚洲杯结束仅1天,亚足联宣布新消息,下届分档出炉 中国第3档

大秦壁虎白话体育
2026-01-26 08:14:34
国安部“点名”张艺谋,释放三个强烈信号,原来我们确实低估他了

国安部“点名”张艺谋,释放三个强烈信号,原来我们确实低估他了

生命之泉的奥秘
2026-01-25 06:30:36
来了,曼联!曝9500万“顶星”空降加盟红魔!两员大将遭火速放逐

来了,曼联!曝9500万“顶星”空降加盟红魔!两员大将遭火速放逐

头狼追球
2026-01-26 11:37:29
又见勇三疯,库里带队刷新赛季最高抢断纪录,赛后正式表态

又见勇三疯,库里带队刷新赛季最高抢断纪录,赛后正式表态

大飞说篮球
2026-01-26 12:53:02
尹建业,被免职

尹建业,被免职

新京报政事儿
2026-01-26 12:23:24
这一周,太疯狂了!东契奇防住了卡戴珊!!

这一周,太疯狂了!东契奇防住了卡戴珊!!

柚子说球
2026-01-25 12:40:21
女留学生回国就诊“肛裂”!网友:公司现招聘海龟要体检生殖系统

女留学生回国就诊“肛裂”!网友:公司现招聘海龟要体检生殖系统

火山诗话
2026-01-24 07:32:05
A股:今天,1月26日,行情不太对劲,释放了两个重要信号!

A股:今天,1月26日,行情不太对劲,释放了两个重要信号!

明心
2026-01-26 11:28:45
近7轮独造5球!曼联水货彻底蜕变 詹俊:这有阿莫林的功劳

近7轮独造5球!曼联水货彻底蜕变 詹俊:这有阿莫林的功劳

球事百科吖
2026-01-26 05:50:02
2026-01-26 13:11:00
CSDN incentive-icons
CSDN
成就一亿技术人
26279文章数 242221关注度
往期回顾 全部

科技要闻

印奇再上牌桌,阶跃融资50亿

头条要闻

被自称前女友的网友实名举报涉毒 短剧"顶流":别搞我

头条要闻

被自称前女友的网友实名举报涉毒 短剧"顶流":别搞我

体育要闻

叛逆的大公子,要砸了贝克汉姆这块招牌

娱乐要闻

张雨绮被实名举报代孕、插足婚姻

财经要闻

从美式斩杀线看中国社会的制度韧性构建

汽车要闻

宾利第四台Batur敞篷版发布 解锁四项定制创新

态度原创

旅游
教育
游戏
手机
时尚

旅游要闻

“到仙境蓬莱过大年”之“神仙生活蓬莱湾 好山好水小门家”活动启幕

教育要闻

巧手叠出成长乐章,乐考见证全面发展——青岛敦化路小学一二年级“乐考”活动展现劳动教育新风貌

《如龙 极3》试玩版数据挖掘爆料 结局大改官方吃书

手机要闻

小米REDMI Turbo 5标准版外观公布:金属中框/玻璃背板/6.59英寸

伊姐周日热推:电视剧《太平年》;电视剧《暗恋者的救赎》......

无障碍浏览 进入关怀版