首页 > 解决方案 > 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。"

还看到我们的证书已过期的消息。将改变这一点并提供更新。

标签: dockerdocker-composewindows-subsystem-for-linuxwindows-10-desktopdocker-desktop

解决方案


推荐阅读