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

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.

相关推荐
热点推荐
北大才女蒙曼50岁至今未婚,朱迅问她:“你最想嫁给谁?”谁承想,她脱口而出说的一个名字,却让全场观众哄堂大笑!

北大才女蒙曼50岁至今未婚,朱迅问她:“你最想嫁给谁?”谁承想,她脱口而出说的一个名字,却让全场观众哄堂大笑!

背包旅行
2026-10-17 15:51:52
34℃!浙江今日多地多云,浙北沿海有雨!20日冷空气抵达,降水大风降温来袭,局部中雨其它地区阵雨!23日台风“蔷琵”外围影响带来降水

34℃!浙江今日多地多云,浙北沿海有雨!20日冷空气抵达,降水大风降温来袭,局部中雨其它地区阵雨!23日台风“蔷琵”外围影响带来降水

台州交通广播
2026-10-19 02:55:56
A股,利好来袭!科技股,密集出手!国常会,最新部署!两部门大动作,影响一周市场的十大消息

A股,利好来袭!科技股,密集出手!国常会,最新部署!两部门大动作,影响一周市场的十大消息

证券时报
2026-10-18 18:30:06
达成了!中国库里首秀!加盟全美第1高中名校

达成了!中国库里首秀!加盟全美第1高中名校

篮球实战宝典
2026-10-18 14:47:19
入职第一天因截图社死:他偷偷留个纪念,结果全公司都“看见”了

入职第一天因截图社死:他偷偷留个纪念,结果全公司都“看见”了

大稻网络科技
2026-10-16 00:02:41
随着法国2-0、挪威3-0,U17女足世界杯最新积分榜出炉

随着法国2-0、挪威3-0,U17女足世界杯最新积分榜出炉

侧身凌空斩
2026-10-19 04:09:44
雷军松了口气,小米终于不是最惨了,因为OPPO、VIVO跌的更惨

雷军松了口气,小米终于不是最惨了,因为OPPO、VIVO跌的更惨

互联网.乱侃秀
2026-10-16 12:54:32
阿塞拜疆开始实施头巾禁令,强制维护世俗化

阿塞拜疆开始实施头巾禁令,强制维护世俗化

凤眼论
2026-10-18 13:02:16
王岚钦爆砍0分助旧主辽篮迎来开门红,山东男篮这三千万花得值吗

王岚钦爆砍0分助旧主辽篮迎来开门红,山东男篮这三千万花得值吗

姜大叔侃球
2026-10-18 21:47:05
美国富人为啥不来中国过安稳日子?其实在全球富人眼里,中国才是“最危险的”

美国富人为啥不来中国过安稳日子?其实在全球富人眼里,中国才是“最危险的”

扶苏聊历史
2026-10-10 10:37:15
美共和党议员放出狠话!若中期选举失去国会控制权,将推动和解法案

美共和党议员放出狠话!若中期选举失去国会控制权,将推动和解法案

兰妮搞笑分享
2026-10-18 14:19:06
巴西大选惊天逆转?卢拉首轮落后200万票,第二轮能翻盘吗

巴西大选惊天逆转?卢拉首轮落后200万票,第二轮能翻盘吗

揽星戈
2026-10-19 06:46:18
不能再拖了!再不着手解决台海问题,全世界真的会看我们的笑话了

不能再拖了!再不着手解决台海问题,全世界真的会看我们的笑话了

瓦伦西亚月亮
2026-10-17 19:44:57
释放的信号太强烈了!

释放的信号太强烈了!

张嘴说财经
2026-10-17 19:35:47
中信证券研究部:本轮A股调整由机构重仓股诱发 机构重仓组合跌13.6%

中信证券研究部:本轮A股调整由机构重仓股诱发 机构重仓组合跌13.6%

观点机构
2026-10-18 21:01:12
立刻停止食用这些粗粮,吃得越多,肠癌风险越高?医生告诉你真相

立刻停止食用这些粗粮,吃得越多,肠癌风险越高?医生告诉你真相

任医生聊健康
2026-10-17 15:05:12
菲佐:若欧盟向基辅拨款5271亿元,斯洛伐克和匈牙利将不会加入欧盟这一揽子计划

菲佐:若欧盟向基辅拨款5271亿元,斯洛伐克和匈牙利将不会加入欧盟这一揽子计划

阿尔卑斯瞭望
2026-10-18 17:25:03
陈奕迅官宣26场演唱会:观众须封存手机,现场不得交谈、欢呼、拍手、跟唱

陈奕迅官宣26场演唱会:观众须封存手机,现场不得交谈、欢呼、拍手、跟唱

荆头条
2026-10-18 20:14:58
满脸横肉,神情恍惚,盲人演技,还没李沁自然,胡先煦也带不动她

满脸横肉,神情恍惚,盲人演技,还没李沁自然,胡先煦也带不动她

娱说瑜悦
2026-10-17 15:37:58
随着布朗绝杀吉林!广东1分惜败,辽宁赢山东11分,浙江输11分,CBA第1轮积分榜

随着布朗绝杀吉林!广东1分惜败,辽宁赢山东11分,浙江输11分,CBA第1轮积分榜

老吴说体育
2026-10-18 23:41:41
2026-10-19 07:23:00
CSDN incentive-icons
CSDN
成就一亿技术人
27050文章数 242344关注度
往期回顾 全部

科技要闻

王江舟院士:6G到底是不是骗局 是不是收割

头条要闻

法国爆发严重暴力骚乱:百年市政厅被焚烧 马克龙发声

头条要闻

法国爆发严重暴力骚乱:百年市政厅被焚烧 马克龙发声

体育要闻

别在我的地盘夺冠!海港队史首次双杀蓉城

娱乐要闻

郭麒麟被传领证,女方戳破谣言

财经要闻

马斯克:美债问题只能靠AI和机器人解决

汽车要闻

星瑞L PLUS限时售价10.97万元起 开启智混3L时代

态度原创

亲子
本地
艺术
公开课
军事航空

亲子要闻

我将重复播放观看

本地新闻

因新荣记出圈,这座浙东小城才是吃货天堂

艺术要闻

不敢信这是画的!比利时大师的女性油画,逼真程度突破认知

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

乌克兰全国超15处重要能源设施遭俄袭击 泽连斯基发声

无障碍浏览 进入关怀版