在带有 WSL2 的 windows 10 的 Docker 桌面中,docker 容器存在于何处以及 Linux 容器如何 运行 一个 java 应用程序,但不是windows 纳米服务器?

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?

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

我正在学习Docker,我对Docker如何在幕后工作有一些疑问。

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

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

第一个对第二个有效我得到了以下错误。

1903: Pulling from windows/nanoserver no matching manifest for Linux/amd64 in the manifest list entries

但是当我切换到 windows containers 时它起作用了。

  1. 那么我的 java 应用在 openjdk:8 图像上和 windows nanos 服务器有什么区别?
  2. 这些不需要 windows 内核到 运行 吗?
  3. java 东西 运行 在 Linux 容器上运行如何?

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

首先,问得好。

我希望我能像possible一样回答得最好。

So, by default docker runs Linux containers, when do we need windows containers?

不需要 windows 容器。您应该始终考虑您的应用程序需要什么。例如,如果您正在开发 java 应用程序,您将拉取 java 图像而不是整个 host OS。我唯一一次提取 windows 图像是在我 docker 化了一个只能在 windows 上 运行 的 ASP.NET 应用程序时。

How Linux Containers can run my java application? It must need the windows kernel, right?

在 docker 的上下文中:

Docker for Windows allows you to simulate running Linux containers on Windows, but under the hood a Linux VM is created, so still Linux containers are running on Linux, and Windows containers are running on Windows.

if the docker containers reside within the lightweight utility VM created by WSL2, can it access both the Linux kernel that it ships with and the Windows Kernel?

容器正在使用底层操作系统资源和驱动程序,因此 Windows 容器只能在 Windows 上 运行,而 Linux 容器可以 运行仅在 Linux 上。 Docker for Windows 允许您在 Windows 上模拟 运行ning Linux 容器,但在引擎盖下创建了一个 Linux VM,所以仍然Linux 个容器 运行 正在 Linux,Windows 个容器 运行 正在 Windows。

So what is the difference between my java app on openjdk:8 image and windows nanoserver?

openJdk 映像和 windows nano 服务器核心的区别在于它们使用的基础映像。 openJdk 可能使用一些非常简单的 unix os 作为基础,而 nanos 服务器是整个 os,即 windows.

Do these not require windows kernel to run? The openjdk image does not require windows to run as it is built from linux. Docker for windows will use the WsL to run. The nanoserver will only run on windows (as windows images can only run on windows).

How is the java thing running on Linux containers then? I understand this question to be "How does the openjdk image run on linux and windows?"

如果是这样,因为它使用 linux os 作为基础图像,它可以在 linux 上默认 运行。但是因为WsL2的存在,所以创建了一个VM,在windows中模拟了一个linuxOS。这就是为什么我们可以 运行 windows 图片和 Docker 上的 linux 图片用于 windows.

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

  1. 当图像与 OS 类型相同时,图像将始终表现最佳。这是因为docker会利用host的资源,当host和container相同os.
  2. 时性能会更好
  3. 使用最适合 purose 的图像。不要将整个 os 图像仅用于 运行 一个 java 应用程序。而是使用 java 图像。这适用于范围广泛的框架和语言。

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