【问题标题】:In Docker Desktop for windows 10 with WSL2, where does docker containers live & how Linux containers can run a java app, but not windows nanoserver?在带有 WSL2 的 Windows 10 的 Docker Desktop 中,docker 容器在哪里以及 Linux 容器如何运行 java 应用程序,而不是 windows nanoserver?
【发布时间】:2021-08-01 06:16:42
【问题描述】:

我有 Windows 10 企业版,我已经安装了 Docker Desktop,启用了 WSL2 后端,并下载并安装了 Linux 内核更新包。

我正在学习 Docker,我对 Docker 的幕后工作方式有些疑问。

  • 我已经在windows上画了一个Docker的基本架构图 WSL2,这样对吗?
  • 每当我们创建一个新的 Linux 容器时,它都会在提供的同一个轻量级实用程序 VM 中创建 由 WSL2 提供?
  • 如果我们创建一个 windows 容器,它会在 windows os 上创建?
  • 这些容器可以在以下情况下访问 Windows 和 Linux 内核吗? 必需的?就像在 Linux container 中运行 java 应用程序一样,它需要 Windows 内核,对吧?

  1. 那么,默认情况下 docker 运行 Linux 容器,我们什么时候需要 windows 容器? 我可以通过使用容器化 java 应用程序 openjdk:8,但是我无法拉取 windows nanoserver 图像 运行 Linux 容器,它仅在我切换到 Windows 时才有效 容器。这里发生了什么?这是否意味着 openjdk:8 镜像是 Linux 镜像(我不知道怎么说),而 windows nanoserver 是 windows 镜像?
  2. Linux 容器如何运行我的 java 应用程序?它必须需要 windows内核对吧?
  3. 如果 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 时,它可以工作。

  1. 那么我在 openjdk:8 图像上的 java 应用程序和 windows nanoserver 之间有什么区别?
  2. 这些不需要 Windows 内核来运行吗?
  3. 那么 Java 是如何在 Linux 容器上运行的呢?

编辑:- 需要对此进行更多说明- 从评论部分复制问题。

  • 还有一件事,容器不会在 WSL2 中同时访问 Windows 和 Linux 内核,对吧?毕竟它们只是操作系统中的孤立空间,所以它们可以在 Windows 或 Linux 中吗?如果我错了,请纠正我。 Linux 映像的构建方式使其拥有运行我的 java 的一切,并且由于 java 是一种跨平台语言,因此它可以在 Linux 内核上运行,这是这个概念吗?

  • 关于我在这里制作的架构图——容器(操作系统中带有应用程序文件的隔离进程),如果是 Linux 容器,它们(多个容器)都运行在同一个 WSL2 虚拟机上,对吧?

【问题讨论】:

  • 我已经编辑了问题,需要对最后一部分和架构图进行更多说明。

标签: linux windows docker containers docker-desktop


【解决方案1】:

首先,好问题。

希望我能尽量回答。

那么,docker默认运行Linux容器,我们什么时候需要windows容器呢?

您不需要 windows 容器。您应该始终考虑您的应用程序需要什么。例如,如果您正在开发一个 java 应用程序,您将提取一个 java 映像而不是整个主机操作系统。我唯一一次拉取 Windows 映像是在我对只能在 Windows 上运行的 ASP.NET 应用程序进行 docker 化时。

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 允许您模拟在 Windows 上运行的 Linux 容器,但在底层创建了一个 Linux VM,因此 Linux 容器仍然在 Linux 上运行,而 Windows 容器在 Windows 上运行。

那么我在 openjdk:8 图像上的 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 操作系统作为其基础映像,它可以默认在 linux 上运行。但是因为存在 WsL2,所以创建了一个 VM,并在 windows 中模拟了一个 linux 操作系统。这就是为什么我们可以在 Docker for windows 上运行 windows 镜像和 linux 镜像。

我希望这会有所帮助,这里有一些额外的提示供您考虑。

  1. 当图像与操作系统的类型相同时,图像的性能总是最好的。这是因为 docker 会利用宿主机的资源,宿主机和容器是同一个操作系统时性能会更好。
  2. 使用最适合用途的图像。不要仅使用整个操作系统映像来运行 Java 应用程序。而是使用java图像。这适用于各种框架和语言。

阅读this如果您想阅读更多内容,请阅读这篇致谢文章。

【讨论】:

  • 感谢您的详细回答,它消除了我的疑虑,但是您没有说架构图,容器(带有应用程序文件的操作系统中的隔离进程),以防Linux containers所有这些(多个容器)都在同一个 WSL2 VM 上运行,对吧?
  • 还有一件事,容器不会同时访问WSL2 中的windowsLinux kernels 对吧?毕竟它们只是isolated spacesOS 中,所以它们可以在windowsLinux 中?如果我错了,请纠正我。 Linux 映像的构建方式使其拥有运行我的 java 所需的一切,并且由于 java 是一种跨平台语言,因此它可以在 Linux kernel 上运行,这是这个概念吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2017-09-16
  • 1970-01-01
  • 2017-02-01
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多