在Linux虚拟机中安装了docker,并且部署了一个自己的镜像,是一个用qt creator编写的c++程序,有图形化界面。
本篇博客的目的是如何在windows主机中使用putty和xming访问Linux虚拟机并且调用docker中的该图形化程序,并把界面返回到windows中
xming不用过多介绍,网上教程较多,配置很简单,只需要默认,点击下一步就可以了,需要注意的是要把“no access control”选中。
putty注意:虚拟机的网络模式必须设置为桥接方式,才能连接到虚拟机。找到X11这个选项,把Enable X11 forwarding打开。
安装运行ssh服务
$ sudo apt-get install openssh-server
虚拟机安装ssh客户端
$ sudo apt-get install openssh-client
虚拟机开启ssh服务
$ ps -e|grep ssh
服务器端配置:配置 /etc/ssh/sshd_config这个文件,设置X11Forwarding yes,源文件可能在行首加入了#号,代表注释,需要将#去掉。
重启ssh服务
$ cd /etc/init.d
$ ./ssh restart
客户端配置
$ vi /etc/ssh/ssh_config
将ForwardAgent、ForwardX11、ForwardX11Trusted设为yes,原文件应该是#注释掉了,确保将#去掉。
允许所有用户访问X11服务
$ sudo apt-get install xserver-xorg x11-xserver-utils
$ xhost +
确认windows的ip地址,在命令行执行ipconfig指令,查看本机地址
$ echo $DISPLAY
输出当前DISPLAY环境变量的值,一般情况下为:0。
修改DISPLAY环境变量的值
$ export DISPLAY=<本地机器地址>:0.0
可以通过运行xclock来验证一下
可以看到xclock的界面已经通过xming返回到windows上了
到这一步为止,在Windows主机上显示Linux虚拟机的配置工作就完成了,下面看看如何运行docker。
4.启动docker镜像的容器,运行gui程序
推荐一篇博文,是外国docker程序员的演讲稿,有人翻译成了中文, 对于docker 图形化程序的理解非常有用,附上链接
Docker运行GUI软件的方法
参考Jessie的方法,以libreoffice为例子,首先在虚拟机本地启动libreoffice,执行代码如下:
$ docker run -d -v /etc/localtime:/etc/localtime:ro -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY -v $HOME/slides:/root/slides -e GDK_SCALE -e GDK_DPI_SCALE --name libreoffice jess/libreoffice
其中的『-v /tmp/.X11-unix:/tmp/.X11-unix』参数就是将主机上X11的unix套接字共享到了容器里面。因为每个unix套接字实际上就是系统/tmp/.X11-unix目录下面依据套接字编号命名的一个特殊文件。
然后,我们来看如何在windows本机也能看到libreoffice,这时候就需要修改一下run的代码,Jessie给出的代码是
$ docker run -d \
-v /etc/localtime:/etc/localtime:ro \
--net=host \
-e DISPLAY=:10.0 \
-v $HOME/slides:/root/slides \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
--name libreoffice \
jess/libreoffice
一开始我原样照搬了这个代码,发现无法启动,后来发现,人家Jessie写的很清楚
DISPLAY改成什么呢?首先要看SSH登陆后得到的系统DISPLAY变量值,我这里看到的是『localhost:10.0』,主机的localhost:10.0到了容器里面就要变成0.0.0.0:10.0。原因不解释了,这个是Docker默认添加的映射。
所以说,要改成我们之前设置好的DISPLAY环境变量,正确的启动代码为
$ docker run -d -v /etc/localtime:/etc/localtime:ro --net=host -e DISPLAY=192.168.0.105:0.0 -v $HOME/slides:/root/slides -v $HOME/.Xauthority:/root/.Xauthority --name libreoffice jess/libreoffice
然后,我们在putty中尝试一下
至此就结束啦~~第一次po文,感谢大家,如果有错误欢迎指正~