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

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.

相关推荐
热点推荐
号召国人要沉住气,胡锡进又喝假酒了

号召国人要沉住气,胡锡进又喝假酒了

林中木白
2026-01-25 17:14:01
CBA官宣全明星首发阵容:徐杰蝉联总票王 赵睿北区票王庞峥麟入选

CBA官宣全明星首发阵容:徐杰蝉联总票王 赵睿北区票王庞峥麟入选

醉卧浮生
2026-01-26 16:11:52
国防部新闻发言人蒋斌就近期涉军问题发布消息

国防部新闻发言人蒋斌就近期涉军问题发布消息

中国军视网
2026-01-24 15:55:20
吃他汀一颗花生不能碰?医生提醒:不止花生,这5样食物也要小心

吃他汀一颗花生不能碰?医生提醒:不止花生,这5样食物也要小心

路医生健康科普
2026-01-26 10:09:49
女明星被实名举报“插足婚姻”!

女明星被实名举报“插足婚姻”!

新动察
2026-01-26 10:45:00
解放军报社论:坚决打赢军队反腐败斗争攻坚战持久战总体战

解放军报社论:坚决打赢军队反腐败斗争攻坚战持久战总体战

新华社
2026-01-24 23:03:04
网友比赛前搜哈日本赢,网友调侃:发国补了

网友比赛前搜哈日本赢,网友调侃:发国补了

映射生活的身影
2026-01-26 01:59:15
美国移民执法行动导致2名美公民死亡后,克林顿、奥巴马发声

美国移民执法行动导致2名美公民死亡后,克林顿、奥巴马发声

环球网资讯
2026-01-26 09:51:41
李昊:看到球迷接机很激动!没什么虽败犹荣,决赛输了就是输了

李昊:看到球迷接机很激动!没什么虽败犹荣,决赛输了就是输了

奥拜尔
2026-01-26 15:45:53
网购百草味958克坚果礼盒只有33克坚果,大部分是饮料!律师解读

网购百草味958克坚果礼盒只有33克坚果,大部分是饮料!律师解读

中国基金报
2026-01-26 00:10:18
日本新首相人选正式出炉,对华政策引人关注

日本新首相人选正式出炉,对华政策引人关注

风干迷茫人
2026-01-26 12:08:00
赔偿20亿!损失6亿!LNG船“国产化”交“天价学费”!

赔偿20亿!损失6亿!LNG船“国产化”交“天价学费”!

国际船舶网
2026-01-25 19:51:03
美ICE又打死一人!医生讲述:受害者倒地无人救,特工忙着数他身上的弹孔

美ICE又打死一人!医生讲述:受害者倒地无人救,特工忙着数他身上的弹孔

红星新闻
2026-01-26 14:17:20
徒手独攀台北101,是人类对AI模拟一切的最有力反击

徒手独攀台北101,是人类对AI模拟一切的最有力反击

不懂经1人独角兽
2026-01-25 22:38:44
李想的安全执念

李想的安全执念

汽车观察AUTO
2026-01-24 22:05:02
“戏混子”没走,比资本家丑孩子更可怕的是“星二代”开始世袭了

“戏混子”没走,比资本家丑孩子更可怕的是“星二代”开始世袭了

流史岁月
2026-01-26 10:58:30
李湘背后,赵薇、黄有龙、佘智江的跨境黑金链

李湘背后,赵薇、黄有龙、佘智江的跨境黑金链

每日一见
2026-01-26 02:35:01
李嫣18岁生日发了几张自拍,大大方方把唇腭裂修复后的样子亮出来

李嫣18岁生日发了几张自拍,大大方方把唇腭裂修复后的样子亮出来

小椰的奶奶
2026-01-26 16:02:19
唯一的进口豪华“逆行者”,何以穿越周期?

唯一的进口豪华“逆行者”,何以穿越周期?

汽车观察AUTO
2026-01-23 13:00:02
外交部回应美国威胁对加拿大进口商品征收100%关税

外交部回应美国威胁对加拿大进口商品征收100%关税

界面新闻
2026-01-26 15:24:34
2026-01-26 17:35:00
CSDN incentive-icons
CSDN
成就一亿技术人
26279文章数 242221关注度
往期回顾 全部

科技要闻

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

头条要闻

女子乘二等座买到"单人座":空间较宽敞 旁边能放行李

头条要闻

女子乘二等座买到"单人座":空间较宽敞 旁边能放行李

体育要闻

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

娱乐要闻

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

财经要闻

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

汽车要闻

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

态度原创

家居
数码
游戏
旅游
军事航空

家居要闻

流韵雅居,让复杂变纯粹

数码要闻

白色单风扇:七彩虹推iGame RTX 50 Mini W OC显卡,可选5070

屠村也未必是坏人?Xbox《神鬼寓言》系统大改引争议

旅游要闻

南京将针对“春秋假”,推出研学旅游体系

军事要闻

委代总统称遭美威胁:马杜罗已死

无障碍浏览 进入关怀版