在现代软件开发中,进程间通信(IPC)是一个常见的需求。MSMQ(Microsoft Message Queuing)是一种流行的技术,用于在不同进程和系统之间传递消息。然而,将使用MSMQ的应用程序迁移到Docker容器中一直是一项挑战,直到Windows容器支持MSMQ。本文将介绍如何配置MSMQ,创建测试应用程序,并将其部署到Docker容器中。
为了使Docker容器中的服务能够连接到远程MSMQ,需要设置特定的权限。确保想要连接的队列已经添加了“Everyone”和“ANONYMOUS LOGON”,并且赋予了“FullControl”权限。
为了测试MSMQ以及它在容器中的使用方式,决定编写一个简单快速的“虚拟”控制台应用程序。这个应用程序需要完全基于.NET Framework。应用程序非常简单,包含一个MSMQ读取器和一个MSMQ写入器。它将从一台远程机器上的一个队列读取消息,并将消息转发到另一台远程机器上的另一个队列。
为了简化操作,在应用程序中创建了一个快捷方式,可以从本地运行的控制台发送消息到远程MSMQ队列。然后,这些消息将被Docker容器内的控制台服务捕获。
Dockerfile将从Microsoft/windowsservercore基础镜像版本1803创建所需的镜像,并在容器中启用MSMQ Windows特性。(注意,如果运行容器的主机不是至少Windows 10版本1803或Windows Server 2016版本1803,这将不会成功。)将测试应用程序复制到容器中,并设置入口点。
FROM microsoft/windowsservercore:1803
RUN powershell -Command Enable-WindowsOptionalFeature -Online -FeatureName MSMQ-Server -All
COPY . C:\test
SHELL [
"powershell",
"-Command",
"$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"
]
WORKDIR C:\test\app
ENTRYPOINT C:\test\app\TestDockerMsmq.exe
在测试过程中,以交互方式启动了容器。这样,可以轻松地检查控制台应用程序的日志,因为消息是从MSMQ读取的。
队列名称是通过将卷挂载到容器上来收集的。这样,可以使用相同的容器再次执行测试,使用不同的队列。一个名为“queues.json”的文件在服务启动时加载,位于应用程序路径下的“Configs”文件夹中。例如“C:\test\app\Configs”。
这个文件简单地包含队列名称:
{
"ReadFromQueueName": "FORMATNAME:DIRECT=TCP:{your server ip}\\private$\\meta.in",
"WriteToQueueName": "FORMATNAME:DIRECT=TCP:{your server ip}\\private$\\meta.out"
}
一旦容器运行,将看到控制台应用程序连接到MSMQ队列开始读取。发送到这个队列的任何消息都将被捕获并转发。
消息是通过运行相同的应用程序并带有“/writeonly”参数发送的。当作为仅发送者运行时,需要更新“queues.json”文件。将“WriteToQueueName”队列名称设置为Docker容器中的服务将从中读取的相同名称...
就这样,通过Docker实现了MSMQ消息传递。
从最初的测试来看,MSMQ消息传递在WindowsDocker容器中运行相当顺畅。只要满足某些条件并就位: