windows主机调用Linux虚拟机中的docker gui程序并显示

引言:

在Linux虚拟机中安装了docker,并且部署了一个自己的镜像,是一个用qt creator编写的c++程序,有图形化界面。
本篇博客的目的是如何在windows主机中使用putty和xming访问Linux虚拟机并且调用docker中的该图形化程序,并把界面返回到windows中

1.配置putty+xming

xming不用过多介绍,网上教程较多,配置很简单,只需要默认,点击下一步就可以了,需要注意的是要把“no access control”选中。
putty注意:虚拟机的网络模式必须设置为桥接方式,才能连接到虚拟机。找到X11这个选项,把Enable X11 forwarding打开。

windows主机调用Linux虚拟机中的docker gui程序并显示_第1张图片

2.对ubuntu虚拟机进行配置

安装运行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 + 

3.配置Linux虚拟机的 $DISPLAY环境变量以及Xhost

确认windows的ip地址,在命令行执行ipconfig指令,查看本机地址

$ echo $DISPLAY

输出当前DISPLAY环境变量的值,一般情况下为:0。
修改DISPLAY环境变量的值

$ export DISPLAY=<本地机器地址>:0.0

用xhost检查一下授权情况
windows主机调用Linux虚拟机中的docker gui程序并显示_第2张图片

可以通过运行xclock来验证一下
可以看到xclock的界面已经通过xming返回到windows上了

windows主机调用Linux虚拟机中的docker gui程序并显示_第3张图片

到这一步为止,在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主机调用Linux虚拟机中的docker gui程序并显示_第4张图片

然后,我们来看如何在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中尝试一下

windows主机调用Linux虚拟机中的docker gui程序并显示_第5张图片

完美!!

至此就结束啦~~第一次po文,感谢大家,如果有错误欢迎指正~

你可能感兴趣的:(windows主机调用Linux虚拟机中的docker gui程序并显示)