如何解决UaExpert连接Docker容器中OPC UA服务器超时问题?
问题根源分析
你碰到的BadTimeout报错,核心问题出在OPC UA服务器生成的端点URL上:服务器启动时自动绑定了容器的默认主机名(也就是那个随机的容器ID2e54ds688fd4),而这个容器ID在宿主机或者UaExpert所在的网络里是无法被解析的——哪怕你能ping通指定的静态IP192.123.0.32,UaExpert尝试访问opc.tcp://2e54ds688fd4:48010时,根本找不到对应的机器,自然会超时。
解决方案步骤
1. 修正容器启动命令,指定可解析的主机名
在启动容器时加上--hostname参数,把容器的主机名直接设为你指定的静态IP,这样服务器生成端点URL时就会用这个IP,而非容器ID:
docker run --net pa1net --ip 192.123.0.32 --hostname 192.123.0.32 -it pa1
2. 手动指定UaExpert的连接地址(快速临时方案)
如果不想重新启动容器,你可以跳过服务器输出的URL,直接在UaExpert里手动输入静态IP的端点地址:opc.tcp://192.123.0.32:48010。前提是容器内的服务器已经监听了0.0.0.0(所有网络接口),如果服务器只绑定了容器ID对应的主机名,这个方法可能不生效,这时候还是得用第一步的方案。
3. 检查端口连通性(额外验证)
虽然你能ping通容器IP,但可以再确认48010端口是否真的能被访问:
在宿主机上执行以下命令:
# 用telnet检查 telnet 192.123.0.32 48010 # 或者用nc命令(更直观) nc -zv 192.123.0.32 48010
如果端口不通,要么是容器内的防火墙限制了端口,要么是服务器本身没正确监听48010端口,这时候就得去容器里查服务器的启动日志,确认端口配置是否正确。
总结
你当前的启动命令缺少主机名指定,才导致服务器生成了不可用的端点URL。按上面的步骤调整后,用opc.tcp://192.123.0.32:48010在UaExpert里连接,应该就能成功建立会话了。
内容的提问来源于stack exchange,提问作者gegner1111

