docker + xrfb-run + vnc:Docker里开虚拟屏幕运行带GUI程序

进入一个平平无奇的ubuntu容器
docker run -it --rm -p5900:5900 ubuntu:20.04

安装X组件

apt update
apt install -y xserver-xorg
apt install xvfb
apt install x11vnc

以上,就安装完成了。。


以下,是简单示例

【GUI看表】

apt install x11-apps #安了这个就有 xclock 了

xvfb-run xclock #运行 xvfb-run 会自动为 xclock 创建一个虚拟屏幕 然后执行 xclock

这就是运行中了(你看,终端block在那)

怎么看表呢?

先开个新终端

ps -ef |grep auth #这是为了找Auth文件位置

显示:

root@13785a282294:/# ps -ef |grep auth
root        7417    7408  1 11:47 pts/0    00:00:00 Xvfb :99 -screen 0 1280x1024x24 -nolisten tcp -auth /tmp/xvfb-run.RCwemo/Xauthority
root        7449    5837  0 11:47 pts/1    00:00:00 grep --color=auto auth

上面的 /tmp/xvfb-run.RCwemo/Xauthority 就是Auth文件文件名每次都随机生成
上面的 Xvfb :99 这部分的:99 就是虚拟屏幕号 默认是99

启动vnc-server

x11vnc -display :99 -auth /tmp/xvfb-run.RCwemo/Xauthority  # 注意要用到上面查到的那个Auth文件路径

启动完了 x11vnc 默认监听端口是 5900

然后使用VNC客户端 比如:TightVNC

就能看表了!

感觉很空是吧,因为xvfb-run默认给了个 1280x1024 的屏幕 

修改启动参数指定想要的屏幕大小就可以了(还有色彩深度)

xvfb-run  --server-args="-screen 0 200x200x24" xclock

 以上,就是简单示例应该够用了


 

以下,是个稍微炫一点的简单示例:

用强化学习方法让机器学习怎么玩儿游戏的时候会用到GYM环境,以下是个简单的登月游戏运行示例,这样就可以在服务器上训练,同时还方便围观训练进度 。。

还是继续用上面那个docker容器

【Gym LunarLander-v2 围观示例】

先搞定基本环境 (ubuntu20.04 docker 镜像自带python3.8)

ln -s /usr/bin/python3 /usr/bin/python     # 这样就可以直接用python命令了。。

安装pip

apt install python3-pip

安装gym (安装过程报错,要先安swig : apt install swig

pip install gym[box2d]

然后就可以开干了

xvfb-run python  # 这样当你python里面需要用到屏幕界面的就可以在vnc上看到了

更直接的,弄个Gym的玩游戏演示demo程序展示效果

# test.py
import gym
env = gym.make("LunarLander-v2", render_mode="human")
env.action_space.seed(42)

observation, info = env.reset(seed=42)

for _ in range(1000):
    observation, reward, terminated, truncated, info = env.step(env.action_space.sample())

    if terminated or truncated:
        observation, info = env.reset()

env.close()

启动:

xvfb-run python test.py 

观察效果:(新终端,注意auth文件路径变了哈)

x11vnc -display :99 -auth /tmp/xvfb-run.l3kR51/Xauthority

 开vnc-client:

 


发现在远程云服务器上(我用的腾讯云),这个方法看起来一切正确但是VNC Client就是连不上,提示什么“目标积极拒绝”。。(我确认已经放通了5900端口 并且再另一个天翼云(别问我为什么那么多云服务器)的上用VNC Client 是可以连通(上面的截图就是再远程服务器上截图的,开始以为是办公楼网络限制,到家发现家里也一样)。。。)

所以找了一个折中的办法,或者乐观点想。。它可以不需要额外安装VNC客户端就可以开搞。。:

apt install xrdp 

安好了确认下服务是不是已经启动了

service xrdp status

是的,这个方案就是——安个 RDP 远程桌面服务再用它去连接VNC。。。这样就可以用windows自带的远程桌面( win+r    ->  mstsc)访问啦!!!!!!!!!!!

端口默认3389(不是5900了  启动docker 要改成 docker run -it --rm -p3389:3389 ubuntu:20.04)

连上后选vnc-any   地址直接127.0.0.1

 

 

又可以愉快看表了!!!!!!

 

posted @ 2022-10-14 12:32  LightingCui  阅读(2490)  评论(0编辑  收藏  举报