使用Docker容器中的MSMQ进行进程间通信

在现代软件开发中,进程间通信(IPC)是一个常见的需求。MSMQ(Microsoft Message Queuing)是一种流行的技术,用于在不同进程和系统之间传递消息。然而,将使用MSMQ的应用程序迁移到Docker容器中一直是一项挑战,直到Windows容器支持MSMQ。本文将介绍如何配置MSMQ,创建测试应用程序,并将其部署到Docker容器中。

MSMQ队列设置

为了使Docker容器中的服务能够连接到远程MSMQ,需要设置特定的权限。确保想要连接的队列已经添加了“Everyone”和“ANONYMOUS LOGON”,并且赋予了“FullControl”权限。

测试应用程序和布局

为了测试MSMQ以及它在容器中的使用方式,决定编写一个简单快速的“虚拟”控制台应用程序。这个应用程序需要完全基于.NET Framework。应用程序非常简单,包含一个MSMQ读取器和一个MSMQ写入器。它将从一台远程机器上的一个队列读取消息,并将消息转发到另一台远程机器上的另一个队列。

为了简化操作,在应用程序中创建了一个快捷方式,可以从本地运行的控制台发送消息到远程MSMQ队列。然后,这些消息将被Docker容器内的控制台服务捕获。

代码和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容器中运行相当顺畅。只要满足某些条件并就位:

  • Windows主机至少是版本1803。
  • Windows Docker基础镜像至少是版本1803。
  • 在相关的MSMQ队列上设置了安全设置:Everyone和ANONYMOUS LOGON需要“Full Control”访问权限。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485