在Windows 10的WSL2中的Docker桌面版本中,docker容器存放在哪里?Linux容器如何运行Java应用程序,但不支持Windows Nano Server?

8 浏览
0 Comments

在Windows 10的WSL2中的Docker桌面版本中,docker容器存放在哪里?Linux容器如何运行Java应用程序,但不支持Windows Nano Server?

我有Windows 10企业版,并安装了Docker Desktop,并启用了WSL2后端,并下载并安装了Linux内核更新包。\n我正在学习Docker,并对Docker在幕后的工作方式有一些疑问。\n

    \n

  • 我已经画了一个关于Windows上Docker与WSL2的基本架构图,这正确吗?
  • \n

  • 每当我们创建一个新的Linux容器时,它会在WSL2提供的同一个轻量级实用程序VM中创建吗?
  • \n

  • 如果我们创建一个Windows容器,它会在Windows操作系统上创建吗?
  • \n

  • 当需要时,这些容器能够同时访问Windows和Linux内核吗?比如在Linux容器中运行Java应用程序时,需要Windows内核,对吗?
  • \n

\n\"enter\n

    \n

  1. 所以,默认情况下Docker运行Linux容器,那么什么时候需要Windows容器?我可以使用openjdk:8来容器化一个Java应用程序,但是当我在运行Linux容器时,无法拉取Windows nanoserver镜像,只有切换到Windows容器时才能正常运行。这是怎么回事?这是否意味着openjdk:8镜像是一个Linux镜像,而Windows nanoserver是一个Windows镜像?
  2. \n

  3. Linux容器如何运行我的Java应用程序?它必须需要Windows内核,对吗?
  4. \n

  5. 如果Docker容器位于由WSL2创建的轻量级实用程序VM中,它可以同时访问它自带的Linux内核和Windows内核吗?
  6. \n

\n我使用默认的Linux容器模式,并尝试了以下两个命令。\n

    \n

  • docker run --platform=linux -d ubuntu /bin/sh -c \"while true; do echo hello world; sleep 1; done\"
  • \n

  • docker pull mcr.microsoft.com/windows/nanoserver:1903
  • \n

\n第一个命令成功了,但是第二个命令报错如下。\n1903: Pulling from windows/nanoserver no matching manifest for Linux/amd64 in the manifest list entries\n但是当我切换到windows容器时,它可以运行。\n

    \n

  1. 那么我的openjdk:8镜像和Windows nanoserver之间有什么区别?
  2. \n

  3. 它们不需要Windows内核来运行吗?
  4. \n

  5. 那么Java是如何在Linux容器上运行的呢?
  6. \n

\n编辑:- 需要更多关于这个问题的澄清 -\n从评论部分复制问题。\n

    \n

  • 还有一件事,在WSL2中,容器不能同时访问Windows和Linux内核,对吗?毕竟它们只是操作系统中的隔离空间,所以它们要么在Windows中,要么在Linux中?如果我理解有误,请纠正我。Linux镜像是以这样的方式构建的,它具备运行我的Java所需的一切,而Java是一种跨平台语言,因此它可以在Linux内核上运行,这是正确的概念吗?\n
  • \n

  • 关于我在这里制作的架构图 - 在Linux容器情况下,这些容器(操作系统中的隔离进程与应用程序文件)都在同一个WSL2 VM上运行,对吗?\n
  • \n

0
0 Comments

在Docker Desktop for Windows 10 with WSL2中,Docker容器位于哪里以及为什么Linux容器可以运行Java应用程序,但Windows NanoServer不能运行的原因。

在Docker Desktop for Windows 10 with WSL2中,Docker容器实际上是在WSL2子系统中运行的。WSL2是一个在Windows操作系统上运行Linux内核的兼容层。因此,Docker容器实际上是在WSL2子系统中的Linux环境中运行的。

Linux容器可以运行Java应用程序,而Windows NanoServer不能运行的原因是因为Linux容器中的Java应用程序是为Linux环境编译和构建的,而Windows NanoServer是一个轻量级的Windows Server Core镜像,不支持运行Linux应用程序。因此,如果要在Windows NanoServer中运行Java应用程序,需要使用Windows Server Core镜像。

解决方法是使用适用于Windows的Java Runtime Environment(JRE)或Java Development Kit(JDK)来构建和运行Java应用程序,以确保与Windows环境兼容。这样,就可以在Windows NanoServer中成功运行Java应用程序。

在Docker Desktop for Windows 10 with WSL2中,Docker容器位于WSL2子系统中的Linux环境中运行。Linux容器可以运行Java应用程序,但Windows NanoServer不能运行,因为它是一个轻量级的Windows Server Core镜像,不支持运行Linux应用程序。要在Windows NanoServer中运行Java应用程序,需要使用适用于Windows的JRE或JDK。

0
0 Comments

在Docker Desktop for Windows 10的WSL2中,Docker容器位于哪里?为什么Linux容器可以运行Java应用程序,但Windows NanoServer不行?

问题的出现原因是因为在WSL2中,Docker容器实际上是运行在一个轻量级虚拟机上的,而这个虚拟机是基于Hyper-V hypervisor的。换句话说,WSL2是利用了Hyper-V来运行的。(另一种选择是只使用Hyper-V,但是使用WSL2更加无缝。)WSL2使用docker-desktop作为主要的引导虚拟机,并使用docker-desktop-data来存储镜像和容器数据。为了实现主机到客户机和客户机到主机的文件访问的无缝连接,使用了9p网络协议。

这样一来,docker命令可以在Windows和在安装在WSL2下的发行版(如Ubuntu等)中都可以运行。在这两种情况下,容器都是在Linux下运行的。这种架构的理由是Linux Docker不能安装在Hyper-V虚拟机中,也不能在WSL2的Linux中安装。

解决方法是通过WSL2的架构,使用轻量级虚拟机来运行Docker容器,从而实现在Windows 10上运行Linux容器。这样一来,就可以在WSL2中安装Linux发行版,并在其中运行Java应用程序,而无法在Windows NanoServer中运行Java应用程序。

,WSL2利用了Hyper-V来运行轻量级虚拟机,使得在Windows 10上可以运行Linux容器。这种架构的好处是可以在WSL2中安装Linux发行版,并在其中运行各种应用程序,如Java应用程序。而无法在Windows NanoServer中运行Java应用程序的原因是Windows NanoServer不支持运行Linux容器。

代码示例:

# Run docker command in WSL2
docker run -it ubuntu bash

# Run docker command in Windows
docker run -it ubuntu bash

0
0 Comments

在Docker Desktop for Windows 10 with WSL2中,Docker容器位于哪里?为什么Linux容器可以运行Java应用程序,但Windows Nano Server不能?

首先,这是一个很好的问题。我希望我能尽可能好地回答。

所以,Docker默认运行Linux容器,那么什么时候需要Windows容器呢?实际上不需要Windows容器。你应该始终考虑你的应用程序需要什么。例如,如果你正在开发一个Java应用程序,你应该拉取一个Java镜像而不是一个完整的主机操作系统。我只有在将一个只能在Windows上运行的ASP.NET应用程序容器化时才拉取过Windows镜像。

Linux容器如何运行我的Java应用程序?它肯定需要Windows内核,对吗?在Docker的上下文中,Docker for Windows允许你在Windows上模拟运行Linux容器,但在幕后会创建一个Linux虚拟机,因此Linux容器仍然在Linux上运行,而Windows容器则在Windows上运行。

如果Docker容器位于WSL2创建的轻量级实用程序虚拟机中,它能够访问它附带的Linux内核和Windows内核吗?容器使用底层操作系统的资源和驱动程序,因此Windows容器只能在Windows上运行,Linux容器只能在Linux上运行。Docker for Windows允许你在Windows上模拟运行Linux容器,但在幕后会创建一个Linux虚拟机,因此Linux容器仍然在Linux上运行,而Windows容器则在Windows上运行。

那么我的openjdk:8镜像和Windows Nano Server之间有什么区别?openJDK镜像和Windows Nano Server的区别在于它们使用的基础镜像。openJDK可能使用了一个非常基本的Unix操作系统作为基础,而Nano Server则是一个完整的Windows操作系统。

它们是否不需要Windows内核来运行?openjdk镜像不需要Windows来运行,因为它是基于Linux构建的。Docker for Windows将使用WSL来运行。Nano Server只能在Windows上运行(因为Windows镜像只能在Windows上运行)。

那么Java程序是如何在Linux容器上运行的?我理解这个问题是在问"openjdk镜像在Linux和Windows上是如何运行的?"如果是这样,因为它使用了Linux操作系统作为基础镜像,所以它可以默认在Linux上运行。但是由于存在WSL2,会创建一个虚拟机并在Windows上模拟Linux操作系统。这就是为什么在Docker for Windows上可以运行Windows镜像和Linux镜像的原因。

我希望这些解答对你有所帮助,以下是一些额外的建议供你参考:

1. 当主机和容器的操作系统类型相同时,镜像的性能最好,因为Docker会充分利用主机资源,主机和容器的操作系统相同时性能更好。

2. 使用最适合目的的镜像。不要使用整个操作系统镜像来运行一个Java应用程序,而是使用Java镜像。这适用于各种框架和编程语言。

如果你想了解更多信息,可以阅读这篇文章:[链接](https://stackoverflow.com/questions/42158596)

感谢详细的回答,它解除了我的疑惑,但你没有提到架构图、容器(在操作系统中的隔离进程和应用程序文件)方面的内容。在Linux容器的情况下,它们全部(多个容器)在同一个WSL2 VM上运行,对吗?

还有一件事,在WSL2中,容器不能同时访问Windows和Linux内核,对吗?毕竟它们只是操作系统中的隔离空间,所以它们要么在Windows中,要么在Linux中,如果我理解有误,请纠正我。Linux镜像是以这种方式构建的,它具备运行我的Java所需的一切,而Java是一种跨平台语言,所以它可以在Linux内核上运行,这就是这个概念对吗?

0