首页 > 解决方案 > 在带有 WSL2 的 Windows 10 的 Docker Desktop 中,Docker 容器在哪里运行以及 Linux 容器如何运行 Java 应用程序,而不是 Windows Nanoserver?

问题描述

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

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

在此处输入图像描述

  1. 那么,docker默认运行Linux容器,我们什么时候需要windows容器呢?我可以使用 openjdk:8 将 java 应用程序容器化,但是当我运行 Linux 容器时,我无法拉取 windows nanoserver 映像,它仅在我切换到 Windows 容器时才有效。这里发生了什么?这是否意味着 openjdk:8 映像是 Linux 映像(我不知道怎么说),而 windows nanoserver 是 windows 映像?
  2. Linux 容器如何运行我的 java 应用程序?它必须需要windows内核,对吧?
  3. 如果 docker 容器驻留在 WSL2 创建的轻量级实用程序 VM 中,它可以访问它附带的 Linux 内核和 Windows 内核吗?

我有默认Linux container模式,我尝试了这两个命令。

第一个适用于第二个我收到以下错误。

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 容器上运行的呢?

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

标签: linuxwindowsdockercontainersdocker-desktop

解决方案


首先,好问题。

我希望我能尽可能地回答它。

那么,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 server 核心的区别是他们使用的基础镜像。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图像。这适用于广泛的框架和语言。

阅读文章 如果您想阅读更多内容,这是信用文章。


推荐阅读