方法有很多, 目前我总计一个我自己尝试成功的方法,通过xpra。
Xpra可以看作是screen
或tmux
的图形版本,支持远程X11应用程序的显示和交互。
在远程服务器上,安装Xpra:
sudo apt-get install xpra
启动Xpra服务器会话:
xpra start :100
在本地机器上,安装并运行Xpra客户端,连接到远程服务器:
xpra attach ssh:user@remote-server:100
这个进程会一直运行,shell keep住重新启动其他shell
在远程服务器上,运行Docker容器命令,并设置DISPLAY
环境变量为Xpra显示:
export DISPLAY=:100
xhost +local:root
docker run -it --rm \
-e SDL_VIDEODRIVER=x11 \
-e DISPLAY=$DISPLAY \
--env='DISPLAY' \
--gpus all \
--ipc host \
--privileged \
--network host \
-p 8080:8081 \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v file_locations:/storage \
-v /weights:/weights \
openpcdet:cuda11 \
xfce4-terminal --title=openPCDet
如果需要映射一个桌面, 则需要安装类似Xfce4这种基于X11开发的桌面ui,这里的实例仅仅针对内部的窗口映射到host.
总结一下原理:
Xpra会话:
- 在远程服务器上启动一个Xpra会话,指定会话号,例如
:100
。Xpra会创建一个虚拟的X11显示,会话号用于标识这个会话。
- 在远程服务器上启动一个Xpra会话,指定会话号,例如
客户端连接:
- 在本地机器上使用Xpra客户端连接到远程服务器上的Xpra会话。这会将远程会话中的图形界面应用程序显示在本地机器上。
Docker容器配置:
- 在远程服务器上运行Docker容器时,通过设置环境变量
DISPLAY
为:100
,将Docker容器中的图形界面应用程序的显示输出到Xpra会话。 - 使用
xhost +local:root
命令允许本地root用户访问X服务器,这样Docker容器(通常以root用户身份运行)就可以访问X11显示。
- 在远程服务器上运行Docker容器时,通过设置环境变量
数据流:
- Docker容器中的图形界面应用程序通过Xpra会话显示在远程服务器上。
- Xpra会话将图形界面数据传输到本地机器上,显示在本地的Xpra客户端中