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

gazebo运行正常
正常打开并显示。

可能出现的问题

权限错误

Authorization required, but no authorization protocol specified

这个错误可能并不是因为没有给予权限,而是没有使用正确的DISPLAY参数。

处理方法:

  1. 尝试xhost +打开权限,然后测试问题是否解决。如果解决了,考虑用户组的配置问题,比如当前用户是否加入docker用户组或者有没有指定--env=LOCAL_USER_ID="$(id -u)"
  2. 可能是没有指定-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,如图:

KDE Settings
由于并没有在其它桌面上测试,不清楚在其它桌面上需要配置哪些参数,如果读者测试成功,欢迎评论区分享。