古い.NETアプリケーションをDocker Windowsサーバーコンテナー( 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
リモートデスクトップクライアントを介してコンテナーに接続しようとすると、最初は問題ないようです。
ログがどこかで生成されるかどうかは本当にわかりません。
RDSの代わりに、TigerVNCのようなものが機能していれば、大丈夫でしょう。これまでにこのツールを試したことはありませんが、それでうまくいくようです。
Windowsコンテナーで実行されているGUIアプリケーションをどのように制御しますか?
イベントビューアでRDPクライアントのログを見つけることができます: "アプリケーションとサービスログ"\Microsoft\Windows\TerminalServices-ClientActiveXCore。ここに私のために言われていることがある:
RDPClient_SSL:TsSslEventInvalidStateに応答してTsSslStateDisconnectedからTsSslStateDisconnectedに移行するときにエラーが発生しました(エラーコード0x8000FFFF)。
RDP ClientActiveXが切断されました(理由= 2)
理由2は、クライアントによって閉じられたセッションです。
私のパラノイアは、Microsoftが戻ってイメージにパッチを適用して人々がDockerでRDPを使用できないようにしたが、明らかな何かを見落としているだけかもしれないと私に話しています。