带Windows容器支持的Docker部署TCP协议WCF服务问题咨询
在Windows容器中部署带net.tcp绑定的WCF服务
我之前帮朋友搞定过几乎一模一样的场景,给你整理了一套亲测可行的步骤:
1. 选对基础镜像
Windows容器对.NET Framework版本的兼容性要求很严格,一定要选和你的WCF服务所依赖的.NET Framework版本匹配的微软官方WCF容器镜像,比如:
- 如果用的是.NET Framework 4.8:
mcr.microsoft.com/dotnet/framework/wcf:4.8-windowsservercore-ltsc2019 - 如果是4.7.2:
mcr.microsoft.com/dotnet/framework/wcf:4.7.2-windowsservercore-ltsc2019
这个镜像已经预装了IIS、WCF组件和必要的服务,不用自己折腾环境配置。
2. 调整WCF服务的配置文件
容器里的服务不能绑定到固定的localhost或特定IP,得改成监听所有网卡,同时确保端口和后续容器暴露的端口一致。修改你的web.config里的<system.serviceModel>部分:
<system.serviceModel> <services> <service name="WcfServiceWebApp.Service1"> <!-- basicHttp绑定,监听所有网卡的80端口 --> <endpoint binding="basicHttpBinding" contract="WcfServiceWebApp.IService1" address="" /> <!-- net.tcp绑定,监听所有网卡的808端口,用你的noSecurityBind配置 --> <endpoint address="" binding="netTcpBinding" contract="WcfServiceWebApp.IService1" bindingConfiguration="noSecurityBind" /> <!-- MEX元数据,调整为监听80端口的mex路径 --> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior> <!-- 确保元数据发布开启 --> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <!-- 新增net.tcp绑定的基础地址(可选,但能避免地址歧义) --> <services> <service name="WcfServiceWebApp.Service1"> <host> <baseAddresses> <add baseAddress="http://0.0.0.0:80/" /> <add baseAddress="net.tcp://0.0.0.0:808/" /> </baseAddresses> </host> </service> </services> </system.serviceModel>
重点:把所有baseAddress里的IP改成0.0.0.0,让服务监听容器的所有网络接口。
3. 编写Dockerfile
在你的WCF服务发布目录旁边新建Dockerfile,内容如下:
# 指定基础镜像 FROM mcr.microsoft.com/dotnet/framework/wcf:4.8-windowsservercore-ltsc2019 # 设置容器内的工作目录为IIS默认站点根目录 WORKDIR /inetpub/wwwroot # 把本地发布好的WCF服务文件复制到容器里 COPY ./published-wcf-service/. . # 暴露需要的端口:80对应basicHttp和MEX,808对应net.tcp EXPOSE 80/tcp EXPOSE 808/tcp # 启动IIS服务(微软镜像自带的ServiceMonitor用来监控w3svc服务状态) ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]
注意:./published-wcf-service/是你本地用Visual Studio发布WCF服务后的输出目录(选择“文件系统”发布即可)。
4. 构建并运行容器
构建镜像
打开命令行,切换到Dockerfile所在目录,执行:
docker build -t wcf-tcp-service .
这里wcf-tcp-service是你给镜像起的名字,随便改。
启动容器
执行以下命令启动容器,同时映射端口:
docker run -d -p 80:80 -p 808:808 --name wcf-tcp-container wcf-tcp-service
-d:后台运行容器-p 80:80:把主机的80端口映射到容器的80端口(用于basicHttp和MEX)-p 808:808:把主机的808端口映射到容器的808端口(用于net.tcp)--name wcf-tcp-container:给容器起个好记的名字
5. 常见坑点排查
- Docker Desktop模式切换:确保Docker Desktop已经切换到Windows容器模式(右下角托盘图标右键切换)
- 端口冲突:如果主机的80或808端口被占用,换其他端口,比如
-p 8080:80 -p 8081:808,同时调整WCF配置里的端口 - Net.TCP Port Sharing Service:如果net.tcp连接失败,可以在Dockerfile里加一行启动这个服务:
RUN sc config NetTcpPortSharing start= auto && net start NetTcpPortSharing - 测试连接:可以用
docker inspect wcf-tcp-container查看容器的IP,然后用WCF客户端测试net.tcp://<容器IP>:808/Service1或者http://localhost:80/Service1
内容的提问来源于stack exchange,提问作者Patrice Cote
相关产品推荐
相关产品推荐

