我拥有Windows 10企业版,并且安装了Docker Desktop,启用了WSL 2后端,下载并安装了Linux内核更新包。
- 我正在学习Docker,我对Docker在幕后的工作方式有些怀疑。*
- 我已经用WSL 2画了一个Windows上Docker的基本架构图,这是正确的吗?
- 每当我们创建一个新的Linux容器时,它都会在WSL 2提供的同一个轻量级实用程序VM中创建。
- 如果我们创建一个windows容器,它会在windows操作系统上创建吗?
- 这些容器可以在需要的时候同时访问Windows和Linux内核吗?比如在
Linux container
中运行java应用程序时,它需要Windows内核,对吗?
1.**那么,默认情况下docker运行Linux容器,我们什么时候需要Windows容器呢?**我可以使用openjdk:8容器化java应用程序,但是当我运行Linux容器时,我不能拉Windows nanoserver映像,只有当我切换到Windows容器时,它才能工作。这是怎么回事?这是否意味着openjdk:8映像是Linux映像(我不知道怎么说),而Windows nanoserver映像是Windows映像?
1.Linux Containers如何运行我的java应用程序?它必须需要Windows内核,对吗?
1.如果Docker容器驻留在由WSL 2创建的轻量级实用程序VM中,它是否可以同时访问随附的Linux内核和Windows内核?
我有默认的Linux container
模式,我尝试了这两个命令。
- 当为真时,运行docker--平台=linux -d ubuntu /bin/sh -c“;你好世界;睡眠1;完成”
- Docker mcr.microsoft.com/windows/nanoserver:1903
第一个为第二个工作,我得到了以下错误。1903: Pulling from windows/nanoserver no matching manifest for Linux/amd64 in the manifest list entries
但是当我切换到windows containers
时,它就工作了。
1.那么我在openjdk:8 image和windows nanoserver上的java应用程序有什么区别呢?
1.这些不需要运行windows内核吗?
1.那么,Java是如何在Linux容器上运行的呢?
编辑:-需要更多的澄清-复制评论部分的问题。
- 还有一件事,在WSL 2中,容器不会同时访问Windows和Linux内核,对吗?毕竟它们只是操作系统中的隔离空间,所以它们既可以在Windows中也可以在Linux中?如果我错了,请纠正我。Linux映像是以这样一种方式构建的,它拥有运行我的java的一切,而且java是一种跨平台语言,所以它可以在Linux内核上运行,这是概念吗?
- 关于我在这里绘制的体系结构图-容器(操作系统中带有应用程序文件的隔离进程),在Linux容器的情况下,所有容器(多个容器)都在同一个WSL 2虚拟机上运行,对吗?
3条答案
按热度按时间1hdlvixo1#
首先,问得好。
我希望我能尽可能好地回答它。
那么,默认情况下,docker运行Linux容器,我们什么时候需要Windows容器呢?
你并不需要Windows容器。你应该总是考虑你的应用程序需要什么。例如,如果你在一个java应用程序上工作,你会拉一个java映像而不是整个主机操作系统。我唯一一次拉一个Windows映像是当我停靠一个只能在Windows上运行的ASP.NET应用程序时。
如何Linux容器可以运行我的java应用程序?它必须需要windows内核,对吗?
在Docker的上下文中:
Docker for Windows允许您模拟在Windows上运行Linux容器,但在其基础上创建了一个Linux VM,因此Linux容器仍在Linux上运行,而Windows容器仍在Windows上运行。
如果Docker容器驻留在由WSL2创建的轻量级实用程序VM中,它是否可以同时访问随附的Linux内核和Windows内核?
容器使用底层操作系统资源和驱动程序,因此Windows容器只能在Windows上运行,而Linux容器只能在Linux上运行。Docker for Windows允许您模拟Linux容器在Windows上运行,但在幕后创建了一个Linux VM,因此Linux容器仍然在Linux上运行,而Windows容器仍然在Windows上运行。
那么我在openjdk:8 image和windows nanoserver上的java应用程序有什么区别呢?
openJdk映像和windows nano服务器核心的区别是它们使用的非常基本的映像。openJdk可能使用一些非常裸露的unix操作系统作为基础,而nano服务器是一个完整的操作系统,也就是windows。
openjdk映像不需要Windows来运行,因为它是从linux构建的。Windows的Docker将使用wsL来运行。nanoserver将只能在Windows上运行(因为Windows映像只能在Windows上运行)。
那么Java是如何在Linux容器上运行的呢?我理解这个问题是“openjdk映像是如何在Linux和Windows上运行的?”
如果是这样的话,因为它使用一个linux操作系统作为它的基础映像,它可以默认在linux上运行。但是因为WsL2的存在,一个虚拟机被创建并模拟windows中的linux操作系统。这就是为什么我们可以在Windows的Docker上运行windows映像和linux映像。
我希望这能有所帮助,这里有一些来自问题的额外提示供您考虑。
1.当映像与操作系统的类型相同时,映像的性能始终最佳。这是因为当主机和容器的操作系统相同时,Docker将利用主机的资源,并且性能更好。
1.使用最适合目的的映像。不要仅仅为了运行java应用程序而使用整个操作系统映像。而是使用java映像。这适用于广泛的框架和语言。
阅读this这是学分的文章,如果你想阅读更多。
58wvjzkj2#
该图并不完全正确。Windows内核和承载WSL 2 KVM的轻量级VM都位于Hyper-V虚拟机管理程序之上。换句话说,WSL 2利用了Hyper-V。(另一种方法是仅使用Hyper-V,但在WSL 2中则更加无缝。)WSL 2使用docker-desktop作为主引导VM,并使用docker-desktop-data来存储映像和容器数据。9 p网络协议用于主机到访客和访客到主机的无缝文件访问:
https://wiki.qemu.org/File:9pfs_topology.png
这样,Docker命令既可以从Windows运行,也可以从安装在WSL 2下的发行版(如Ubuntu等)中运行。在这两种情况下,容器都在Linux下运行。这种体系结构的基本原理是Linux Docker不能安装在Hyper-V VM上,也不能安装在WSL 2 Linux中。
imzjd6km3#
你好你好
实际上,存在两种重要的虚拟机管理程序使用情形/类型:
a)Hyper-V是hypervisor(控制容器=虚拟机的软件),属于类型1,因此它直接在计算机= PC =硬件上工作(裸机):
在第一种类型中,Hypervisor直接控制硬件(它避免使用主机操作系统,因为控制权来自机器的BIOS)。这意味着不使用主机操作系统,但不意味着主机操作系统不存在!!!
b)虚拟机盒(VB)是管理程序类型2(重型软件)。因此VB通过主机操作系统(Host-OS)与机器一起工作:
因此,在最后一种情况下,硬件(PC-机器)的控制是繁重的,因为对机器= PC =硬件的控制是通过作为主机-OS的补充或第三部分=组件来实施的
还需要知道,容器=虚拟机(无论类型1或2)都有一个操作系统,但它被命名为OS-guest(fr.invite)。因此,在两种情况下(类型1和类型2),虚拟机管理程序都作为容器/虚拟机(前端)的后端工作。
有关详细信息,请阅读本教程/文章中的:
PS:一个虚拟机(VM)可以控制多个容器,如映像
或者使用谷歌图片搜索(firstly 3 images)
关于来自VM及其隔离容器的通信的另一种解释可以在这个article中找到。