Docker X11 穿透方案

[编者的话] 当文字偶遇代码,当程序插上了翅膀,让分享成为我们彼此沟通的语言。我们期待可以构建这样一个平台让开发者们看到你们的智慧,挖掘你们的才华,让彼此在开源的路上不再孤独。“DaoCloud分享写作计划”已全面启动,欢迎投稿。


作者:Viz


前一阵子折腾 Ubuntu SDK,苦于该 SDK 仅供 Ubuntu 发行版使用,想要移植到 Gentoo 需要话费大量的时间和精力(依赖吖!)。于是我想到了能否用 Docker 进行 X11 穿透。

Google (不存在的网站) 了一番,网上并没有太多这方面的资料。于是自己汇集了一下并且做了些尝试,最终完成了 Viz-Parallel-Magic 这个黑魔法。

下面讲下它的原理:

想要进行 X11 穿透,首先要了解图形应用是怎么和 X Server 通讯的。这里我们只需要了解 display number 和与其对应的 Unix socket 以及 X Authority 这些知识。

X Server 在启动时需要一个 display number,默认为 :0 。同时在 /tmp/.X11-unix/ 目录下会生成一个对应的 Unix socket,比如 X0 。当图形应用启动时,会检查环境变量中的 DISPLAY ,并用对应的 Unix socket 与 X Server 通讯并用 $HOME/.Xauthority 去验证身份(当然可以被 XAUTHORITY 这个环境变量 override .Xauthority 的文件位置)。

所以我们在启动容器的时候需要设置 DISPLAY 这个环境变量,并且 mount /tmp/.X11-unix/ 这个目录(这样即便你 display number 不是 :0 也可以通过改变 DISPLAY 的值来切换到不同的 X Server)和 $HOME/.Xauthority 这个文件。

然后呢,就会得到这三段参数: -e DISPLAY=$DISPLAY-v /tmp/.X11-unix:/tmp/.X11-unix-v $HOME/.Xauthority:/root/.Xauthority 。加上它们你就可以在 Docker 中跑图形应用啦!

接下来 Viz-Parallel-Magic 做了一些小小的修改,让用户将容器和 Host 无缝对接起来,这样你可以在容器中访问自己 $HOME 目录中的文件,而且也可以在容器中获取 root 权限。同时 Viz-Parallel-Magic 提供了一套 Shell Script 写成的实用工具,方便管理定制好的镜像和基于它们的容器。

于是乎,你可以在自己的电脑里用 apt 安装个 Ubuntu 的 Firefox 然后再用 yum 安装个 Fedora 的 Firefox!(然而并没有什么用,不过对于 Ubuntu SDK 这种 platform specific 的应用还是有些用的~)

想看看效果? Here they are!


本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。


本文来自“DaoCloud分享写作计划”,这项计划旨在为开发者提供一个平台,分享使用Docker的心得体会和技术经验。DaoCloud将为文章作者提供一定的物质奖励,具体方式请访问:DaoCloud写作分享计划 ,欢迎Docker爱好者和DaoCloud用户踊跃投稿。