Windows Docker容器中ROS Noetic节点绑定IP遇OSError: [Errno 99]
问题分析
OSError: [Errno 99] Cannot assign requested address 本质是Docker容器默认网络与Windows物理网卡不在同一网络空间,容器内不存在192.168.33.30这个IP,导致socket绑定失败;同时容器网络无法直接访问雷达所在的192.168.33.x网段,所以ping不通雷达。
解决方案
方法1:使用Docker Host网络模式(优先推荐)
Host模式会让容器直接共享Windows宿主机的网络栈,容器可以直接使用宿主机的网卡IP,无需额外配置:
- 启动容器时添加
--network host参数:docker run -it --network host --name radar_ros_container osrf/ros:noetic-desktop-full - 进入容器后执行
ip addr,确认能看到Windows的192.168.33.30网卡 - 重新启动roslaunch,此时socket绑定
192.168.33.30可成功,同时能ping通雷达固定IP
方法2:自定义桥接网络并配置静态IP
若Host模式不适用,可创建与雷达同网段的自定义桥接网络:
- 打开Docker Desktop,进入Settings > Resources > Network,添加新桥接网络:
- 子网:
192.168.33.0/24 - 网关:与Windows网卡网关保持一致(通常为
192.168.33.1)
- 子网:
- 启动容器时指定该网络并分配静态IP:
docker run -it --network custom_radar_net --ip 192.168.33.31 osrf/ros:noetic-desktop-full - 修改
iwr_raw_rosnode的配置文件或代码,将socket绑定IP改为容器静态IP192.168.33.31,或改为0.0.0.0(绑定容器所有可用IP) - 测试
ping <雷达IP>,确认通信正常
方法3:排查Windows防火墙与路由规则
- 检查Windows防火墙是否允许UDP 4098端口(雷达通信常用端口)的流量通过,可临时关闭防火墙测试
- 查看Windows路由表,确认
192.168.33.0/24网段路由正确:
若存在错误路由,执行以下命令删除并添加正确路由:route printroute delete 192.168.33.0 route add 192.168.33.0 mask 255.255.255.0 192.168.33.1
代码临时适配
若不想调整网络配置,可修改iwr_raw_rosnode的socket绑定逻辑:
- 将代码中绑定的
"192.168.33.30"改为"0.0.0.0",让socket监听容器所有IP - 启动容器时添加端口映射,将Windows网卡的4098端口转发到容器:
docker run -it -p 192.168.33.30:4098:4098/udp osrf/ros:noetic-desktop-full
内容的提问来源于stack exchange,提问作者brad
相关产品推荐
相关产品推荐

