Docker和Snap之间的主要区别是什么?

最近的 c't(可悲的是 {{link1:付费壁垒}})中有一篇关于 Snap 和 Flatpak 的文章。

enter image description here

这听起来与Docker非常相似,很多概念都是一样的。现在我的问题是Snap和Docker之间有什么区别?它们是不同的用例吗?
1个回答

你可能会发现Mark Shuttleworth在Container Camp上的演讲"为什么我们需要一个专门用于应用程序的不同容器"与你的问题相关。他一开始就谈到了虚拟机、容器和Docker,然后在大约九分钟后继续讲解了Snaps以及它们的适用性。以下是我的总结:
不同类型的容器看起来相同,但用于不同的目的。 在内核级别上,容器实际上并不存在。可以创建不同类型的幻觉。我们可以独立地为容器所见到的用户、网络、磁盘和进程创建幻觉。 不同类型的容器实际上是关于创建的不同类别的幻觉。 Snaps 是:
- 不可变的,但仍然是基本系统的一部分。 - 在网络方面进行集成,因此共享系统的 IP 地址,与 Docker 不同,Docker 中每个容器都有自己的 IP 地址。 - 换句话说,Docker 给了我们一个东西“那里”。Snaps 给了我们一个东西“这里”。例如,在桌面上,一个 snap 可以直接提供一个应用程序。 - 一个 snap 不能污染系统的其他部分。它处于自己的盒子中。但它仍然可以(只读)看到系统的其他部分,这使得它能够与系统进行通信和集成。
你询问了与Docker不同的用例。这里有一个snaps可以做到但是Docker不能的:桌面应用程序。第三方可以使用snaps发布桌面应用程序,用户可以轻松安装和更新它们。Docker容器不能(轻松地)在屏幕上与用户图形交互,从用户的主目录加载文档或通过用户的网络摄像头提供视频会议。Snaps可以(一旦获得许可)。
你可能会问这比使用PPA好在哪里。但与Docker相比,这就像问Docker如何比手动在系统上安装依赖项更好。它更好,但具体如何最好在一个单独的、非Docker特定的问题中回答。

8这是不正确的。Docker可以与桌面应用程序进行交互(一旦获得权限)。https://github.com/jamrizzi/docker-gtk - Clay Risser
3这听起来像是Windows上的Sandboxie。沙盒化的程序可以打开对话框,访问所有本地文件,但当它们进行写入操作时,只会将数据写入它们自己的沙盒中。 - feedc0de
2那个你提供链接的工具与普通的Docker有什么不同?你可以将你的X11套接字挂载到Docker中,而无需使用特殊版本的Docker。 - feedc0de
1这不是一个工具,而是一个演示。 - Clay Risser
我明白你关于将X11套接字安装到Docker中的观点,但是你仍然需要在Docker之外安装/更新X服务器,对吗?在这种情况下,你可以使用apt-get,但是snaps在支持非交互式更新方面有优势。或者我有什么遗漏的地方吗? - Roman Gaufman
1@jamrizzi 看起来你所做的只是在脚本中给Docker提供对X11套接字的访问权限。这与让用户以任何方式参与此过程相去甚远("Docker想要访问显示器。取消还是允许?"对话框在哪里?) - Thorbjørn Ravn Andersen
我认为答案中提到的“非Docker特定问题”与“如何比使用PPA更好”的问题可能是这个 https://askubuntu.com/questions/618471/ - Organic Addict
1请注意,它无法查看/修改系统的其他部分,但可以让它查看/修改系统上用户/挂载的媒体文件。请参考以下链接了解如何让Snaps访问某个目录:https://askubuntu.com/questions/1033344/how-to-give-snaps-access-to-somedir - rogerdpack
“Snap”对于Canonical商业模式的重要性很可能远远超过它对实际用户甚至管理员的重要性。Docker在沙盒化服务器应用方面更加成熟且易于使用。PodMan也是一个有趣且更加开放的Docker替代品。而“AppImage”则是一种打包和沙盒化桌面应用程序的更为简便的方式,麻烦较少。 - erwin