Docker 因为其部署、迁移方便而广为受到关注。我们使用 DockerFile 进行环境搭建与配置,用户只需要下载 Docker 并安装,下拉镜像docker pull TheImage即可仿佛下载了一个已经配置好的虚拟环境,然后docker run 即可实现程序。
可当它处理GUI程序的时候就不那么方便,如果直接执行GUI程序会得到“cannot connect to X server”错误。因为 Docker 程序也像在另一个虚拟机一样,无法直接输出图像到宿主的显示器,而是需要在某个隧道下进行 X 传输。

关于X服务器/X协议可以看这个介绍

解决方法

1. 使用 ssh 隧道进行 X 传输

用过 ssh 肯定知道加上-X参数后可以让所访问的主机的GUI程序界面也经由SSH隧道传输到自己的主机上。 同样的,Docker 容器内的系统也可以开启SSH服务,并使宿主机通过SSH访问容器,这样只需要 ssh -X localhost:port 即可。

比如使用 tutum/ubuntu 自带ssh服务,映射好端口(比如2222)后,即可使用 ssh 访问。
这样的好处是利用 ssh 隧道传输图形内容,而且使用 ssh 把 Docker 当虚拟机使用也非常方便。

2. 设置使用 volume 挂载宿主 x11

上述方法虽然方便,但是当我们只想把 Docker 容器当成一个 GUI 软件使用时,就会觉得用 ssh 访问非常不舒服,使用软件时需要开启守护的容器、然后用 ssh 访问容器,用完后还要手动停止容器。 这样就不像是在使用软件,而是真的使用一个虚拟机。 起不到“随用随开”的效果。

解决方法是

1
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY TheImage

使用 volume 将宿主机遇容器里的 x11 连接起来 并设置 DISPLAY 环境变量。

需要注意的是,这种方法要求容器内的使用用户不得是 root。所以在写 DockerFile 的时候可以加上

1
2
3
RUN useradd -m myuser
...
USER myuser

其他方法

VNC 代理 http://dockerfile.github.io/#/ubuntu-desktop
lxc 容器 https://stgraber.org/2014/02/09/lxc-1-0-gui-in-containers/

参考地址

http://stackoverflow.com/questions/24095968/docker-for-gui-based-environments