23
2025
04
16:41:45

Linux上部署的docker服务可以部署windows容器么?

Linux上部署的docker服务可以部署windows容器么?

问题1:看B站听说,Docker技术属于增量型的技术。比如docker部署在Linux上,那么下载的docker容器(比如Apache容器)中的Linux系统其实用的就是宿主机的Linux系统,而容器本身只是增量部分,其中的增量就是Apache服务,这也是我们下载的容器很小的原因。不知道以上理解是否正确?

问题2:如果上述理解正确的话,那么,有个疑问,如果我底层是CentOS系统,然后我部署了一个Ubuntu容器,那门这个容器很小的原因是不是也是因为用了相同的Linux内核的原因呢?

问题3:那么假如我底层还是CentOS系统,那么部署一个Windows容器,是不是就很大了?因为底层系统不一样,所以要部署以Windows内核开发的容器应用,那么最好部署在Windows平台上的docker服务中,才能实现容器体积很小的效果?





先回答:

1.大体正确。不能算对。

2.不正确。

3.不可能,只有Windows平台的Docker有Windows容器

由于三个问题都是讲的容器占磁盘空间的问题。我就合并分析了。回答之前,还要做一件事就是灭掉B站。什么叫增量型的技术?那反过来什么技术用了以后服务器的功能减少了?新的减肥神教吗?不存在的名词,服务器里该有Apache服务就有,没有Docker,Apache还不吃饭了,Apache早就有了。

介绍一个爆炸型的技术,叫halt。

倒过来回答,免得被我啰嗦到。Docker容器占用磁盘小的原因是,没有文档及声明信息。容器里man命令是无法调用各个命令对应的操作手册的。/usr/include目录也没有内容。License和bannar也是没有的。只有程序和相关配置,容量减少约100M+。仅此而已。

可以通过包管理器命令加回来。

另外,选用的发行版一般是alpine、debian、centos或他们的衍生版本。为什么?因为他们的包不包含引用编译用的资料,通常来说就是不包含dev/devel类型的数据。

然后再讲一个问题,Docker内软件运行后,系统里是显示这个软件的进程,与平常系统运行的软件是无法区分的(默认,非内核隔离模式)。所以Docker并没有虚拟化,而是运行在系统内核下这个是没错的。

不过,一般来说Linux下各个发行版的软件并不通用。同一发行版各个版本之间的软件还是有不能通用的风险。Docker内部之所以可以畅通无阻地运行,主要是由于Docker翻译了软件对内核的System Call。Docker的价值和伟大便在此。

综上,Docker运行Apache,只是为了方便维护,避免各种服务软件间的环境冲突。运行效率是有损失的。由于Docker自带了环境(主要是网络),Apache通过Docker可以实现多开。

Docker挤压的是虚拟化的使用场景。

所以,Windows容器断不能出现在Linux Docker里。Windows不开源,要做到,必然是逆向工程的活,这是脏活,Wine干了,Docker不屑。于是,理所当然,Windows下Linux容器需要Hyper-V(默认,或VirtualBox)。鸡同鸭讲,Docker也不行了。

不但如此,Docker还不能跨架构,除非使用Rosetta或Qemu。这一点上苹果Silicon比较划算,属于超级两面派。









问题一:可以这么理解。

问题二:是的,Linux都是Linux,不要拘泥于发行版,Ubuntu,centos,opensuse...这些都是用的Linux内核,可能这个用了4.0那个用了3.7这种。

问题三:CentOS不能通过Docker直接部署Windows容器,这等于是跨了不同类型的操作系统了,需要注意的是,Linux的Docker本身需要Linux kernel功能的支持,如果内核不支持Cgroups、Namespace,那么也不用考虑了。





虚拟机强隔离,虚拟机通过硬件虚拟化来实现虚拟机的独立操作,所以可以安装各种其他的操作系统。而容器则不同,容器只是运行环境的隔离,宿主机是可以直接看得到容器相关进程的,而且容器是共用宿主机内核,也就是说容器本身是没有独立内核的(当然也安装不了非Linux的操作系统)。容器的所有进程是直接运行在宿主机同一个操作系统里面的,容器核心是运行环境的隔离。



所有容器共享同一个物理机Linux内核, 容器一般分为系统类,工具类,服务类.

系统类, 其实就是各个发行版本做成了容器镜像,比如centos,Ubuntu等.

工具类, 比如busybox, 含有一些实用工具, 但体积比系统类小很多.

服务类, 比如Apache, Tomcat等, 只包含其本身的应用程序和相关库.

3: 是的,在Linux物理机搞Windows容器很大, 可参考:

Windows 容器基础映像docs.microsoft.com/zh-cn/virtualization/windowscontainers/manage-containers/container-base-images







问题1 正确。 问题2 正确。

问题3: 好像没有windows容器吧,windowns上部署的docker也是有一个linux虚拟机的,其实还是部署到了linux上。

简单给你介绍下:

  1. linux, linux有狠多发行版、还有linux内核有啥关系呢? linux发行版肯定用的是linux内核,发行版不过在linux内核上装了不同的程序,最重要的两套程序: 一个是桌面环境、另一个是包管理器。

  2. docker: docker是linux的隔离机制实现的,为了方便使用,又增加了一部分功能。

docker版的ubuntu,其实就是把ubuntu使用的软件安装到了docker里面,它是不带linux内核的,也不带桌面环境。(docker还实现不了显示,即使安装了桌面环境也无法展示到显示器里面,所以大家都没安装桌面。估计后续也不会实现,毕竟它不是为了搞这个的。)

docker版的apache呢,其实就是把apache的程序和配置安装到了docker内部。但是有个前提,docker需要基于某个发行版,比如基于ubuntu,那么安装时就会下载ubuntu + apache,为啥要这么做呢,主要是apache可能依赖很多软件,这样可以复用ubuntu的包管理器安装。(golang语言是纯源码编译的,编译完就一个二进制程序 ,它的程序没有任何依赖,golang的程序的docker就可以直接使用linux内核,把容器做到很小)

apache的docker 本身就是运行apache程序的,你进入容器就只能看到apache相关的进程,不会也不应该包含其他进程。docker只是将apache这个程序隔离出来了,在宿主机上, 你也可以看到docker内运行的进程。所以docker是一种隔离机制,和虚拟机完全不同的东西,虽然很多人把docker看成虚拟化的一部分。

docker最明显的好处,程序你只需要安装到docker一次,就可以在不同的机器上运行,甭管它是啥内核版本的linux,不需要关系依赖问题。


----- 补充下----感谢评论区网友支持----

因为很长时间没接触win了,看了下win的容器文档。 win确实搞了一套容器。

win的容器和linux之间应该存在隔离的,linux目测应该无法直接部署win的容器应用,两者容器理论上是一致的。 两者还是存在一定的生殖隔离,毕竟容器内部还是各自的程序。


本来windows的linux子系统还想把namespace也实现了来支持docker,后来发现有修不完的兼容性问题还是用虚拟机支持了

docker内都是linux程序,不能直接裸跑在win上的。要么虚拟机、要么子系统,必须有linux环境。 mac系统下docker同样用的虚拟机。

https%3A//hub.docker.com/layers/nanoserver/iis/latest/images/sha256-976aeffab55253b73b5abaf7a85d619faf28528457cbd8c8d6248ba746513279%3Fcontext%3Dexplore


-----------------

只有Windows平台的Docker有Windows容器------------  虽然是几年前的话题,但时代变了,换句话说,就是聪明的人太多了,Dockur/Window 解决了linux 的docker无法跑windows,不过这个也是很蛋疼的方案,linux的docker跑kvm再虚拟化跑win...





推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/10773.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: