在带有 WSL2 的适用于 Windows 10 的 Docker 桌面中,docker 容器在哪里以及 Linux 容器如何运行 java 应用程序,而不是 windows nanoserver?

如何解决在带有 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 内核,对吗?

enter image description here

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

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

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

阅读this如果您想阅读更多内容,请阅读此文章。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-