如何解决在带有 WSL2 的适用于 Windows 10 的 Docker 桌面中,docker 容器在哪里以及 Linux 容器如何运行 java 应用程序,而不是 windows nanoserver?
我有 Windows 10 企业版,我已经安装了 Docker Desktop,启用了 WSL2 后端,并下载并安装了 Linux 内核更新包。
我正在学习 Docker,我对 Docker 在幕后的工作方式有一些疑问。
- 我已经绘制了 Windows 上 Docker 的基本架构图 WSL2,这是正确的吗?
- 每当我们创建一个新的 Linux 容器时,它都会在提供的相同轻量级实用程序 VM 中创建 通过 WSL2?
- 如果我们创建一个 windows 容器,它会在 windows 操作系统上创建吗?
- 这些容器可以同时访问 Windows 和 Linux 内核吗?
必需的?就像在
Linux container
中运行 Java 应用程序一样,它需要 Windows 内核,对吗?
- 所以,默认情况下 docker 运行 Linux 容器,我们什么时候需要 Windows 容器?我可以通过使用容器化 java 应用程序 openjdk:8,但是当我无法拉取 windows nanoserver 映像时 运行 Linux 容器,它仅在我切换到 Windows 时才有效 容器。这里发生了什么?这是否意味着 openjdk:8 映像是 Linux 映像(我不知道怎么说),而 windows nanoserver 是 Windows 映像?
- Linux Containers 如何运行我的 Java 应用程序?它必须需要 Windows 内核,对吗?
- 如果 docker 容器驻留在轻量级实用程序 VM 中 由 WSL2 创建,它可以访问它提供的 Linux 内核吗? 和 Windows 内核?
我有默认的 Linux container
模式,我尝试了这两个
命令。
- docker run --platform=linux -d ubuntu /bin/sh -c "while true; do echo 你好世界;睡眠 1;完成"
- docker pull mcr.microsoft.com/windows/nanoserver:1903
第一个为第二个工作,我收到以下错误。
1903: Pulling from windows/nanoserver no matching manifest for Linux/amd64 in the manifest list entries
但是当我切换到 windows containers
时它起作用了。
- 那么我在 openjdk:8 图像和 windows nanoserver 上的 java 应用程序有什么区别?
- 这些不需要 Windows 内核来运行吗?
- Java 是如何在 Linux 容器上运行的?
编辑:- 需要对此进行更多说明- 从评论部分复制问题。
-
还有一件事,容器不会在 WSL2 中同时访问 Windows 和 Linux 内核,对吗?毕竟它们只是操作系统中的隔离空间,所以它们可以在 Windows 或 Linux 中?如果我错了,请纠正我。 Linux 映像的构建方式使其拥有运行我的 java 的所有功能,并且由于 java 是一种跨平台语言,因此它可以在 Linux 内核上运行,这是概念吗?
-
关于我在这里制作的架构图 - 容器(操作系统中带有应用程序文件的隔离进程),如果是 Linux 容器,所有容器(多个容器)都运行在同一个 WSL2 VM 上,对吧?
解决方法
首先,好问题。
我希望我能尽可能地回答它。
那么,默认情况下 docker 运行 Linux 容器,我们什么时候需要 Windows 容器?
您不需要 Windows 容器。您应该始终考虑您的应用程序需要什么。例如,如果您正在开发一个 Java 应用程序,您将提取一个 Java 映像而不是整个主机操作系统。我唯一一次拉取 Windows 映像是在我对一个只能在 Windows 上运行的 ASP.NET 应用程序进行 docker 化时。
Linux Containers 如何运行我的 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 允许您模拟在 Windows 上运行 Linux 容器,但在后台创建了一个 Linux VM,因此 Linux 容器仍然在 Linux 上运行,而 Windows 容器则在 Windows 上运行。
那么我在 openjdk:8 image 上的 java 应用程序和 windows nanoserver 有什么区别?
openJdk 映像和 windows nano 服务器核心的区别在于它们使用的非常基础的映像。 openJdk 可能使用一些非常裸的 unix 操作系统作为基础,而 nanoserver 是一个完整的操作系统,即 windows。
这些不需要windows内核来运行吗? openjdk 映像不需要运行 windows,因为它是从 linux 构建的。 Docker for windows 将使用 WsL 来运行。 nanoserver 只能在 windows 上运行(因为 windows 图像只能在 windows 上运行)。
Java 是如何在 Linux 容器上运行的? 我理解这个问题是“openjdk 镜像如何在 linux 和 windows 上运行?”
如果是这样,因为它使用 linux os 作为其基础映像,所以它可以默认在 linux 上运行。但是因为 WsL2 存在,所以创建了一个 VM,并在 windows 中模拟了一个 linux 操作系统。这就是为什么我们可以在 Docker for windows 上运行 windows 镜像和 linux 镜像。
我希望这会有所帮助,这里有一些问题的额外提示供您考虑。
- 当映像与操作系统的类型相同时,映像将始终表现最佳。这是因为docker会利用宿主机的资源,宿主机和容器在同一个操作系统下性能会更好。
- 使用最适合用途的图片。不要仅仅为了运行 Java 应用程序而使用整个操作系统映像。而是使用 java 图像。这适用于各种框架和语言。
阅读this如果您想阅读更多内容,请阅读此文章。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。