有没有一种方法可以通过远程桌面连接到正在运行的Windows Server容器?

29
我想在一个 Docker Windows Server 容器中运行一个旧的 .NET 应用程序 (https://hub.docker.com/r/microsoft/windowsservercore/)。
如果这个应用程序不需要 UI 的话,一切都很容易。但是它的 UI 做了很多事情,不能通过命令行或其他 API 来完成。
基本上,最完美的情况是通过 RDP 连接到这个正在运行的容器。
据我所知,它不过是在某个 TCP 端口 (默认为 3389) 上运行的服务 (TermService)。
但似乎 TermService 在 microsoft/windowsservercore 容器中没有运行。
我找到了一篇文章,展示了如何激活它: https://withinrafael.com/2018/03/09/using-remote-desktop-services-in-containers/ 基本上,我保留了相同的 Dockerfile,只改变了一些凭据。
#escape=`
FROM microsoft/windowsservercore:1709_KB4074588
RUN net user /add jerome
RUN net user jerome aDifficultPassword
RUN net localgroup "Remote Desktop Users" jerome /add
RUN net localgroup "Administrators" jerome /add
RUN cmd /k reg add "HKLM\System\CurrentControlSet\Control\Terminal Server" /v TemporaryALiC /t REG_DWORD /d 1

我使用以下命令启动容器:

{{用于启动容器的命令}}

docker run -it -p3389:3389 myimage powershell

当我连接到容器并输入一些PowerShell命令以列出正在运行的服务时,我可以看到TermService正在正常运行。这是我用来列出服务的命令。

Get-Service

当我列出已打开的TCP端口时,我可以看到3389正在被监听。这是我用来显示已打开端口的命令。

netstat -an

当我尝试通过远程桌面客户端连接容器时,刚开始看起来一切正常。
  • 它会要求我输入主机。
  • 然后要求我输入用户名和密码。
  • 如果我输入了错误的凭据,它会告诉我“凭证错误”,所以与服务器之间确实存在通信。
  • 如果我输入了正确的凭据,什么也不会发生。没有任何错误消息,但也没有显示屏...

我真的不知道是否在某个地方生成了日志。

如果像TigerVNC这样的工具能够正常工作,我就没关系了。我以前从未尝试过这个工具,但似乎它可以胜任这项工作。

您将如何控制在Windows容器中运行的GUI应用程序?


2
在“windowsservercore:latest”上甚至没有任何东西侦听端口3389... - Florian Koch
你好@FlorianKoch,你能解决这个问题吗?我正在尝试在Windows Server 2019 Docker容器上实现相同的效果,但是没有成功。 - Kiran Hegde
1
@KiranHegde 很遗憾,微软明确表示这是不可能的。远程桌面和容器存在一些问题,他们不打算支持这种情况(至少目前不支持)。 - Florian Koch
@FlorianKoch 谢谢。我能否以某种方式在我的主机系统上显示容器中安装的应用程序的GUI?例如,如果我在容器中安装了Visual Studio,我想在我的主机系统上打开它。据我所知,对于使用X Server的Linux容器来说,这是可能的。您是否知道Windows容器是否有类似的功能? - Kiran Hegde
@KiranHedge 我不认为有这样的东西,至少我没有找到。对于Linux系统,您可以打开一个端口将X从容器中导出,就像您为ssh -X会话所做的那样。您需要一个类似的Windows解决方案。 - Florian Koch
我的意思是,你可以尝试使用TeamViewer或其他工具,但我不知道它是否支持自动化,或者它是否能在容器中运行。 - Florian Koch
1个回答

8
您可以在事件查看器中找到有关RDP客户端的日志:“应用程序和服务日志”\Microsoft\Windows\TerminalServices-ClientActiveXCore。以下是我的情况:
1. 客户端已建立到服务器的多传输连接。 2. RDPClient_SSL:在响应于TsSslEventInvalidState(错误代码0x8000FFFF)时,从TsSslStateDisconnected过渡到TsSslStateDisconnected时遇到错误。 3. RDP ClientActiveX已断开连接(原因= 2)
原因2表示客户端关闭了会话。
我的偏执症告诉我,微软回来修补了镜像,以防止人们使用Docker与RDP,但是谁知道,也许我们只是忽略了一些明显的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接