在Docker中使用GUI环境,解决cannot connect to X server问题
CommentDocker 因为其部署、迁移方便而广为受到关注。我们使用 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
3RUN 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