Wayland环境下通过xwayland支持docker图形界面
Wayland环境下通过xwayland支持docker图形界面
写在前面
在之前的文章里已经讲解了怎么直接在docker中使用wayland支持图形界面(docker内外都使用wayland),文章链接:
使用Docker安装ROS2 (ros-humble) 并开启对Wayland的支持
指令为:
docker run -it --privileged \
-v <host_src>:<container_src>:rw \
-e XDG_RUNTIME_DIR=/tmp \
-e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \
-v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/tmp/$WAYLAND_DISPLAY \
-e QT_QPA_PLATFORM=wayland \
--name <local_container_name> <container>:<tag> <build_command>
然后就可以在docker中打开图形界面了。
然而,目前有一些软件不支持wayland、配置麻烦或者无法启动,所以本文介绍一种通过xwayland的方式在docker中使用X11渲染图形界面(docker外使用wayland,docker内使用X11)。
注意:这个方法使用了xwayland转换,一些软件可能依然无法使用,可以尝试其它方法如x11docker
Xwayland
xwayland可以理解为一个桥,可以在wayland上提供一个X11的接口。
xwayland的安装非常简单,可以自行搜索,对于大多数发行版都可以通过包管理器直接安装。
运行方式
说到这里可能有些抽象,到底在哪里用wayland,哪里用X11?一句话概括为:
主机(运行wayland)-> xwayland -> 主机:/tmp/.X11-unix -> docker:/tmp/.X11-unix -> docker(X11环境)
启动docker
xhost +
docker run -it --privileged \
--env=LOCAL_USER_ID="$(id -u)" \
-v <host_src>:<container_src>:rw \
-v /tmp/.X11-unix:/tmp/.X11-unix:ro \
-e DISPLAY=$DISPLAY \
--name=<local_container_name> <container>:<tag> <build_command>
-v <host_src>:<container_src>:rw
将主机的<host_src>
路径映射到docker的<container_src>
路径
<local_container_name>
是给容器命的名字
<container>:<tag>
是镜像的名称,可以通过docker images
查看,如px4io/px4-dev-ros-noetic
注意xhost +
是不安全的,可以通过配置用户组的方法只允许本地用户使用,感兴趣请自行查找
然后就可以使用了,比如我们打开gazebo
:
正常打开并显示。
可能出现的问题
权限错误
Authorization required, but no authorization protocol specified
这个错误可能并不是因为没有给予权限,而是没有使用正确的DISPLAY参数。
处理方法:
- 尝试
xhost +
打开权限,然后测试问题是否解决。如果解决了,考虑用户组的配置问题,比如当前用户是否加入docker用户组或者有没有指定--env=LOCAL_USER_ID="$(id -u)"
- 可能是没有指定
-e DISPLAY=$DISPLAY
或者配置错误,检查主机是不是有$DISPLAY参数,然后docker有没有设置成相同的参数,如果确认一致或者没有这个参数,可以尝试从1开始递增尝试DISPLAY参数,如-e DISPLAY=:1
X11应用模糊
这个问题严格意义上讲和本文的主题并没有关系,只是为了避免出现应用模糊之后费时研究docker或者wayland或者X11的问题,但是其实并不需要这么复杂(仅对于KDE plasma桌面,版本>=5.26)
在KDE plasma桌面下进入设置 -> Display and Monitor -> Display Configuration,Legacy Application (X11) 这一项要设置成Apply scaling themselves,如图:
由于并没有在其它桌面上测试,不清楚在其它桌面上需要配置哪些参数,如果读者测试成功,欢迎评论区分享。
更多推荐
所有评论(0)