如何在Windows主机用Vcxsrv实现Linux Docker容器多bash多GUI显示
解决方案
第一步:关闭多余Vcxsrv实例
你当前启动了两个Vcxsrv实例,所有GUI程序可以共享同一个X服务器实例,多开反而会导致DISPLAY变量匹配错误:
- 右键任务栏上显示
DESKTOP-Q:1.0 - 0 clients的Vcxsrv图标,选择Exit关闭,仅保留DESKTOP-Q:0.0的运行实例即可。
第二步:统一配置DISPLAY环境变量
docker exec新开的bash会话默认不会继承容器首次启动时传入的环境变量,是报错的核心原因,两种配置方式二选一:
方式1:exec进入容器时主动传入环境变量
执行exec命令时增加-e DISPLAY参数,替换为和第一个正常会话完全相同的DISPLAY值:
docker exec -it -e DISPLAY=<你的Windows宿主机IP>:0.0 <容器名称/容器ID> bash
方式2:进入容器后手动配置
进入新的bash会话后,先执行变量配置命令再启动GUI程序:
export DISPLAY=<你的Windows宿主机IP>:0.0 # 可执行echo $DISPLAY和第一个正常会话的输出对比,确保值完全一致
第三步:验证配置
配置完成后可先安装轻量GUI工具测试连接是否正常:
# 安装测试工具 apt update && apt install -y x11-apps # 运行测试命令,正常弹出窗口即为配置成功 xeyes
测试通过后再启动Rviz等ROS GUI程序即可正常运行。
长期配置优化
如果需要避免每次进入会话都手动配置,可以把DISPLAY变量写入容器内的bash配置文件:
echo 'export DISPLAY=<你的Windows宿主机IP>:0.0' >> /root/.bashrc
后续所有新的bash会话都会自动加载该变量。
注意事项
- Vcxsrv启动时必须勾选「Disable access control」选项,否则会拒绝来自Docker容器的连接请求
- 检查Windows Defender防火墙入站规则,确保Vcxsrv允许来自Docker虚拟网卡网段的入站连接
内容的提问来源于stack exchange,提问作者James Chong
相关产品推荐
相关产品推荐

