找回密码
 立即注册
搜索
查看: 4852|回复: 33

[软件] 容器的基础还是linux吗

[复制链接]
发表于 2023-12-5 12:47 | 显示全部楼层 |阅读模式
之前docker时代,几乎只有基于linux的容器,windows虽然加入了docker但只有无界面环境,几乎没有可用的资源
lxc就不说了直接跟linux绑定
如果容器内有内核级的bug,能升级容器吗


回复

使用道具 举报

头像被屏蔽
     
发表于 2023-12-5 13:04 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

 楼主| 发表于 2023-12-5 13:09 | 显示全部楼层
lvcha 发表于 2023-12-5 13:04
windows用wsl2的docker挺好的。

那依然基于linux,实际上winserver为基础的docker部署实例俺根本没见到过
回复

使用道具 举报

发表于 2023-12-5 13:10 | 显示全部楼层
本帖最后由 乔槁 于 2023-12-5 13:18 编辑

创建一个虚拟机,然后在里面折腾。              X
利用 Linux 内核特性,虚拟隔离的硬件环境。 ✔

docker虽然是虚拟化,但并不是虚拟机。
Docker 利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心命名空间(namespaces),来建立独立的容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。

MacOS与Windows需要虚拟Linux,然后在上面跑docker,是因为macOS与Windows没有Linux内核。

宿主机是Linux,就不需要套一层虚拟机。当然,容器里面开虚拟机、搞套娃也是一种玩法。
回复

使用道具 举报

发表于 2023-12-5 13:15 | 显示全部楼层
容器是资源隔离,用的linux的namespace
和虚拟机概念类似,实现方式不同
bsd也有类似的东西叫jail
回复

使用道具 举报

     
发表于 2023-12-5 13:29 | 显示全部楼层
本帖最后由 紧那罗 于 2023-12-5 13:32 编辑

现在流行的容器技术是基于linux cgroup实现的 实质上不存在所谓windows macos的容器 平时说的容器一般就是特指linux容器

> 如果容器内有内核级的bug,能升级容器吗
这个也不成立 容器不包含操作系统内核 是建立在操作系统之上的  内核的问题是操作系统底层问题 该升级就升级操作系统
这个你网上找张图应该很好理解
回复

使用道具 举报

     
发表于 2023-12-5 14:32 来自手机 | 显示全部楼层
cgroup 是用来分配 cpu 等资源的,容器主要依赖 namespace 的资源隔离,这些容器化工具只是对 namespace api 的封装和管理,使用 linux 自带的,封装了这个 api 的 unshare 工具也能做出简易容器,其他的系统可能也有类似的技术,但这种技术的本质是资源隔离,而非什么模拟虚拟,所以 linux 软件还是只能运行在 linux 容器中,跟容器使用什么基础无关,想用 linux 的软件,就只能使用 linux 内核的容器。
namespace 也不是虚拟机,熟悉 linux 的人可以理解为增强版的 chroot,所有的进程都运行在同一个内核上,所以才几乎没有性能损耗,像楼上说的,容器内不会有内核 bug,因为只运行了一个内核。

—— 来自 Xiaomi M2012K11AG, Android 13上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2023-12-5 14:42 | 显示全部楼层
本帖最后由 Midnight.Coup 于 2023-12-5 14:49 编辑

Windows 有不需要 Linux 的容器啊,https://learn.microsoft.com/zh-c ... /windowscontainers/
Windows 容器提供了两种不同的运行时隔离模式:process 和 Hyper-V 隔离

Windows 的体系结构与 Linux 有很大不同。 Linux 具有单片内核,而在 Windows 中,用户和内核模式绑定得更紧密。 在引入容器之前,Windows 用户模式和内核模式是同步发布的,这使得 Windows 上的容器兼容性要求与 Linux 中的标准不同。
在 Windows 中突破用户/内核边界是一项艰巨的任务并且非常重要,但是,我们一直在努力在所有 Windows 中保持此边界,以便为我们的客户提供运行下层容器的灵活性。 自 Windows 11 和 Windows Server 2022 起,我们支持在 Windows 11 主机上运行进程隔离的 WS2022 容器。 我们已尽力捕捉突破边界的区域,但现在希望在 Windows 11 上向开发人员开放该功能以获取反馈。

FreeBSD 13/14 最近也有了,https://github.com/michael-yuji/xc具体部署演示,还有实验性的项目 runj https://github.com/samuelkarp/runj/
回复

使用道具 举报

     
发表于 2023-12-5 14:55 | 显示全部楼层
无标题-2023-12-05-1432.png

根据我很久前的记忆,windows的docker最早也是用hyper-v虚拟出一个linux环境提供环境给你使用

wsl2是现在也是虚拟机的形式了,而不像wsl那样把linux的系统调用翻译成windows的

当前的容器化技术实际上对接的是linux内核,而不是广义的linux系统或发行版,linux发行版=linux内核+包管理器(以及特定版本的基础库如glibc)

容器实例=借用宿主机的内核让你跑自己的程序,特定类型的容器镜像可能还会提供包管理,比如ubuntu镜像库。但它的功能是残缺的:比如你无法调用多数sysctl功能、apt upgrade的时候它也不会为你提供和linux内核版本相关的升级管理

如果NT Kernel实现了和linux兼容的隔离环境能力是否能提供一个和linux类似的容器?应该是有可能的,这个功能就很接近于沙盒的功能了,但NT的二进制和linux的二进制程序毕竟是不兼容的,所以你在上面跑的想必是windows的程序

回到最后一个问题,“如果容器内有内核级的bug,能升级容器吗”,综上可知,容器本身不会有内核级bug,它借用的是宿主机的内核能力,你需要升级的是上一级宿主机的内核
回复

使用道具 举报

     
发表于 2023-12-5 15:15 | 显示全部楼层
Windows Docker 有 2 种后端,另一种就是 Windows 自己的容器
1.png

回复

使用道具 举报

发表于 2023-12-5 15:15 | 显示全部楼层
indtability 发表于 2023-12-5 14:32
cgroup 是用来分配 cpu 等资源的,容器主要依赖 namespace 的资源隔离,这些容器化工具只是对 namespace ap ...

虚拟化是资源的抽象,概念相当大,容器当然也是虚拟化
当然和模拟是两码子事
回复

使用道具 举报

发表于 2023-12-5 15:22 | 显示全部楼层
Midnight.Coup 发表于 2023-12-5 14:42
Windows 有不需要 Linux 的容器啊,https://learn.microsoft.com/zh-c ... /windowscontainers/

FreeBSD 1 ...

无论hyper-v还是wsl2都跑的Linux内核
Win自己就是跑不了docker,没问题
回复

使用道具 举报

     
发表于 2023-12-5 15:30 来自手机 | 显示全部楼层
tsubasa9 发表于 2023-12-5 15:15
虚拟化是资源的抽象,概念相当大,容器当然也是虚拟化
当然和模拟是两码子事 ...

虚拟化总得虚拟出什么东西吧,namespace 技术没虚拟出任何东西,这个词宽泛到连 namespace 都能包含进去的话,那我觉得这个词本身就没什么讨论价值了。

—— 来自 Xiaomi M2012K11AG, Android 13上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

     
发表于 2023-12-5 15:47 | 显示全部楼层
本帖最后由 Midnight.Coup 于 2023-12-5 16:05 编辑
tsubasa9 发表于 2023-12-5 15:22
无论hyper-v还是wsl2都跑的Linux内核
Win自己就是跑不了docker,没问题

linux 也没有注册表啊https://learn.microsoft.com/en-us/virtualization/windowscontainers/manage-containers/hyperv-container
图片.png
图片.png

回复

使用道具 举报

 楼主| 发表于 2023-12-5 16:46 | 显示全部楼层
tsubasa9 发表于 2023-12-5 15:22
无论hyper-v还是wsl2都跑的Linux内核
Win自己就是跑不了docker,没问题

他的说法没错,这就是俺提到的windows加入docker,就是跑在docker模式下的windows,内部是core模式.net环境
俺是真没见过有人用这种容器
回复

使用道具 举报

发表于 2023-12-5 16:55 来自手机 | 显示全部楼层
Midnight.Coup 发表于 2023-12-5 15:47
linux 也没有注册表啊https://learn.microsoft.com/en-us/virtualization/windowscontainers/manag ...

感觉挺有意思,研究一下
回复

使用道具 举报

发表于 2023-12-5 17:00 来自手机 | 显示全部楼层
indtability 发表于 2023-12-5 15:30
虚拟化总得虚拟出什么东西吧,namespace 技术没虚拟出任何东西,这个词宽泛到连 namespace 都能包含进去 ...

隔离就是虚拟出来的东西,比如只给容器两个核心,4g内存
当然这种名词就是方便用的,你认为不一样就不一样
回复

使用道具 举报

 楼主| 发表于 2023-12-5 17:30 | 显示全部楼层
ChengChung 发表于 2023-12-5 14:55
根据我很久前的记忆,windows的docker最早也是用hyper-v虚拟出一个linux环境提供环境给你使用

wsl2是现 ...

那容器会不会对宿主版本有依赖,还是随便发行版本、内核版本都能跑
现在主流的容器操作,还需要docker吗
回复

使用道具 举报

     
发表于 2023-12-5 17:56 | 显示全部楼层
macos 发表于 2023-12-5 17:30
那容器会不会对宿主版本有依赖,还是随便发行版本、内核版本都能跑
现在主流的容器操作,还需要docker吗 ...

docker只是一种流行的容器实现
好比你可以徒手画圆画直线,但圆规和直尺可以让你画得更快更好
也不是随意内核版本都能跑,你可以理解作大于某个版本号的,支持相关特性的内核版本都能跑
容器里跑的服务可能会对宿主内核版本有依赖,比如用了某个内核版本才开始提供的特性支持
回复

使用道具 举报

     
发表于 2023-12-5 18:41 来自手机 | 显示全部楼层
tsubasa9 发表于 2023-12-5 17:00
隔离就是虚拟出来的东西,比如只给容器两个核心,4g内存
当然这种名词就是方便用的,你认为不一样就不一 ...

……

资源隔离指的是 namespace,分配核心内存是 cgroup 的事,容器化的核心是 namespace,最主要的是 mount namespace,利用它解决依赖问题。namespace 和 cgroup 的基本单位是进程,内核中没有容器这个东西,只有处于某个 namespace 下的进程。

—— 来自 Xiaomi M2012K11AG, Android 13上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

发表于 2023-12-5 18:53 | 显示全部楼层
“虚拟化是资源的抽象”这个说法问题有点大吧,往stdout println一个"hello world"都是虚拟化应用的话跟该词常见词义不太一致。
回复

使用道具 举报

发表于 2023-12-5 19:08 | 显示全部楼层
indtability 发表于 2023-12-5 18:41
……

资源隔离指的是 namespace,分配核心内存是 cgroup 的事,容器化的核心是 namespace,最主要的是 m ...

我说的是容器看作虚拟化这个概念的原因,谁跟你扯内核实现了
说白了容器和虚拟化的区别前者用内核机制做隔离,后者用硬件机制vt-x这种做抽象隔离罢了
你要说容器不是虚拟化可以,我也说了名词认知而已,你杠就是你对
回复

使用道具 举报

发表于 2023-12-5 19:14 | 显示全部楼层
posthoc 发表于 2023-12-5 18:53
“虚拟化是资源的抽象”这个说法问题有点大吧,往stdout println一个"hello world"都是虚拟化应用的话跟该 ...

抽象的意思是计算机资源的软件抽象,并把抽象出来的资源当作真实资源用
你说的stdout当然不能当真实显示器用
当然我说了不算,ibm比我权威
https://www.ibm.com/topics/virtualization
回复

使用道具 举报

发表于 2023-12-5 19:34 来自手机 | 显示全部楼层
tsubasa9 发表于 2023-12-5 03:14
抽象的意思是计算机资源的软件抽象,并把抽象出来的资源当作真实资源用
你说的stdout当然不能当真实显示 ...

Virtualization uses software to create an abstraction layer over computer hardware that allows the hardware elements of a single computer—processors, memory, storage and more—to be divided into multiple virtual computers, commonly called virtual machines (VMs).
这是一整个句子啊,整个that后面都是在修饰具体是什么样的抽象才算虚拟化,虽然中文文法里不多见这种后置的长从句,也不能真的只看一半啊 另外其实这句话给的定义也一点都不宽泛,甚至只包括了一台实体机分成多台虚拟机这种最普遍情况。
回复

使用道具 举报

发表于 2023-12-5 19:40 来自手机 | 显示全部楼层
posthoc 发表于 2023-12-5 19:34
Virtualization uses software to create an abstraction layer over computer hardware that allows the ...

我寻思我不是解释了?难不成我必须把全部定义写一遍?
回复

使用道具 举报

     
发表于 2023-12-5 19:43 来自手机 | 显示全部楼层
tsubasa9 发表于 2023-12-5 19:08
我说的是容器看作虚拟化这个概念的原因,谁跟你扯内核实现了
说白了容器和虚拟化的区别前者用内核机制做 ...

这怎么又成我杠了,我**已经没有**再提“虚拟化”这个词了,上一个回复是只指出你说法的错误和补充,如果那个回复太委婉了——使用 cgroup 分配硬件资源不叫隔离,当然,你杠就是你对。

—— 来自 Xiaomi M2012K11AG, Android 13上的 S1Next-鹅版 v2.5.4
回复

使用道具 举报

 楼主| 发表于 2023-12-5 19:44 | 显示全部楼层
posthoc 发表于 2023-12-5 18:53
“虚拟化是资源的抽象”这个说法问题有点大吧,往stdout println一个"hello world"都是虚拟化应用的话跟该 ...

抽象至少对应真实对象,但虚拟可能是凭空创造的,本质上说各种模拟器是更完全的虚拟,几乎没有能对应上的真实对象
但现在的虚拟也不完全虚拟,半虚拟化的可能很大程度上接近设备抽象层,对设备利用更直接但也越受宿主特性制约
回复

使用道具 举报

发表于 2023-12-5 19:45 | 显示全部楼层
本帖最后由 乔槁 于 2023-12-5 20:28 编辑
macos 发表于 2023-12-5 17:30
那容器会不会对宿主版本有依赖,还是随便发行版本、内核版本都能跑
现在主流的容器操作,还需要docker吗 ...

Linux内核需要大于某个版本,还要启用特定的功能。
折腾安卓的时候,发现就算root以后也不能跑docker,需要替换内核。

看这篇日文文章,这几年新出的docker运行环境还挺多的:
https://zenn.dev/ttnt_1013/articles/f36e251a0cd24e
回复

使用道具 举报

发表于 2023-12-5 20:00 来自手机 | 显示全部楼层
tsubasa9 发表于 2023-12-5 03:40
我寻思我不是解释了?难不成我必须把全部定义写一遍?

不。按IBM这里的定义,必须是把计算机硬件抽象成复数个(一个都不行)虚拟的计算机才能算是虚拟化,这和你说的“把硬件抽象,再把软件抽象出来的东西当真实资源用“完全不是一个意思啊,这个概念不仅不大,不如说是非常明确而实际,如果有一个虚拟机实现写死了一个host里只能放一个VM那都不符合了。你说的那个概念放到实际中是更贴近/dev里那堆东西。省略了that后面的从句,不是只省略了定义的细节而是省略了定义的核心,比如说“人是一种生物that…”
不过有点离题了,你不同意就不同意吧,不占楼主的帖子了。
回复

使用道具 举报

发表于 2023-12-5 20:09 | 显示全部楼层
macos 发表于 2023-12-5 19:44
抽象至少对应真实对象,但虚拟可能是凭空创造的,本质上说各种模拟器是更完全的虚拟,几乎没有能对应上的 ...

因为你搞错了,emulation和virtualization是完全不同的东西
至于半虚拟化,是介于emulation和virtualization之间的东西
回复

使用道具 举报

发表于 2023-12-5 20:20 | 显示全部楼层
posthoc 发表于 2023-12-5 20:00
不。按IBM这里的定义,必须是把计算机硬件抽象成复数个(一个都不行)虚拟的计算机才能算是虚拟化,这和 ...

你说的一般情况没错是这样,毕竟你没法通过网线用cpu和内存对吧
但虚拟化有一种特殊的设备情况,叫做存储虚拟化,真实硬盘和虚拟硬盘可以多对一甚至多对多
网盘就是这种虚拟化的例子
回复

使用道具 举报

 楼主| 发表于 2023-12-5 20:26 | 显示全部楼层
tsubasa9 发表于 2023-12-5 20:09
因为你搞错了,emulation和virtualization是完全不同的东西
至于半虚拟化,是介于emulation和virtualizat ...

本质上说俺觉得模拟器和虚拟主机是同类东西,另外半虚拟化不倾向于仿真啊,仿真软件化层面太多了一点也不硬
回复

使用道具 举报

发表于 2023-12-5 21:13 | 显示全部楼层
macos 发表于 2023-12-5 20:26
本质上说俺觉得模拟器和虚拟主机是同类东西,另外半虚拟化不倾向于仿真啊,仿真软件化层面太多了一点也不 ...

所以我说是介于emulation和virtualization之间的东西啊
para-virtualization确实不用仿真硬件,但需要改os以适配没有虚拟化能力的硬件,倒是挺像容器的
回复

使用道具 举报

     
发表于 2023-12-5 22:07 | 显示全部楼层
个人觉得没人用Windows内核的docker容器的主要原因是winserver的价格。 普通win用户几乎用不到win容器。专业用户肯定选Linux内核因为大批量部署免费。

—— 来自 S1Fun
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-20 19:30 , Processed in 0.262135 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表