最近在项目中遇到个问题,由于项目中用到了java调用C++的QT程序,而QT程序是需要依赖GUI的,因此将该服务打包成docker镜像后
再启动,发现一致报qt的相关错误,一直以为是qt的编译错误,花了几天时间,最终定位到,原来是docker应用中如果依赖GUI,就会导致
该问题。
原因简单理解就是:docker设计之初,就是一款无界面的服务应用
那如果我们要使用GUI怎么办呢?其实很简单,就是将宿主机的GUI,共享给docker服务即可。
思路原理:主流服务器都支持x11界面服务 x11支持(客户端/服务器模式),根据这个模式,可以将docker中需要显示的部分转换到宿主机来实现
实现步骤:
a) 判断是否安装x11服务器相关库,没安装,则需要先安装库程序
b) xhost + 开启权限,表示所有用户都可以访问宿主机的显示系统
c) 启动docker容器的时候增加以下配置命令即可
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-e GDK_SCALE \
-e GDK_DPI_SCALE \
如果宿主机无UI界面,其实很多服务器基本都是这种配置,对于这种情况,可通过如下操作来处理:
首先必须通过ssh -X root@ip的方式连接到服务器、但是这种模式,docker必须使用host网络模式,不能使用默认的bridge模式
但是由于我的docker容器较多,之间的访问也是直接使用了docker网桥,通过子网模式来相互访问的,因此改为host模式后,
需要将原来子网通信的ip修改为主机ip即可
启动docker容器的时候增加以下配置命令即可
-v /etc/localtime:/etc/localtime:ro \
--net=host \
-e DISPLAY=:10.0 \
-v $HOME/slides:/root/slides \
-e GDK_SCALE \
-e GDK_DPI_SCALE \