docker - Windows 上的 Docker Linux 容器 - 无法确定链接层地址/拒绝使用非规范名称访问文件
问题描述
问题:
在 Windows 10 的 Docker for Desktop 上的 Linux Container 中运行简单的 Web 服务应用程序时,该服务无法从同一网络上的外部数据库中提取数据。在 Docker Desktop 中的 Windows 容器中运行的同一项目按预期工作。
开发机器:Windows 10 - 版本 10.0.19041 Build 19041
Docker for Desktop 2.3.0.5(稳定)
在 Docker Desktop 中打开 Linux 容器
(尝试使用 HyperV - DockerDesktopVM 和 WSL2 与 Ubuntu)
Visual Studio 2019 构建 Docker 撰写文件
VPN'd进入 SQLserver 所在的网络
当尝试通过边缘浏览器访问 http://localhost:32768/api/dog/2 时,我只是得到“等待......”没有加载..
我在这一行的控制器上设置了一个断点:
var dog = await _context.dog.FindAsync(id);
并尝试进入它或捕获连接到数据库的异常,但永远不会产生异常。网站在尝试连接时卡住...
C:\Users\[user]\AppData\Local\Docker\log shows the following:
[20:31:37.685][VpnKit ][Warning] vpnkit.exe: ARP table has no entry for 172.20.0.2<br/>
[20:31:37.685][VpnKit ][Info ] vpnkit.exe: IP.output: could not determine link-layer address for local network (0.0.0.0/0) ip 172.20.0.2<br/>
[20:31:37.685][VpnKit ][Warning] vpnkit.exe: Could not find 172.20.0.2 on the local network<br/>
[20:31:58.517][GoBackendProcess ][Info ] rejecting access to file using non-canonical name microsoft.codeanalysis.csharp.expressionevaluator.expressioncompiler.ni.dll (canonical name is Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.ExpressionCompiler.ni.dll)<br/>
[20:31:58.518][GoBackendProcess ][Info ] rejecting access to file using non-canonical name microsoft.codeanalysis.csharp.expressionevaluator.expressioncompiler.ni.dll (canonical name is Microsoft.CodeAnalysis.CSharp.ExpressionEvaluator.ExpressionCompiler.ni.dll)<br/><br/>
....edited for brevity...lots of these rejecting access messages<br/><br/>
[20:32:30.931][VpnKit ][Warning] vpnkit.exe: ARP table has no entry for 172.20.0.2
[20:32:30.931][VpnKit ][Info ] vpnkit.exe: IP.output: could not determine link-layer address for local network (0.0.0.0/0) ip 172.20.0.2
[20:32:30.931][VpnKit ][Warning] vpnkit.exe: Could not find 172.20.0.2 on the local network
[20:32:30.931][VpnKit ][Warning] vpnkit.exe: Error sending TCP packet via IP: no route to destination: no response for IP on local network
172.20.0.2
是 Docker 容器 IPv4Address。
192.168.65
是在 Docker Desktop 的 Docker 资源设置中定义的子网。
一段时间后,这会出现在日志中:
1:20.846][VpnKit ][Warning] vpnkit.exe: TCP 192.168.65.3:40000 > [IP of external sqlserver]:1433 closing flow due to idle port disconnection<br/>
[20:41:20.851][VpnKit ][Warning] vpnkit.exe: TCP 192.168.65.3:39990 > [IP of external sqlserver]:1433 closing flow due to idle port disconnection<br/>
[20:41:20.852][VpnKit ][Warning] vpnkit.exe: TCP 192.168.65.3:39964 > [IP of external sqlserver]:1433 closing flow due to idle port disconnection<br/>
使用wireshark,我可以看到外部SQL服务器的UDP和一个ACK返回,我可以从运行应该连接到它的应用程序的容器内ping SQLserver。但是纳达。没有数据返回到控制器。
无论我是否使用 Ubuntu 运行 HyperV VM 或 WSL2,我都会得到相同的结果。
我使用 Docker Compose 构建了这个相同的项目,但对于 Windows,将 Docker 切换到桌面到 Windows 容器,我很成功。简单的来回发生,我在浏览器中取回数据。
任何人都知道我在这里可能缺少什么或在我的实现中配置错误?很高兴提供更多日志/代码示例。
更新
这似乎表明 docker 和我们正在使用的 SQLserver 之间不兼容。它很旧,当从 Linux 容器进行连接尝试时,我在事件查看器中看到 SCHANNEL 致命错误。但一切都在 Windows 容器中运行。
“从远程客户端应用程序接收到 TLS 1.2 连接请求,但服务器不支持客户端应用程序支持的密码套件。SSL 连接请求失败。
已生成致命警报并将其发送到远程端点。这可能会导致连接终止。TLS 协议定义的致命错误代码为 40。Windows SChannel 错误状态为 1205。"
还看到我们的证书已过期的消息。将改变这一点并提供更新。
解决方案
推荐阅读
- types - 如何更改 jupyter notebook 的默认主题(jt-r)的字体大小和类型?
- javascript - 另一个函数中的Javascript异步函数
- c# - 如何检查子字符串是否是引号
- c++ - 右值会默默衰减吗?
- reactjs - 如何根据滚动位置使用 css 动画来执行此操作?
- database - TDengine 子查询核心转储
- visual-studio - 谷歌云 KMS/HSM 证书
- azure-devops - 如何删除 Azure Pipelines 中的旧程序集工件?
- shell - 如何使用 sed 将以“/”开头的单词的每一行中的最后一个实例大写?
- icons - 如何将图标添加到 docusaurus 侧边栏组或项目