无法通过localhost以外的方式连接UrSim Docker容器
问题描述
我尝试运行ursim_e-series Docker容器,并通过ur_robot_driver与其连接。按照说明使用以下命令启动容器:
docker run --rm -it -p 5900:5900 -p 6080:6080 -v ${HOME}/.ursim/urcaps:/urcaps -v ${HOME}/.ursim/programs:/ursim/programs --name ursim --net ursim_net --ip 192.168.56.101 universalrobots/ursim_e-series
理论上可通过浏览器访问http://192.168.56.101:6080/vnc.html,但实际遇到以下问题:
- 容器启动成功,但只能通过
http://localhost:6080/vnc.html访问VNC,且无法看到机器人模拟器; - 使用
ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur5e robot_ip:=192.168.56.101连接时,无法找到该IP下的机器人。
环境信息
- Linux Ubuntu 22.04
- Docker Desktop 4.21.1(114176)
相关命令输出
ifconfig输出
enp7s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.13.136.72 netmask 255.255.254.0 broadcast 10.13.137.255 inet6 fe80::7943:8ae8:4740:e969 prefixlen 64 scopeid 0x20<link> ether 98:fa:9b:bb:d4:af txqueuelen 1000 (Ethernet) RX packets 2896104 bytes 772999648 (772.9 MB) RX errors 0 dropped 222 overruns 0 frame 0 TX packets 2516553 bytes 170849174 (170.8 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 251007 bytes 56927434 (56.9 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 251007 bytes 56927434 (56.9 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker network inspect -v ursim_net返回结果
[ { "Name": "ursim_net", "Id": "249333ce0b18910f29a69f69d5e9ff6229a14faaf4ff14f8d3c9cb51062d7c80", "Created": "2023-07-26T12:59:11.831234829Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.56.0/24", "Gateway": "192.168.56.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "42219db95f6fd3be6fac11943664582a99e34276239e47844fe74f0c6d5e1b1b": { "Name": "ursim", "EndpointID": "2485afa6b5ed449706dca7164dc736325e5a2dab2724666204e43d71f431df14", "MacAddress": "02:42:c0:a8:38:65", "IPv4Address": "192.168.56.101/24", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
解决方案
1. 核心问题分析
从网络检查结果看,容器已分配192.168.56.101,但主机网卡无该网段IP,导致主机无法直接访问容器IP。Docker Desktop在Linux环境下的自定义bridge网络默认不会将网段暴露给主机,同时容器内的机器人服务可能未正常绑定到指定IP。
2. 修复步骤
方法一:添加主机路由打通网段
在主机上添加路由规则,让主机能访问容器所在的192.168.56.0/24网段:
sudo ip route add 192.168.56.0/24 via $(docker network inspect ursim_net --format '{{range .IPAM.Config}}{{.Gateway}}{{end}}')
执行后先ping192.168.56.101确认连通,再尝试访问VNC和启动ROS2驱动。
方法二:改用host网络模式(最简方案)
修改容器启动命令,使用host网络模式让容器直接复用主机网络,无需端口映射和自定义IP:
docker run --rm -it --network host -v ${HOME}/.ursim/urcaps:/urcaps -v ${HOME}/.ursim/programs:/ursim/programs --name ursim universalrobots/ursim_e-series
此时访问VNC用http://localhost:6080/vnc.html,ROS2驱动连接时robot_ip填localhost即可。
方法三:检查容器内服务状态
进入容器确认VNC和机器人服务是否正常运行:
docker exec -it ursim bash # 查看VNC服务进程 ps aux | grep vnc # 查看机器人控制器进程 ps aux | grep urserver
若服务未启动,手动启动对应服务(可参考容器内的启动脚本)。
3. 验证流程
- 确认主机与容器IP能ping通;
- 访问VNC界面,确认机器人模拟器正常显示;
- 启动ROS2驱动,检查连接日志确认成功建立通信。
内容的提问来源于stack exchange,提问作者sniegs
相关产品推荐
相关产品推荐

